Mobil Safari'de tıklama olaylarında 300 ms gecikmeyi ortadan kaldırın


89

Mobil Safari'nin, bağlantının / düğmenin tıklandığı andan olayın tetiklendiği ana kadar tıklama olaylarında 300 ms'lik bir gecikme olduğunu okudum . Gecikmenin nedeni, kullanıcının çift tıklamak isteyip istemediğini görmek için beklemektir, ancak UX açısından 300 ms beklemek genellikle istenmeyen bir durumdur.

Bu 300 ms'lik gecikmeyi ortadan kaldırmanın bir çözümü , jQuery Mobile "dokunma" işlemini kullanmaktır. Maalesef bu çerçeveye aşina değilim ve tek ihtiyacım olan bir veya iki satır kodun touchenddoğru şekilde uygulanmasıysa büyük bir çerçeve yüklemek istemiyorum .

Birçok site gibi, sitemde de buna benzer birçok tıklama etkinliği var:

$("button.submitBtn").on('click', function (e) {   
  $.ajaxSubmit({... //ajax form submisssion
});

$("a.ajax").on('click', function (e) {   
  $.ajax({... //ajax page loading
});

$("button.modal").on('click', function (e) {   
      //show/hide modal dialog
});

ve yapmak istediğim şey, aşağıdaki gibi tek bir kod parçacığı kullanarak TÜM bu tıklama olaylarındaki 300 ms gecikmeden kurtulmaktır :

$("a, button").on('tap', function (e) {
 $(this).trigger('click');
 e.preventDefault();
});

Bu kötü / iyi bir fikir mi?



@Pointy teşekkürler, bu işe yarayabilir ...
tim peterson

"... belli ki bu UX açısından harika değil." Bu varsayım konusunda temkinli davranırdım.
Oliver Moran

1
@OliverMoran, düzeltme için teşekkürler, sadece bu cümleyi düzenledim, yukarıdaki soruya bakın ..
tim peterson

Yanıtlar:


73

Şimdi bazı mobil tarayıcılar, görüntü alanını ayarlarsanız 300 ms'lik tıklama gecikmesini ortadan kaldırır. Artık geçici çözümler kullanmanıza gerek yok.

<meta name="viewport" content="width=device-width, user-scalable=no">

Bu, şu anda olduğu Android için Chrome desteklenen , Android için Firefox ve iOS için Safari'de

Ancak iOS Safari'de , çift dokunma, yakınlaştırılamayan sayfalarda bir kaydırma hareketidir. Bu nedenle 300ms gecikmeyi kaldıramazlar . Yakınlaştırılamayan sayfalardaki gecikmeyi kaldıramazlarsa, yakınlaştırılabilir sayfalarda kaldıramazlar.

Windows Phone'lar, yakınlaştırılamayan sayfalardaki 300 ms'lik gecikmeyi de korur, ancak iOS gibi alternatif bir hareketi yoktur, bu nedenle Chrome'un sahip olduğu bu gecikmeyi kaldırmaları mümkündür.Windows Phone'daki gecikmeyi aşağıdakileri kullanarak kaldırabilirsiniz:

html {
-ms-touch-action: manipulation;
touch-action: manipulation;
}

Kaynak: http://updates.html5rocks.com/2013/12/300ms-tap-delay-gone-away

GÜNCELLEME 2015 Aralık

Şimdiye kadar, iOS'taki WebKit ve Safari, tek dokunuşların bağlantıları veya düğmeleri etkinleştirerek kişilerin çift dokunuşla sayfaları yakınlaştırmasına izin vermeden önce 350 ms'lik bir gecikme yaşadı. Chrome bunu birkaç ay önce, bunu tespit etmek için daha akıllı bir algoritma kullanarak değiştirdi ve WebKit benzer bir yaklaşımla izleyecek . Makale, tarayıcıların dokunma hareketleriyle nasıl çalıştığı ve tarayıcıların nasıl bugün olduğundan çok daha akıllı hale gelebileceği konusunda bazı harika bilgiler veriyor.

GÜNCELLEME 2016 Mart

İOS için Safari'de, "hızlı dokunma" yanıtı oluşturmak için ikinci bir dokunuşu algılamak için gereken 350 ms bekleme süresi kaldırılmıştır. Bu, genişlik = cihaz genişliği veya kullanıcı tarafından ölçeklenebilir = hayır ile bir görüntü alanı bildiren sayfalar için etkinleştirilir. Yazarlar ayrıca CSS'yi buradatouch-action: manipulation belgelendiği gibi kullanarak ('Hızlı Dokunma Davranışı Şekillendirme' başlığına gidin) ve burada belirli öğelerde hızlı dokunma davranışını seçebilirler .


Aslında, WP için dokunma etkinlikleri var: stackoverflow.com/questions/13396297/…
Cedric Reichenbach

1
Evet, yazımda yazdığım gibi -ms-touch-eylemi tarafından kontrol ediliyor.
NoName

1
Uygulamayı ana sayfadan çalıştırırken (bağımsız) iOS'ta sorun devam ediyor. Herhangi biri bunun için makul bir çözüm bulursa, çok hoş karşılanacaktır
Miguel Guardo

1
Dokunma eylemi değerlerini manipülasyona ayarlamak, istenen performansa en yakın şekilde gelir, ancak @MiguelGuardo'nun daha önce belirttiği gibi, web sayfasını iOS'ta ana ekranınıza bağımsız bir uygulama olarak eklediğinizde efekt kaybolur.
T. Steele

Birisi UIWebView'i hackleyebilir - stackoverflow.com/questions/55155560/…
Eazy

43

Financial Times tarafından geliştirilen bu eklenti -FastClick bunu sizin için mükemmel bir şekilde yapıyor!

Tıklama işlevinden hemen sonra event.stopPropagation();ve / veya eklediğinizden emin olun event.preventDefault();, aksi takdirde benim için yaptığı gibi iki kez çalışabilir, yani:

$("#buttonId").on('click',function(event){
    event.stopPropagation(); event.preventDefault();
   //do your magic

});

3
Jquery mobile kullanıyorsanız (yine de sürüm 1.3.2) bu mükemmel değildir, github.com/jquery/jquery-mobile/issues/6440
ryan0

that event.stopPropagation () tam da bu sayfaya ilk etapta gelme nedenim. Mükemmel çalışıyor, teşekkürler!
Lukas

@Jonathan fastclicksihrini yalnızca gecikme sorunu olan dokunmatik cihazlarda yapar (aksi takdirde otomatik olarak atlanır ). Ancak, her tıklama olayından sonra stopPropagation& eklemek preventDefault, tüm tarayıcılardaki tüm olay işleyicileri üzerinde istenmeyen yan etkilere neden olabilir.
kullanıcı

17

bunun eski olduğunu biliyorum, ancak tarayıcıda "dokunmanın" desteklenip desteklenmediğini test edemez misiniz? Daha sonra "dokunma" veya "tıklama" olan bir değişken oluşturun ve bu değişkeni öğenize bağlanan olay olarak kullanın.

var clickOrTouch = (('ontouchend' in window)) ? 'touchend' : 'click';
$('#element').on(clickOrTouch, function() {
    // do something
});

Böylece, kod örneği tarayıcıda "touchend" olayının desteklenip desteklenmediğini kontrol eder ve eğer desteklemiyorsa "click" olayını kullanırız.

(Düzenleme: "touchend", "ontouchend" olarak değiştirildi)


Teşekkürler, bunun basitliğini beğendim. Başkalarının olası tuzaklarından haberdar olmasını isterim.
tim peterson

4
@Andreas Köberle yanıtında açıkladığı için touchend olayı tıklama olayının yerini alamaz. Örneğin, bir düğmeyi kaydırırsanız ve parmağınızı durdurursanız, bağlantıyı tetikler ...
adriendenat

Bu, gecikmeden kurtulmak için büyük bir ek kitaplık eklemek zorunda kalmadan harika bir hafif çözümdür. Keşke buna 5 kez oy verebilsem! (kaydırma senaryosu için endişelenmediğiniz sürece!)
tonejac

2
Dokunma ve tıklama olay desteğine sahip bilgisayarlar / tarayıcılar için bu kötü bir çözümdür.
Alexander O'Mara

1
Bazı cihazlar hem dokunma hem de tıklama olaylarını destekler ve her ikisinin de farklı durumlarda ateşlenmesini istersiniz. Faresi olan bazı pencerelerin veya android tabletlerin, bir şeyi tıkladığınızda açıkça bir tıklama olayını tetikleyeceği, ancak dokunduğunuzda dokunma olaylarını da tetikleyeceği durumlar yaşadık. Bu, her iki olayı da dinlemeniz gerektiği anlamına geliyordu. Ek bir karmaşıklaştırıcı faktör olarak, bazı cihazlar dokunduğunuzda bir tıklama olayını sentezler, bu nedenle bu cihazlarda her ikisini de dinlemek, dikkatli olmadığınız sürece olay işleyicinizin iki kez ateşlenmesine neden olabilir.
1800 BİLGİ

12

Bir rastlamak ettik Hammer.js denilen derece popüler bir alternatif (Github sayfa) Ben iyi yaklaşım olduğunu düşünüyorum.

Hammer.js, Fastclick.js'den (en çok oy alan yanıt) daha tam özellikli bir dokunmatik kitaplıktır (birçok kaydırma komutuna sahiptir).

Yine de dikkatli olun: Mobil cihazlarda hızlı kaydırma, Hammer.js veya Fastclick.js kullandığınızda kullanıcı arayüzünü gerçekten kilitleme eğilimindedir. Sitenizde bir haber kaynağı veya kullanıcıların çok fazla kaydırma yapacağı bir arayüz varsa (çoğu web uygulaması gibi görünür) bu büyük bir sorundur. Bu nedenle, şu anda bu eklentilerin hiçbirini kullanmıyorum.


2
Hammerjs kullanmayın. Bazı ciddi sorunları var, örneğin: github.com/EightMedia/hammer.js/issues/388 github.com/EightMedia/hammer.js/issues/366 En azından düzeltilene kadar kullanmayın
Adonis K. Kakoulidis

2

Her nasılsa, yakınlaştırmayı devre dışı bırakmak bu küçük gecikmeyi devre dışı bırakıyor gibi görünüyor. Artık çift dokunmaya gerek olmadığı için mantıklı.

Bir mobil web sayfasında yakınlaştırmayı nasıl "devre dışı bırakabilirim"?

Ancak lütfen bunun kullanılabilirlik etkisinin farkında olun. Uygulama olarak tasarlanmış web sayfaları için yararlı olabilir, ancak daha genel amaçlı 'statik' sayfalar IMHO için kullanılmamalıdır. Düşük gecikme gerektiren bir evcil hayvan projesi için kullanıyorum.


1

Ne yazık ki bunu yapmanın kolay bir yolu yok. Yani sadece kullanmak touchstartveya touchendsizi başka sorunlara bırakacaktır, örneğin birisi bir düğmeye tıkladığında kaydırmaya başlar. Bir süre zepto kullanıyoruz ve bu gerçekten iyi çerçevede bile zamanla ortaya çıkan bazı sorunlar var. Birçoğu kapalı , ancak görünüşe göre basit bir çözüm alanı değil.

Bağlantılara yapılan tıklamaları küresel olarak ele almak için bu çözüme sahibiz:

   $(document.body).
    on('tap', 'a',function (e) {
      var href = this.getAttribute('href');
      if (e.defaultPrevented || !href) { return; }
      e.preventDefault();
      location.href= href;
    }).
    on('click', 'a', function (e) {
      e.preventDefault();
    });

- @ Andreas, teşekkürler, böylece tapgönderdiğim genel çözümü kullanmamayı ve tapolayları öğe bazında çarpanlara ayırmayı savunuyorsunuz ?
tim peterson

Hayır, konu bu değil. Önemli olan, tapkendi başınıza bir çözüm oluşturmaya çalışmak değil . Cevabımı güncelleyeceğim.
Andreas Köberle

- @ Andreas, cevabınız için teşekkürler, birçok tıklama etkinliği AJAX olduğundan varsayılan olay zaten engellenmiştir. Bunu da halletmek için cevabınızı günceller misiniz? Görünüşe göre benim genel tapçözümüm bu durumda sizinki ile aynı görünecek mi?
tim peterson

1

Jquery ve fastclick kitaplığı olmadan kolay bir yol aradım. Bu benim için çalışıyor:

var keyboard = document.getElementById("keyboard");
var buttons = keyboard.children;
var isTouch = ("ontouchstart" in window);
for (var i=0;i<buttons.length;i++) {
    if ( isTouch ) {
        buttons[i].addEventListener('touchstart', clickHandler, false);         
    } else {
        buttons[i].addEventListener('click', clickHandler, false);          
    }
}

0

Sadece biraz ekstra bilgi sağlamak için.

İOS 10'da, <button>sayfamdaki sayfalar sürekli tetiklenemiyordu. Her zaman bir gecikme oldu.

Fastclick / Hammer / tapjs / tıklamayı touchstart ile değiştirmeyi denedim, hepsi başarısız oldu.

GÜNCELLEME: Bunun nedeni, düğmenin kenara çok yakın olması! merkeze yakın hareket ettirin ve gecikme gitti!


0

Açıkça pasif modu beyan etmeniz gerekiyor :

window.addEventListener('touchstart', (e) => {

    alert('fast touch');

}, { passive : true});

0

JQuery'de "touchend" olayını, cadı tetikleme kodunu dokunduktan hemen sonra bağlayabilirsiniz (klavyede bir tuşa basma gibidir). Güncel Chrome ve Firefox tablet sürümlerinde test edilmiştir. Dokunmatik ekranlı dizüstü ve masaüstü cihazlarınız için de "tıklamayı" unutmayın.

jQuery('.yourElements').bind('click touchend',function(event){

    event.stopPropagation();
    event.preventDefault();

	// everything else
});

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.