Dikkatli bir şekilde inceledikten sonra, bu konu içinde çok daha temiz bir çözüm olarak öneriyorum:
$("input").focus(function(){
$(this).on("click.a keyup.a", function(e){
$(this).off("click.a keyup.a").select();
});
});
Sorun:
İşte biraz açıklama:
İlk olarak, fareyi bir alana getirdiğinizde veya bir alana sektiğinizde olayların sırasına bakalım.
Bunun gibi tüm ilgili olayları kaydedebiliriz:
$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
function(e) { console.log(e.type); });
Not : Bu çözümü daha sonra etkinlik kanalında click
olduğu mouseup
gibi kullanmak üzere değiştirdim ve @ Jocie'nin yorumuna göre firefox'ta bazı sorunlara neden oluyor gibi görünüyordu
Bazı tarayıcılar mouseup
veya click
olayları sırasında imleci konumlandırmaya çalışır . Düzeltmeyi bir konumda başlatmak ve metni vurgulamak için sürüklemek isteyebileceğinizden bu mantıklıdır. Fareyi gerçekten kaldırıncaya kadar şapka konumu hakkında bir atama yapamaz. Böylece, işleyen işlevler focus
çok erken yanıt vermek için kaderlenir ve tarayıcı konumlandırmanızı geçersiz kılar.
Ancak ovmak, odak olayını gerçekten ele almak istediğimizdir. Birinin alana ilk kez girdiğini bize bildirir. Bu noktadan sonra, kullanıcı seçim davranışını geçersiz kılmaya devam etmek istemiyoruz.
Çözüm:
Bunun yerine, focus
olay işleyicisine, ateş etmek üzere olan click
(tıklama) ve keyup
(sekme girişi) etkinlikleri için dinleyicileri hızla ekleyebiliriz .
Not : Bir sekme olayının klavyesi aslında bir öncekinde değil, yeni giriş alanında tetiklenir
Etkinliği sadece bir kez başlatmak istiyoruz. Kullanabiliriz .one("click keyup)
, ancak bu her olay türü için olay işleyiciyi bir kez çağırır . Bunun yerine, mouseup veya keyup tuşuna basıldığında işlevimizi arayacağız. Yapacağımız ilk şey, her ikisi için işleyicileri kaldırmaktır. Bu şekilde sekmeli veya fareyle uğraştığımız farketmez. İşlev tam olarak bir kez yürütülmelidir.
Not : Çoğu tarayıcı doğal olarak bir sekme etkinliği sırasında tüm metni seçer, ancak animatedgif'in belirttiği gibi , yine de keyup
etkinliği işlemek isteriz , aksi takdirde sekme mouseup
yaptığımız her seferinde etkinlik hala devam eder. Her ikisini de dinleyebiliriz. seçimi işleme koyar koymaz dinleyicileri devre dışı bırakın.
Şimdi, select()
tarayıcı seçimini yaptıktan sonra arayabiliriz , böylece varsayılan davranışı geçersiz kılacağız.
Son olarak, ekstra koruma için, ve işlevlerine olay ad alanları ekleyebiliriz , böylece yöntem oyundaki diğer dinleyicileri kaldırmaz.mouseup
keyup
.off()
IE 10+, FF 28+ ve Chrome 35+ sürümlerinde test edilmiştir
Alternatif olarak, jQuery'yi herhangi bir sayıda olay için tam olarak bir kez tetiklenecek adlıonce
bir işlevle genişletmek istiyorsanız :
$.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);
});
};
Sonra kodu daha da basitleştirebilirsiniz:
$("input").focus(function(){
$(this).once("click keyup", function(e){
$(this).select();
});
});