jquery.ui.touch.punch.js脚本防止在触摸设备的输入功能(jquery.ui.t

2019-07-31 19:08发布

我花了一点点,但我想通了,我无法点击,因为我使用的是启用触摸设备的jQuery UI拖动功能的touch.punch脚本对我的投入。 任何人都熟悉这个剧本知道为什么,可能是? 该表格实际驻留下来父对象的树。 有谁知道通过选择一种方法,我可以重写或强制? 我要去尝试绑定,现在强制焦点到输入事件,但也许有人在这里有一些见解?

Answer 1:

JEdi​​table + jQuery UI的可排序+ jquery.ui.touch冲

我花了在这个问题上所有的一天,我终于想通了解决方案。 该解决方案是非常相似的kidwon的答案。 但是,我用jeditable未经类名动态创建输入字段。 所以我用的不是检查类名这个条件语句:

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

我认为这是一个更好的解决方案,因为它总是使用任何输入或文本区域字段的本地功能。



Answer 2:

伙计们,这里的其他两个答案并没有为我工作,但Danwilliger的解决方案的工作; 然而,这不是他的答案清楚究竟是如何将其设置在触摸冲床JS文件。 对于未来的答案者,这里是做什么。 再次,这是Danwilliger的解决方案 - 我只是澄清。

改变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();
}

祝您好运!



Answer 3:

任何人谁可能使用非常方便touch.punch黑客在这里结束了类似的情况,只是通过一个click事件迫使焦点将工作得很好!

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


Answer 4:

OK这里的另一个解决办法,如果你的textfield的任何HTML元素不聚焦,滚动,选择的话,走动文本文本光标和任何不同的情况可能出现,那么你可能会覆盖jquery.ui.touch.punch.js脚本。 我假设你的元素不是拖动一个,但可能它的孩子是我的情况了。

把你的HTML元素的一类,例如class="useDefault" 。 然后去到脚本文件,并发现部分:

...
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重写浏览器的默认行为。 为了防止我们的特定类节点,进行以下修改:

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();
}

该解决方案是只和jQuery UI的触摸冲床0.2.2版本WebKit浏览器进行测试。

希望快速的解决方案帮助,BR



Answer 5:

由于@Danwilliger和@jeremytripp的解决方案。 作为这个问题已经相识多年,但仍未工作到触摸冲笔者的混帐回购协议,我添加了这里的解决方案分叉它:

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

我会很高兴地看到笔者的改变那些几行合并到原来的图书馆,使之成为一件不必要的话,但如果这不会发生,这是很好的有一个源文件引用。



Answer 6:

雅各布的回答有轻微的修改工作,我发现,使用click事件导致iPad上的不一致的行为,ios9 Safari浏览器。 有时我会在现场按一次,它会集中,其他时间我都得按三次。 更改clicktouchstart解决了这个问题对我来说(我还用事件代表团自从动态添加我的表单):

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


Answer 7:

其实,我尝试添加该Danwilliger提到的,它并没有为我做的伎俩行。

什么工作对我来说是

//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();
}

我真的不知道为什么贴在其他的答案没有工作,但对于其他人在那里,如果他们有同样的问题试试我解决了:)。



Answer 8:

一个解决方案是使用一个手柄。 里面添加一个图标,并使用这种拖动。 然后投入正常工作。

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

    $("#sortableList").sortable({

    handle: ".move"

    });


Answer 9:

Throttlehead的解决方案为我工作。 也许更简单,只是使用jQuery选择覆盖所有输入和文字区域:

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


文章来源: jquery.ui.touch.punch.js script is preventing input functionality on touch devices