Як я можу розпізнати сенсорні події за допомогою jQuery в Safari для iPad? Це можливо?


192

Чи можна розпізнати події дотику в браузері Safari iPad за допомогою jQuery?

Я використовував події mouseOver та mouseOut у веб-програмі. Чи є подібні події для браузера Safari iPad, оскільки немає таких подій, як mouseOut та mouseMove?

Відповіді:


240

Core jQuery не має нічого особливого для сенсорних подій, але ви можете легко створити свій власний, використовуючи наступні події

  • сенсорний запуск
  • сенсорний рух
  • дотик
  • сенсорний

Наприклад, touchmove

document.addEventListener('touchmove', function(e) {
    e.preventDefault();
    var touch = e.touches[0];
    alert(touch.pageX + " - " + touch.pageY);
}, false);

Це працює в більшості браузерів на базі WebKit (включаючи Android).

Ось добра документація .


2
Великий спасибі Девіде, я думаю, що це спрацює, але що таке дотики [0]? чи можете ви детально описати аргумент "е"?
Абхішек Б.

7
e - об'єкт події, який автоматично передається обробнику. Для веб-переглядача safari (і для android теж) він тепер містить масив усіх дотиків, які користувач робив на екрані. Кожен штрих має свої властивості (наприклад, координати x, y)
David Pean

1
тепер, як ви вирішите знайти, який елемент викликати подію на –__-
Мухаммед Умер

Зауважте, що правильна відповідь - це відповідь Тимофія Переса, ця не оновлюється.
EPurpl3

149

Якщо ви використовуєте jQuery 1.7+, це навіть простіше, ніж усі ці інші відповіді.

$('#whatever').on({ 'touchstart' : function(){ /* do something... */ } });

1
Так, Тимофі, я не використовував версію 1.7+ під час запуску проекту. зараз onwords Я використовую jquery 1.7+ .. Дякую за гарну пропозицію та відповідь .. Дякую. :)
Абхішек Б.

7
Це добре працює. Мені потрібно було натиснути та сенсорний запуск, щоб зробити те саме, і я звик до синтаксису без об’єктів, як$('#whatever').on('touchstart click', function(){ /* do something... */ });
goodeye

1
коли я йду $('#whatever').on({ 'touchstart' : function(ev){}});, evсхоже, немає жодної інформації про дотики (дотики, цільові дотики чи змінені дотики)
восьминіг

8
@Octopus: Інформацію про дотики ви знайдете під ev.originalEvent.
Пітер Блумфілд

1
@edonbajrami так, звичайно. перевірити документи та шукати "делеговані події". $ ("# елемент для моніторингу нових елементів"). on ("eventX", "#element", функція (подія) {/ * що б не було * /});
honk31

24

Найпростіший підхід - використовувати багатоконтактну бібліотеку JavaScript на зразок Hammer.js . Тоді ви можете написати код на зразок:

canvas
    .hammer({prevent_default: true})
    .bind('doubletap', function(e) { // And double click
        // Zoom-in
    })
    .bind('dragstart', function(e) { // And mousedown
        // Get ready to drag
    })
    .bind('drag', function(e) { // And mousemove when mousedown
        // Pan the image
    })
    .bind('dragend', function(e) { // And mouseup
        // Finish the drag
    });

І ви можете продовжувати рух. Він підтримує натискання, подвійне торкання, проведіть пальцем, утримуйте, перетворіть (тобто прищипніть) і перетягніть. Сенсорні події також спрацьовують, коли трапляються еквівалентні дії миші, тому вам не потрібно писати два набори обробників подій. О, і вам потрібен плагін jQuery, якщо ви хочете мати можливість писати в jQueryish способом, як я.


29
"найпростіше" рішення ніколи не передбачає ускладнення проблеми шляхом додавання бібліотек
восьминога

13
@Octopus Найпростішим рішенням є використання hammer.js, яке дозволяє зменшити головні болі між переглядачами. Використовуйте розширення jQuery, щоб бути у вашій знайомій зоні. Мені це не здається занадто складним.
trusktr

