Jquery.ui.touch.punch.js script предотвращает входные функции на сенсорных устройствах - программирование

Jquery.ui.touch.punch.js script предотвращает входные функции на сенсорных устройствах

Мне потребовалось немного, но я понял, что не могу нажать на мои входы из-за touch.punch script Я использую, чтобы включить функцию перетаскивания пользовательского интерфейса jquery на сенсорных устройствах. Кто-нибудь, знакомый с этим script, знает, почему это может быть? Форма фактически располагается по дереву родительского объекта. Кто-нибудь знает способ, которым я могу переопределить или усилить выбор? Я собираюсь попробовать привязать события, которые в настоящее время заставляют фокус вводить, но, может быть, кто-то здесь имеет некоторое представление?

4b9b3361

Ответ 1

Для всех, кто может оказаться здесь с аналогичной ситуацией, используя очень удобный штрих-код touch.punch, просто принудительное фокусирование на событии клика будет работать просто отлично!

$('.input').bind('click', function(){
    $(this).focus();
});

Ответ 2

JEditable + jQuery UI Sortable + jquery.ui.touch-punch

Я потратил весь день на эту проблему, и я, наконец, понял решение. Решение очень похоже на ответ на ответ. Однако я использовал jeditable, который динамически создает поля ввода без имен классов. Поэтому я использовал эту условную инструкцию вместо проверки имени класса:

//Check if element is an input or a textarea
if ($(touch.target).is("input") || $(touch.target).is("textarea")) {
  event.stopPropagation();
} else {
  event.preventDefault();
}

Я думаю, что это лучшее решение, поскольку оно всегда использует встроенную функциональность для любых полей ввода или textarea.

Ответ 3

Люди, остальные два ответа здесь НЕ работали для меня, но решение Danwilliger работает; однако из его ответа неясно, как именно настроить его в файле JS Touch Punch. Для будущих ответчиков, вот что делать. Опять же, это решение Дэнвиллигера - я просто уточняю.

Измените этот раздел в jquery.ui.touch-punch.js(примерно на строке 30):

function simulateMouseEvent (event, simulatedType) {

// Ignore multi-touch events
if (event.originalEvent.touches.length > 1) {
  return;
}

event.preventDefault();

var touch = event.originalEvent.changedTouches[0],
    simulatedEvent = document.createEvent('MouseEvents');

Для этого:

function simulateMouseEvent (event, simulatedType) {

// Ignore multi-touch events
if (event.originalEvent.touches.length > 1) {
  return;
}
var touch = event.originalEvent.changedTouches[0],
    simulatedEvent = document.createEvent('MouseEvents');

//Check if element is an input or a textarea
if ($(touch.target).is("input") || $(touch.target).is("textarea")) {
    event.stopPropagation();
} else {
    event.preventDefault();
}

Удачи!

Ответ 4

ОК, другое решение, если ваш textfield любой элемент HTML не фокусируется, прокручивается, выбирает слова, перемещает текстовый курсор вокруг текста и любые другие сценарии, которые могут возникнуть, тогда вы можете переопределить jquery.ui. touch.punch.js script. Я предполагаю, что ваш элемент не является перетаскиваемым, но, возможно, его дочерним элементом, как и мой случай.

Поместите класс в свой элемент html, например class="useDefault". Затем перейдите в файл script и найдите ту часть:

...
function simulateMouseEvent (event, simulatedType) {

    // Ignore multi-touch events
    if (event.originalEvent.touches.length > 1) {
      return;
    }

    event.preventDefault();

    var touch = event.originalEvent.changedTouches[0],
        simulatedEvent = document.createEvent('MouseEvents');
....

Как вы можете видеть, event.preventDefault(); уверяет, что jquery.ui.touch.punch.js переопределяет поведение браузера по умолчанию. Чтобы предотвратить это для нашего класса node, внесите следующие изменения:

if (event.originalEvent.touches.length > 1) {
  return;
}
var touch = event.originalEvent.changedTouches[0],
  simulatedEvent = document.createEvent('MouseEvents');
//As you can see here is your class element check
if (touch.target.className === "useDefault") {
  event.stopPropagation();
} else {
  event.preventDefault();
}

Это решение протестировано только с браузерами webkit и выпуском jQuery UI Touch Punch 0.2.2.

Надеемся, что быстрое решение поможет, BR

Ответ 5

Благодаря @Danwilliger и @jeremytripp для решения. Поскольку эта проблема известна годами, но до сих пор не была обработана авторепортером Git repo, я разветкил его с добавленным здесь решением:

https://github.com/copernicus365/jquery-ui-touch-punch/blob/master/jquery.ui.touch-punch.js

Я был бы очень доволен тем, что автор включил эти несколько строк изменения в исходную библиотеку и сделало бы это ненужным, но если этого не произойдет, приятно иметь один исходный файл для ссылки.

Ответ 6

Ответ Джейкоба работал с небольшой модификацией - я обнаружил, что использование события click привело к непоследовательному поведению на iPad, Safari ios9. Иногда я нажимал один раз на поле, и он фокусировался, в других случаях мне приходилось три раза нажать. Изменение click на touchstart решило проблему для меня (я также использовал делегирование событий, так как моя форма была добавлена ​​динамически):

$('form').on('touchstart', 'input,textarea',function(){
    $(this).focus();
});

Ответ 7

Я на самом деле попытался добавить строки, которые Данвиллигер упомянул, это не помогло мне.

Что сработало для меня, было

//Check if element is an input or a textarea
if ($(touch.target).is("input") || $(touch.target).is("textarea")) {
  event.stopPropagation();
  $(touch.target).focus();
} else {
  event.preventDefault();
}

Я не уверен, почему другие ответы не были опубликованы, но для кого-то еще, если у них есть такая же проблема, попробуйте мое решение:).

Ответ 8

Одним из решений является использование дескриптора. Добавьте значок внутри и используйте его для перетаскивания. Тогда входы работают нормально.

<li><span class="move">Move</span><input...../></li>

    $("#sortableList").sortable({

    handle: ".move"

    });

Ответ 9

Решение для дроссельной заслонки работало для меня. Проще, возможно, просто использовать селектора JQuery для покрытия всех входов и текстовых областей:

    $('input,textarea').bind('click', function(){
    $(this).focus();
});