6

我的索引页面上有一个非常简单的用例。

        <script src="js/jquery-min.js"></script>
        <script src="js/jquery-mobile.js"></script>
        <script type="text/javascript" src="cordova-2.2.0.js"></script>

         <script>
                 $("body").on("swipeleft", function(event) {
                alert('hello');
                /*window.location.href = "html/first.html";*/             
            });
       </script> 

由于某种原因,此事件触发了 2 次。现在我确定我没有在 body 标记上绑定另一个事件,因为这是第一页。我也尝试过其他简单的事件,比如 touchstart 等。它们都触发了两次。我究竟做错了什么 ?

更新 :-

我已经通过以下方式修改了我标记为正确的答案并且它有效。此页面上的事件不会触发两次。

<head>
      <script type="text/javascript" src="js/jquery-min.js"></script>
            <script>
                 $(document).bind("mobileinit", function() {
                       $.mobile.autoInitializePage = false;
                       $.mobile.defaultPageTransition = 'none';
                       $.mobile.touchOverflowEnabled = false;
                       $.mobile.defaultDialogTransition = 'none';
                       $.mobile.loadingMessage = '' ;                 
                  });
            </script>
            <script type="text/javascript" src="js/jquery-mobile.js"></script>
            <script type="text/javascript" src="cordova-2.2.0.js"></script>
</head>
4

3 回答 3

14

避免这个问题的方法很少。就像CodeJack告诉你的那样,这是一个已知问题,但它不是错误,主要是因为jQM处理页面的独特方式。

  • 最简单的方法是在再次绑定之前取消绑定事件,如下所示:

    $("body").off().on("swipeleft", function(event) {
        alert('hello');
        /*window.location.href = "html/first.html";*/             
    });
    

    如果您有其他事件绑定到同一个对象,请使用:

    $("body").off("swipeleft").on("swipeleft", function(event) {
        alert('hello');
        /*window.location.href = "html/first.html";*/             
    });
    
  • 除了使用事件绑定/取消绑定、live/die 和 on/off 之外,还有另一种方法。而不是在再次绑定之前取消绑定,使用jQuery 事件过滤器,它可以用来识别事件是否已经被绑定。不要忘记从下面发布的链接下载它(它不是jQM的标准部分)。

    http://www.codenothing.com/archives/2009/event-filter/

    这是我的使用示例:

    $('#carousel div:Event(!click)').each(function(){ 
        //If click is not bind to #carousel div do something 
    });
    

    我正在使用每个,因为我的轮播 div 有很多内部块,但原理是相同的。如果#carousel 内部 div 元素没有点击事件,则添加该事件。在您的情况下,这将防止多个事件绑定。

可以在此处找到其他解决方案。

于 2013-01-19T07:45:27.677 回答
4

您应该尝试使用文档就绪事件将事件附加到正文。此外,您可能只想将事件附加到正文一次。

$(document).ready(function(){
    $("body").off().on("swipeleft", function(event) {
        alert('hello');          
    });
});

如果您有其他事件绑定到同一个对象,请使用:

$(document).ready(function(){
    $("body").off("swipeleft").on("swipeleft", function(event) {
        alert('hello');          
    });
});
于 2013-01-19T07:51:16.490 回答
1

这是已知问题...我发现它可以通过在标签内移动 js 代码来避免<head>..我不知道原因..但这避免了问题...

于 2013-01-19T05:50:13.883 回答