সতর্কতার সাথে পর্যালোচনা করার পরে, আমি এই থ্রেডের মধ্যে এটি আরও পরিষ্কার সমাধান হিসাবে প্রস্তাব করছি:
$("input").focus(function(){
$(this).on("click.a keyup.a", function(e){
$(this).off("click.a keyup.a").select();
});
});
সমস্যাটি:
এখানে কিছুটা ব্যাখ্যা দেওয়া হল:
প্রথমে আসুন, ইভেন্টগুলির ক্রমটি একবার দেখে নেওয়া যাক আপনি যখন কোনও ক্ষেত্রের মধ্যে মাউস বা ট্যাব করেন।
আমরা প্রাসঙ্গিক ইভেন্টগুলি এর মতো লগ করতে পারি:
$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
function(e) { console.log(e.type); });
দ্রষ্টব্য : আমি এই সমাধানটি ব্যবহারের click
পরিবর্তে mouseup
ইভেন্ট পাইপলাইনে পরে ঘটে বলে মনে করেছি এবং @ জোকির মন্তব্য অনুযায়ী ফায়ারফক্সে কিছু সমস্যা সৃষ্টি করছে বলে মনে হচ্ছে
কিছু ব্রাউজারগুলি ইভেন্টগুলি mouseup
বা click
ইভেন্টগুলির সময় কার্সারকে অবস্থান করার চেষ্টা করে । এটি বোঝা যায় যেহেতু আপনি ক্যারেটটি এক অবস্থানে শুরু করতে এবং কিছু পাঠ্যকে হাইলাইট করার জন্য টানতে পারেন। যতক্ষণ না আপনি প্রকৃতপক্ষে মাউসটি উত্তোলন করেন ততক্ষণ এটি ক্যারেটের অবস্থান সম্পর্কে কোনও পদবী তৈরি করতে পারে না। সুতরাং হ্যান্ডেলগুলি focus
এমন ফাংশনগুলি খুব তাড়াতাড়ি প্রতিক্রিয়া জানাতে ব্যর্থ হয় যা ব্রাউজারটিকে আপনার অবস্থানকে ওভাররাইড করতে দেয়।
তবে ঘষামাজাটি হ'ল আমরা সত্যই ফোকাস ইভেন্টটি পরিচালনা করতে চাই। এটি আমাদের প্রথমবারের মতো কেউ ক্ষেত্রের মধ্যে প্রবেশ করেছে তা জানতে দেয়। এই বিন্দুর পরে, আমরা ব্যবহারকারীর নির্বাচনের আচরণকে ওভাররাইড করা চালিয়ে যেতে চাই না।
সমাধান:
পরিবর্তে, focus
ইভেন্ট হ্যান্ডলারের মধ্যে, আমরা দ্রুত click
( keyup
আগুনে চলে যাওয়া) ইভেন্টগুলিতে (ক্লিক ইন) এবং (ট্যাব ইন) ইভেন্টগুলির জন্য শ্রোতাদের দ্রুত সংযুক্ত করতে পারি ।
দ্রষ্টব্য : কোনও ট্যাব ইভেন্টের কীআপটি আগের ইনপুট ক্ষেত্রে নতুন ইনপুট ক্ষেত্রে আসলে আগুন দেবে
আমরা কেবল একবার ইভেন্টটি চালাতে চাই। আমরা ব্যবহার করতে পারি .one("click keyup)
, তবে এটি প্রতিটি ইভেন্টের ধরণের জন্য ইভেন্ট হ্যান্ডলারটিকে একবার কল করবে । পরিবর্তে, মাউসআপ বা কীআপ উভয়ই চাপ দেওয়া মাত্রই আমরা আমাদের ফাংশনটি কল করব। আমরা প্রথমে যা করব, তা হ'ল উভয়ের জন্য হ্যান্ডলারগুলি সরিয়ে দেওয়া। এইভাবে আমরা ট্যাবড করেছি বা মোআউট করেছি তাতে কিছু যায় আসে না The ফাংশনটি ঠিক একবার সম্পাদন করা উচিত।
দ্রষ্টব্য : বেশিরভাগ ব্রাউজারগুলি প্রাকৃতিকভাবে কোনও ট্যাব ইভেন্টের সময় সমস্ত পাঠ্য নির্বাচন করে থাকে, তবে অ্যানিমেটেডিফ হিসাবে উল্লেখ করা হয়েছে , আমরা এখনও keyup
ইভেন্টটি পরিচালনা করতে চাই , অন্যথায় mouseup
ইভেন্টটি আমরা ট্যাবড করে যে কোনও সময় ঘিরে থাকবে We শ্রোতাদের ছাড়াই আমরা বাছাই প্রক্রিয়া করার সাথে সাথে।
select()
ব্রাউজারটি নির্বাচন করার পরে এখন আমরা কল করতে পারি যাতে আমরা ডিফল্ট আচরণকে ওভাররাইড করতে নিশ্চিত sure
অবশেষে, অতিরিক্ত সুরক্ষার জন্য, আমরা যোগ করতে পারেন ঘটনা নামব্যবধান করতে mouseup
এবং keyup
ফাংশন তাই .off()
পদ্ধতি অন্য কোনো শ্রোতাকে যে খেলা হতে পারে মুছে যায় না।
আইই 10+, এফএফ 28+, এবং ক্রোম 35+ এ পরীক্ষিত
বিকল্পভাবে, আপনি যদি কোনও ফাংশনonce
দিয়ে jQuery প্রসারিত করতে চান যা কোনও সংখ্যক ইভেন্টের জন্য ঠিক একবার গুলি চালায় :
$.fn.once = function (events, callback) {
return this.each(function () {
var myCallback = function (e) {
callback.call(this, e);
$(this).off(events, myCallback);
};
$(this).on(events, myCallback);
});
};
তারপরে আপনি কোডটি আরও এভাবে সরলীকৃত করতে পারেন:
$("input").focus(function(){
$(this).once("click keyup", function(e){
$(this).select();
});
});