0

我似乎找不到任何直接的方法来解决这个问题?我无法理解Google 的快速按钮方法。因此,如果有人有替代方案,那就太好了。

我所说的幽灵点击是指对按钮的触摸或多次触发它的东西。例如,单击将显示的按钮alert("hello");将显示该警告框 2 次,有时甚至 5 次。

这是我处理按钮按下的代码的一部分。我省略了一些部分,但基本上,这是处理“添加”按钮上的按下的机制。

$('div:jqmData(role="page")').live('pagebeforeshow',function(){
    var db = window.openDatabase("mydb", "1.0", "MyDB", 1000000);

    var url = window.location.href;
    var filename = url.substring(url.lastIndexOf('/')+1);

    switch (filename) {
        case "index.html":
            $("#add").tap(function(e){
                if ($("#info").val() == "") {
                    navigator.notification.alert("The info cannot be blank!", function(){}, "Error", "Okay, got it!");
                } else {
                    db.transaction(addToDb, errorCB, addedToDb);
                }
            });
            break;
        case "sample.html":
            break;
    }
});
4

1 回答 1

1

您在委托事件绑定中发生了标准事件绑定。这意味着每次触发外部事件时都会绑定内部绑定。

tap因此,基本上每次pagebeforeshow触发任何伪页面时,您都会重新绑定事件处理程序。每次您导航到另一个页面时,您都会创建另一个内部绑定,因此您会收到多个警报。

一个好的解决方法是为pageinit页面事件创建一个委托事件处理程序并在该事件处理程序中进行内部绑定。该pageinit事件仅在每个伪页面触发一次,因此您不会不必要地继续添加更多事件处理程序。

例如:

$(document).on('pageinit', '.ui-page',function(){
    var db       = window.openDatabase("mydb", "1.0", "MyDB", 1000000),
        url      = window.location.href,
        filename = url.substring(url.lastIndexOf('/')+1);

    switch (filename) {
        case "index.html":
            $("#add").tap(function(e){
                if ($("#info").val() == "") {
                    navigator.notification.alert("The info cannot be blank!", function(){}, "Error", "Okay, got it!");
                } else {
                    db.transaction(addToDb, errorCB, addedToDb);
                }
            });
            break;
        case "sample.html":
            break;
    }
});

你会注意到我使用.on()了我的委托事件处理程序而不是 depreciated .live()

于 2012-10-10T18:31:50.700 回答