İOS cihazlarda (mobil Safari) bir giriş alanında programlı olarak metin seçme


88

İOS aygıtlarında, örneğin mobil Safari çalıştıran iPhone, iPad gibi bir giriş alanının metnini programlı olarak nasıl seçersiniz?

Normalde, .select()işlevi <input ... />eleman üzerinde çağırmak yeterlidir , ancak bu, bu cihazlarda çalışmaz. İmleç, hiçbir seçim yapılmadan mevcut girişin sonunda bırakılır.


10
Dokunmatik bir cihaz olmanın metnin önceden seçilmesinin alaka düzeyini değiştirmesine neden bir neden göremiyorum. Dokunmatik bir cihaz hakkında söyledikleriniz, dokunmatik olmayan bir cihaz için de aynı şekilde söylenebilir. Bir kullanıcı düzenlemek için bir öğeye dokunmayı seçtiğinde metni önceden seçmek istiyorum. Çoğu durumda, kullanıcı büyük olasılıkla mevcut içeriği değiştirmek isteyecektir, bu durumda bunu daha fazla dokunmadan ve sürüklemeden yapabilirler. Diğer durumlarda, mevcut içeriği düzenlemek istediklerinde seçimi kaldırabilir veya seçimi değiştirebilirler.
sroebuck

2
Maalesef .focus (). Select () çalışmıyor.
sroebuck

2
Bu konuda bir ödül başlatıyorum. Amacım, kullanıcıların metin alanıma tıklamalarını ve metni panoya kopyalamak için "Kopyala" seçeneğine dokunmalarını çok kolaylaştırmak.
Dan Fabulich

Aynı burada .. Mobile Safari'de çalışmayan birçok yöntem var gibi görünüyor .select () ve .focus () bunlardan ikisi.

@sroebuck, David W. Keith için güzel cevap! başparmak havaya!
eyurdakul

Yanıtlar:


95
input.setSelectionRange(0, 9999);

https://developer.mozilla.org/en/DOM/Input.select


3
Bu benim için çalıştı, ancak fareyi aynı girişler üzerinde durdurmayı da içermesi gerekiyordu.
DuStorm

8
Bu benim için ne iPad'de ne de iPhone'da işe yaramadı
Doug

4
Bu, yalnızca .focus()başlatmadan önce girişi tetiklediysem benim için çalıştı input.setSelectionRange. Girişteki focusolayı dinliyorsanız , sonsuz bir döngüyü hesaba katmayı unutmayın.
allieferr

10
Bahsetmeye değer bir sorun: Bu, readonlyöznitelik setine sahiplerse metin alanlarında çalışmayacaktır .
JayPea

5
Çeşitli çözümlerle oynayarak bir saatten fazla zaman geçirdim. setSelectionRange()Bir focusişleyiciyi arama , .focus()programlı olarak tetiklediğinizde çalışır , ancak iOS'ta metin girişine manuel olarak dokunduğunuzda seçim gerçekleşmez. Söylemek yeterli, tek yapmanız gereken setSelectionRange()0 setTimeout içinde çağrı yapmaktır ve odağı tetikleyen şey ne olursa olsun beklendiği gibi çalışır.

30

Bu iş parçacığındaki hiçbir şey benim için işe yaramadı, işte iPad'imde çalışan şey:

// t is the input field
setTimeout(function() {
    t.setSelectionRange(0, 9999);
}, 1);

bu lanet olası numarayı yap! Teşekkür ederim! 'tıklama' etkinliğiyle çalışır
saike

Size çok teşekkür ederim!!
Vaclav Kusak

26

Negatif olduğunu kanıtlamak zor, ancak araştırmam bunun Mobile Safari'deki bir hata olduğunu gösteriyor.

Focus () işlevinin az ya da çok çalıştığını unutmayın - başarılı olmak için birden fazla dokunma gerektirebilir ve dokunmanın kendisi alana dokunacağından söz konusu alana bir kullanıcı dokunuşuna yanıt vermeye çalışıyorsanız gerekli değildir. odak. Maalesef select () , Mobile Safari'de işlevsizdir.

En iyi bahsiniz, Apple'daki bir hata raporu olabilir .


1
Testlerimiz de aynı şeyi gösteriyor. Bu, mobil safaride bir hata / eksik özelliktir.
Nir Levy

2
FWIW, yine WebKit'e dayanan Chrome Masaüstü ve Android Tarayıcıda çalışır.
jrummell

24

Şu kemana bakın : (giriş kutusuna bir metin girin ve 'metni seç'i tıklayın)

İPod'umdaki (5. nesil iOS6.0.1) bir giriş kutusundaki metni seçip klavyeyi açıyor ve ayrıca Kes / Kopyala / Öner ... menüsünü gösteriyor

Düz javascript kullanarak. Bunu jQuery ile denemedim

document.getElementById("p1").selectionStart = 0
document.getElementById("p1").selectionEnd = 999

999 sayısının sadece bir örnek olduğunu unutmayın. Bu numaraları, seçmek istediğiniz karakter sayısına ayarlamalısınız.

GÜNCELLEME:

  • iPod5 - iOS6.0.1 - Çalışıyor.
  • iPad1 - iOS5.1.1 - Yalnızca metin seçildi. Kes / Kopyala menüsünü açmak için seçime bir kez dokunun
  • iPad2 - iOS4.3.3 - Yalnızca metin seçildi. Kes / Kopyala menüsünü açmak için seçime bir kez dokunun

Son ikisi için, inputöğede bir tıklama etkinliğini tetikleyerek deneyebilirsiniz.

GÜNCELLEME: (07-10-2013)

  • iPod5 - iOS7.0.2 - Bağlantıda keman kullanımı: Giriş kutusunda yazılan metni göremiyorum. Seç'e basmak beni facebook.com'a (??? wtf ???) yönlendiriyor orada neler olduğu hakkında hiçbir fikrim yok.

