Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何防止touchend事件显然是;“记住”;通过浏览器,然后在不适当的时间开火?_Javascript_Ios_Callback_Touch_Dom Events - Fatal编程技术网

Javascript 我如何防止touchend事件显然是;“记住”;通过浏览器,然后在不适当的时间开火?

Javascript 我如何防止touchend事件显然是;“记住”;通过浏览器,然后在不适当的时间开火?,javascript,ios,callback,touch,dom-events,Javascript,Ios,Callback,Touch,Dom Events,编辑 基于观点的数量和完全缺乏回应,我不得不假设我在传达我的问题方面做得很差。我现在要试着纠正这一点 我用一种新的tap方法扩展了HtmleElement原型,如下所示: HTMLElement.prototype.tap = function (func) { this.addEventListener("touchend", func, false); }; 我还在jQuery中创建了一个自定义点击事件: $(document).delegate("*", "touchend",

编辑

基于观点的数量和完全缺乏回应,我不得不假设我在传达我的问题方面做得很差。我现在要试着纠正这一点

我用一种新的tap方法扩展了HtmleElement原型,如下所示:

HTMLElement.prototype.tap = function (func) {
    this.addEventListener("touchend", func, false);
};
我还在jQuery中创建了一个自定义点击事件:

$(document).delegate("*", "touchend", function (e) {
    $(this).trigger("tap");
});
我还创建了一个名为tap的jQuery插件:

$.fn.tap = function (func) {
    this.bind("tap", func);
};
如果我尝试将其中任何一个用于包含alert语句的回调函数,回调将执行两次。我点击该元素以弹出警报。我点击警报中的“确定”按钮关闭警报。下次我点击屏幕时,无论我等待多长时间,警报都会再次弹出。这一次点击“OK”按钮似乎不会设置另一个重复

但是,如果回调函数不包含alert语句(例如,我使用console.log语句),则回调只执行一次

有人知道怎么处理这个问题吗?我将尝试从事件处理程序本身中取出事件处理程序,然后再将其重新绑定,但如果成功的话,这只不过是一次黑客攻击

我宁愿用正确的方式做事。:-)

原创

我刚刚完成了一个“tap”函数的编写,我可以通过扩展HtmleElement或元素原型来使用它,还可以为jQuery编写一个自定义的“tap”事件和“tap”插件。在我决定使用一个简单的警报语句作为测试代码之前,我一直以为我已经准备好了

当我在测试页面上的某些元素中使用这些元素时,当我第一次“点击”该元素时,它们会正确地触发,但在我触摸警报的“OK”按钮后,问题就会出现,然后,在任何时间之后,再次点击屏幕,此时事件处理程序会再次触发

起初我以为这是我的自定义代码,但当我用下面非常基本的JavaScript尝试它时,我能够复制完全相同的问题

document.getElementById("some-element").ontouchend = function (e) {
    alert("Howdy doody!");
};
我想这一定与我必须再次触摸屏幕来执行警报上的“OK”有关,而从技术上讲,它仍然在事件处理程序中(因为警报实际上是“阻止”处理程序功能的完成)

以下代码没有复制这种行为,这一事实似乎支持了我的想象。:-)

如果我在一个页面中包含上述代码,并在回调触发后触摸该元素,我将不会重复触发该回调函数,这与前一段代码相反,在前一段代码中,我将在点击“OK”后再次点击屏幕时看到警报弹出,无论我点击页面的何处


这确实是一个奇怪的问题,我还没有找到任何关于为什么会发生这种情况的信息。有人知道发生了什么吗?

我相信触控端触发的可视整页警报会干扰触控事件循环。在屈服于DOM后尝试调用警报。例如

setTimeout(function() {
    alert('btn clicked');
}, 0);
setTimeout(function() {
    alert('btn clicked');
}, 0);