1
передбачуване "найпростіше" рішення - це найчастіше те, що люди накручують найбільше ... що б ви не робили, не забудьте переконатися, що ваше рішення працює на пристроях, які підтримують як дотик, так і мишу, наприклад Microsoft Surface
Simon_Weaver

1
@ Октопод: "Коли все, що у вас є, це молоток [sic] ... все схоже на цвях" :)
Пройшло кодування

ВРЕМЯ ЧАС! Дякую за те, що ви поділилися цією бібліотекою, її було легко встановити у моїй програмі та запустити! Встановіть секунду для налаштування, оскільки обробник подій інший, але простий console.log (подія) повідомляє вам, що вам потрібно. ДЯКУЮ!
Енді

24

Використання сенсорного запуску або сенсорного керування не є хорошим рішенням, оскільки, якщо ви прокручуєте сторінку, пристрій визначає її як сенсорне або торкання. Отже, найкращий спосіб одночасно виявити подію натискання та натискання - це просто виявити сенсорні події, які не рухаються по екрану (прокрутка). Для цього просто додайте цей код у свою заявку:

$(document).on('touchstart', function() {
    detectTap = true; // Detects all touch events
});
$(document).on('touchmove', function() {
    detectTap = false; // Excludes the scroll events from touch events
});
$(document).on('click touchend', function(event) {
    if (event.type == "click") detectTap = true; // Detects click events
       if (detectTap){
          // Here you can write the function or codes you want to execute on tap

       }
 });

Я тестував це, і він працює добре для мене на iPad та iPhone. Він виявляє кран і легко розрізняє прокрутку дотику та дотику.


2
Це рішення є найбільш прямим вперед, який я знайшов, і, здається, чудово працює в iOS.
Джошуа Лоуренс Остілл

Спочатку я використовував jquery mobile, але потім це заважало іншим функціоналам. Я зараз цим користуюся і працює ідеально. Поки що жодних питань.
Анураг Приядарші

18

Ви можете використовувати .on () для зйомки декількох подій, а потім перевірити на дотик на екрані, наприклад:

$('#selector')
.on('touchstart mousedown', function(e){
  e.preventDefault();
  var touch = e.touches[0];
  if(touch){
    // Do some stuff
  }
  else {
    // Do some other stuff
  }
});

за винятком того, що .bindзастаріло. Слід скористатися.on
jcuenod

15

jQuery Core не має нічого особливого, але ви можете читати на сторінці jQuery Mobile Events про різні сенсорні події, які також працюють на інших пристроях iOS.

Вони є:

  • натисніть
  • тапхолд
  • проведіть пальцем
  • стрімкий рух
  • швидкий

Зауважте також, що під час подій прокрутки (на основі дотику до мобільних пристроїв) пристрої iOS заморожують маніпуляцію DOM під час прокрутки.


Дякую, що даєте важливий час для мого запитання. Я розглядаю події Jquery Mobile .. Дякую.
Абхішек Б.

Ці події насправді не є реальними сенсорними взаємодіями.
trusktr

Чи є jQuery Core власне власним іменником?
Пітер Мортенсен

6

Я був трохи турбувався про використання тільки TouchMove для мого проекту, так як здається , тільки вогонь , коли ваші дотики переміщається з одного місця в інше (а не на початковому контакті). Тож я поєднав це з сенсорним стартом , і це, здається, працює дуже добре для початкового дотику та будь-яких рухів.

<script>

function doTouch(e) {
    e.preventDefault();
    var touch = e.touches[0];

    document.getElementById("xtext").innerHTML = touch.pageX;
    document.getElementById("ytext").innerHTML = touch.pageY;   
}

document.addEventListener('touchstart', function(e) {doTouch(e);}, false);
document.addEventListener('touchmove', function(e) {doTouch(e);}, false);

</script>

X: <div id="xtext">0</div>
Y: <div id="ytext">0</div>

Я також додав це, щоб визначити, скільки часу минуло з часу останньої події ..document.getElementById("ttime").innerHTML = ((new Date()) - touchTime); touchTime = new Date();
hanamj

3

Щойно я тестував плагін GitHub jQuery Touch Events від Benmajor для версій jQuery 1.4 та 1.7+. Він легкий і прекрасно працює з обома, onі bindпри цьому надає підтримку вичерпному набору сенсорних подій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.