10

我遇到了一个问题,即调用 $.load() 后 jQuery 事件会触发两次。事件处理程序放置在 load() 回调函数中,这似乎是脚本上事件触发两次的唯一地方。

我尝试添加 event.stopPropogation() 和 event.preventDefault(),因为这些似乎是 jQuery 事件触发多个事件的常见建议。我不确定我的代码是否冒泡不正确或什么。任何反馈都会有所帮助。

这是您看到行为的一些代码的摘录。

$("div.questions").load("question_source.php #simplified_a", function(){

                ...

                // Line 1
                $("#some_id").change(function(){
                    cantBeNegative(this);
                    adjusted_gross_income = $(this).val();
                    console.log(adjusted_gross_income);
                    // event.stopPropagation();
                    // event.preventDefault();
                });

您可以清楚地看到事件触发了两次,其中包含我在其中的 console.log 位。任何意见,将不胜感激!


编辑

好的,我根据一些建议检查了实时页面上的所有内容,当问题发生时,肯定只有一个 <div id="questions"> 存在。因此,这似乎不是 HTML 问题。

我还检查了该事件是否实际上被调用了两次,据我所知,该事件只被调用了一次。

现在,我添加了一个附加到文档的 .on() 事件,该事件在动态创建的元素上调用,并且只触发一次。.on() 不会在 .load() 回调中调用。这是页面上其他输入框之一使用的示例,可以正常工作:

$(document).on('change', "#SWA_mothers_income", function(){
console.log("mothers income changes from on()");
});

所以,这可以正常工作,但是当在 .load() 回调函数中对相同的输入进行测试时,它会触发两次,无论它是如何调用的。所以,在我看来,这几乎肯定是 .load() 的问题。我不会完全称自己为这方面的专家,所以如果有人能解决这个问题,我很想知道答案。就目前而言,我将使用 .on() 重写此代码。


第二次编辑

添加 $("#some_id").unbind('change'); 在 'change(function()) 位成功之前!

4

3 回答 3

9

添加这一行

$("#some_id").unbind('change');

$("#some_id").change(function(){});

于 2013-09-03T15:09:53.830 回答
1

我并不是说这会解决您的问题,但您需要通过事件来引用它。

$("#some_id").change(function(event){
    cantBeNegative(this);
    adjusted_gross_income = $(this).val();
    console.log(adjusted_gross_income);
    event.stopPropagation();
    event.preventDefault();
});
于 2013-09-03T14:53:22.513 回答
1

您可能有两个带有“问题”类的 div,因此您可以绑定更改函数两次。

如果您将更改功能更新为以下内容,这将在重新添加之前取消绑定更改事件。这将确保您只绑定一次函数;

            $("#some_id").unbind('change').change(function(event) {
                event.preventDefault();
                cantBeNegative(this);
                adjusted_gross_income = $(this).val();
                console.log(adjusted_gross_income);
            });
于 2013-09-03T15:13:28.613 回答