Safari ve Chrome'da çalışmayan jQuery kullanarak odakta metin seçme


85

Firefox ve IE'de çalışan, ancak Chrome ve Safari'de başarısız olan (hata yok, sadece çalışmıyor) aşağıdaki jQuery koduna sahibim ( bu soruya benzer ). Bir geçici çözüm için herhangi bir fikriniz var mı?

$("#souper_fancy").focus(function() { $(this).select() });

İPad / iPhone safarisinde tam davranış istiyorum. Bu, iPod / iPhone tarayıcılarında çalışmıyor. bir ipucu. Aşağıdaki kabul edilen yanıt yalnızca Masaüstü tabanlı Chrome / safari içindir.
Anand

5
Not: Burada kabul edilen cevap, sorunun yalnızca yarısını çözer. Seçimin çalışmasını sağlar, ancak sonraki tıklamalarla seçimi kaldırmayı zorlaştırır. Daha iyi bir çözüm burada bulunabilir: stackoverflow.com/questions/3380458/…
SDC

Yanıtlar:


188

Seçimin seçilmemesine neden olan onmouseup olayıdır, bu nedenle eklemeniz gerekir:

$("#souper_fancy").mouseup(function(e){
    e.preventDefault();
});

3
Hata ile ilgili daha fazla referans: code.google.com/p/chromium/issues/detail?id=4505
Rajat

Prototip kullanarak aynı şeyi nasıl başarabilirim?
tehfink

Ayrıca 'tıklama' olayına bağlamayı deneyebilir ve iki bağlama yapmak zorunda kalmayabilirsiniz.
uglymunky

@uglymunky Yaptığınız şeye bağlı olarak, tıklama olayına bağlanmak her durumda işe yaramayacaktır - sonuçta, bir giriş alanı seçmek için üzerine tıklamaktan başka bir yol vardır ve bunların da çalışmasını istiyorsunuz (örneğin, içine sekme)
Tacroy

2
İPad / iPhone safarisinde tam davranış istiyorum. Bu, iPod / iPhone tarayıcılarında çalışmıyor. bir ipucu.
Anand

25
$('#randomfield').focus(function(event) {
    setTimeout(function() {$('#randomfield').select();}, 0);
});

3
Android üzerinde çalışan bir PhoneGap uygulaması için form alanında metin seçmeye çalışıyorsanız bu en iyi cevaptır. Bu, kullanıcıya metnin seçildiğine dair görsel bir gösterge verirken, kabul edilen cevap vermez.
BallisticPugh

4

Bu, input type = "text" öğeleri için iyi çalışır. #Souper_fancy ne tür bir unsurdur?

$("#souper_fancy").focus(function() {
    $(this).select();
});

bu bir tür = "metin" öğesidir. $ ("İnput [type = text]") da denedim. Hala Safari'de jQuery 1.3.2 ile çalışmıyor.
user140550

3

Sadece mouseup üzerinde varsayılanı engellemek, metin seçiminin her zaman AÇIK olmasına neden olur. MOUSEUP olayı, metin seçimini temizlemekten sorumludur. Ancak, varsayılan davranışını engelleyerek, fareyi kullanarak metnin seçimini kaldıramazsınız.

Bunu önlemek ve metin seçiminin tekrar çalışmasını sağlamak için, FOCUS'da bir bayrak ayarlayabilir, MOUSEUP'tan okuyabilir ve gelecekteki MOUSEUP olaylarının beklendiği gibi çalışması için sıfırlayabilirsiniz.

$("#souper_fancy").focus(function() {
    $(this).select();

    //set flag for preventing MOUSEUP event....
    $this.data("preventMouseUp", true);
});

$("#souper_fancy").mouseup(function(e) {
    var preventEvent = $this.data("preventMouseUp");

    //only prevent default if the flag is TRUE
    if (preventEvent) {
        e.preventDefault();
    }

    //reset flag so MOUSEUP event deselect the text
    $this.data("preventMouseUp", false);
});

1

Bu, IE, Firefox, Chrome, Safari ve Opera'da seçmek için çalışırken, Firefox, Chrome ve Safari'de ikinci kez tıklayarak düzenlemenize izin vermez. Tam olarak emin değilim, ancak bence bu, alan zaten odaklanmış olsa bile, bu 3 tarayıcının bir odak olayını yeniden yayınlamasından kaynaklanıyor olabilir, dolayısıyla imleci gerçekten yerleştirmenize asla izin vermez (tekrar seçiyorsunuz), oysa IE'de ve Opera öyle görünüyor ki, bunu yapmıyor, bu yüzden odak olayı tekrar ateşlenmedi ve böylece imleç yerleştirildi.

Bu Yığın gönderisinde bu sorunu olmayan ve tüm tarayıcılarda çalışan daha iyi bir düzeltme buldum .


1

Bu, Chrome'da da çalışmalıdır:

$("#souper_fancy").focus(function() {
    var tempSouper = $(this);
    setTimeout(function(){
        tempSouper.select();
    },100);
});

Lütfen OP'nin sorunu neden gördüğüne ve çözümünüzün sorunu çözdüğüne dair yapıcı geri bildirim eklemeyi düşünün.
Mirko Adari

1

SetTimeout kullandığınızda titreme olduğu için, olay tabanlı başka bir çözüm vardır. Bu şekilde, "odak" olayı "mouseup" olayını ekler ve olay işleyicisi kendini yeniden ayırır.

    function selectAllOnFocus(e) {
    if (e.type == "mouseup") { // Prevent default and detach the handler
        console.debug("Mouse is up. Preventing default.");
        e.preventDefault();
        $(e.target).off('mouseup', selectAllOnFocus);
        return;
    }
    $(e.target).select();
    console.debug("Selecting all text");
    $(e.target).on('mouseup', selectAllOnFocus);
}

Ardından ilk etkinliği aktarın

    $('.varquantity').on('focus', selectAllOnFocus);

1

Kullanım setSelectionRange()olan geri aramayı iç requestAnimationFrame():

$(document).on('focus', '._selectTextOnFocus', (e) => {
    var input = e.currentTarget;
    var initialType = e.currentTarget.type;

    requestAnimationFrame(() => {
        // input.select() is not supported on iOS
        // If setSelectionRange is use on a number input in Chrome it throws an exception,
        // so here we switch to type text first.
        input.type = "text";
        input.setSelectionRange(0, Number.MAX_SAFE_INTEGER || 9999);
        input.type = initialType;
    });
});

Kullanım setSelectionRange()yerine select()beri select()mobil Safari (değil çalışır bkz iOS cihazlarda bir giriş alanına Programlı seçme metin (mobil Safari) ).

Kullanmayı beklemek gerekiyor requestAnimationFrameMetni seçmeden önce , aksi takdirde öğe, klavye iOS'ta açıldıktan sonra doğru şekilde görünüme kaydırılmaz.

Kullanırken setSelectionRange()giriş türünü ayarlamak önemlidir.text , aksi takdirde Chrome'da istisnalar atabilir (bkz . Giriş türü = "sayı" üzerinde seçimStart / selectionEnd Chrome'da artık izin verilmez ).


0

Bu sorunla tekrar karşılaşırsanız, burada (şu anda) tüm tarayıcılarda çalışan saf bir JS çözümü buldum. seyyar

<input type="text" value="Hello world..." onFocus="window.setTimeout(() => this.select());">

(setTimeout () olmadan Safari, mobil Safari ve MS Edge üzerinde çalışmıyor)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.