Як я можу розпізнати сенсорні події за допомогою 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.