GÜNCELLEME: (14-11-2013)

  • iOS 7.0.3: den comment sayesinde binki bu güncellemenin .selectionStartve .selectionEnd does işi.

GÜNCELLEME: (15-01-2015)

  • iOS 8.xx: Michael Siebert'in yorumu için teşekkürler . Yorumdan alınmıştır: Her iki durumda da çalışmasını sağlamak için hem odak VE tıklama olaylarını dinlemem ve ardından Zaman Aşımı / _ ayarlamam gerekiyordu: girdiye tıklayın veya sekme yoluyla odaklanın

Sen benim kahramanımsın bugün! Tıkır tıkır çalışıyor! ;-)
andi1984

3
@ andi1984 kahraman rozetini nereden alabilirim?
bart,

1
Diğer iOS sürümleriyle uyumluluğunu biliyor musunuz? İOS5 ve iOS4'te çalışıyor mu?
andi1984

1
Metin girişi engelli :( Benim kullanım durumu olduğunda iOS6 benim için Works AMA a) masaüstü Chrome b çalışmaz) değil çalışır: Ben benzersiz URL oluşturmak ve kolaylaştırmak paylaşımı istiyoruz.
Mars Robertson

1
@barts Facebook'a girdiğinizi tahmin edeceğim çünkü jsfiddle'daki "Paylaş" menüsü belki görünmezken düzensiz ve dokunulabilir olmalıdır. Bir iPad'de iOS-7.0.3 ile test ederken görünmez Twitter düğmesini kendim tıkladım. Ayrıca <input/>, iPad'inize dokunduğumu düşündüğümde jsfiddle'ın “CSS” bölmesine tıkladığımı düşündüğünü de buldum (yazdığım her şey görünmezdi). Dokunmamı doğru yöne yönlendirdiğimde, <input/>"metin seç" düğmeniz iOS-7.0.3 :-)'de mükemmel şekilde çalışıyor.
binki

7

Üzgünüm, önceki yazımda Javascript'in Javascript'te bir cevap istediğinizi ima ettiğini fark etmemiştim.

UIWebView'da javascript ile istediğinizi elde etmek için , iki önemli bilgiyi bir araya getirip çalıştırmayı başardım. Mobil tarayıcıdan emin değilim.

  1. element.setSelectionRange(0,9999); istediğimizi yapar

  2. mouseUp olayı seçimi geri alıyor

Böylece (Prototip kullanarak):

    input.observe ('focus', function () {
      this.setSelectionRange (0, 9999);
    });
    input.observe ('mouseup', function (olay) {
      event.stop ();
    });

hile yapar.

Mat


3
Aynı sorunu yaşıyoruz ve çözümünüzün işe yaradığını gördük - ancak jquery kullanıyoruz (aslında mobil). / * doldurma içindeki metni seçin * / $ ("input"). focus (function () {this.setSelectionRange (0, 9999); return false;}) .mouseup (function () {return false;} );
DuStorm

1
İPad ve iPhone'da iOS 8 kullanıyorum ve @ DuStorm'un kodu (bunun üzerindeki yorum) burada verilen tüm cevaplar arasında benim için işe yarayan tek şey. Tekrarlamak gerekirse, aşağıdakiler en azından iOS 8'de Chrome ve Safari'de çalışır: $("input").focus(function () { this.setSelectionRange(0, 9999); return false; } ).mouseup( function () { return false; });
Aaron Jessen

Bunun focusinişe yaraması için odaklanmak yerine kullanmak zorunda kaldım , iOS 7
Lucas

3

Görünüşe göre odak işe yarayacak, ancak yalnızca yerel bir olaydan doğrudan çağrıldığında. SetTimeout gibi bir şey kullanarak odak çağırmak klavyeyi çağırmıyor gibi görünüyor. İos klavyenin kontrolü çok zayıf. Bu iyi bir durum değil.


1

Android 2.2 ile birlikte gelen Webkit'te benim için aşağıdaki gibi bir şey çalışıyor:

function trySelect(el) {
    setTimeout(function() {
        try {
            el.select();
        } catch (e) {
        }
    }, 0);
}

Chromium Issue 32865'e bakın .


1

İPad'de iOS 7 ile bu işi yapabilmemin tek yolu alan <textarea></textarea>yerine fiilen kullanmaktı <input>.

Örneğin

<textarea onclick="this.setSelectionRange(0, 9999);">My text will be selected when textarea is clicked.</textarea>

Kullanıcının alandaki metni değiştirmesini önlemek daha zordu, çünkü metin alanını salt okunur hale getirdiğinizde seçim hilesi artık çalışmayacak.


1

Bu çözümü ararken çıldırdım, tüm yanıtlarınız onun benim için başka bir solucan kutusu açmasına yardımcı oldu.

İstemci edebilmek için kullanıcı istediği tıklayıp tümünü seç , ve ayrıca kullanıcıyı izin 'sekme' ve iPad'de tümünü seçmek (harici bir klavye ile. Biliyorum, deli ...)

Bu soruna çözümüm, olayları yeniden düzenlemek oldu. Önce Odaklanın , ardından Tıklayın , ardından Başlat'a dokunun .

$('#myFUBARid').on('focus click touchstart', function(e){
  $(this).get(0).setSelectionRange(0,9999);
  //$(this).css("color", "blue");
  e.preventDefault();
});

Umarım bu birilerine yardımcı olur, çünkü sizler bana defalarca yardım ettiniz.


-4

HTML5 uyumlu tarayıcılar kullanıyorsanız placeholder="xxx", inputetiketinizde kullanabilirsiniz . Bu işi yapmalı.


8
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.