一次()射击不止一次

时间:2014-08-13 16:05:39

标签: javascript jquery

我正在使用one()事件处理程序,应该(我已经相信)在单击时触发一次代码,但是在单击之后不再执行它。在这里,它检查一个类是否可见,如果是,则向变量添加10。但问题是我可以多次点击它并且它会不断向变量添加10。

我做错了吗?

$('.cme-confirm').one( "click", function(event) {

    if ($(".this-correct")[0]){
       case1Score = case1Score + 10;
    }
    event.stopImmediatePropagation();
    console.log(case1Score);
});

提前致谢。

修改

感谢Richard Cane,他解释说这是因为我有多个带有类名的元素。因此它不止一次射击。我打算给每个元素一个独特的类,但是Ruben Seratte已经解决了我的问题。非常感谢大家的帮助。

3 个答案:

答案 0 :(得分:3)

既然你现在为什么会这样做,而不是给元素提供独特的类,你可以解决问题,如果你在事件被解雇后停止听取它:

$('.cme-confirm').on( "click.myId", function(event) {
    jQuery('.cme-confirm').off("click.myId");

    if ($(".this-correct")[0]){
       case1Score = case1Score + 10;
    }
    event.stopImmediatePropagation();
    console.log(case1Score);
});

答案 1 :(得分:2)

为了澄清评论:

问题是如果选择器只包含一个类,.one()将为类的每个元素执行一次。这在JQuery API中描述:

.one(events [,data],handler)
说明: 将处理程序附加到元素的事件。每个事件类型的每个元素最多执行一次处理程序。

具体来说,如果同一个类的页面上有10个元素,.one()将执行10次。

答案 2 :(得分:2)

如果你想要一个函数运行一次,你可以尝试这样的东西,它不是完美的,但它应该工作:

编辑 - 添加小提琴


http://jsfiddle.net/ctwheels/p8u6apbs/


var runOnce = true;

$('.cme-confirm').on("click", function(event) {
    if(runOnce){
        if ($(".this-correct")[0]){
            case1Score = case1Score + 10;
        }
        event.stopImmediatePropagation();
        console.log(case1Score);
        runOnce = false;
    }
});

使用jquery的.one():

目前,您的函数正在为您拥有的每个类元素运行一次函数。因此,如果您有10个具有相同类的元素,它将运行一次,十次(每个元素一次)。换句话说:

{1} {2} {3}

我点击{1},{1}无法再次点击,该功能将无法运行