jquery live自动递增keyup事件

时间:2010-02-03 01:49:01

标签: jquery

我真的很困惑,甚至不确定要搜索什么来寻找答案。我正在多次调用javascript函数。我对我没有意义。

以下是代码的作用。

$('expenses_txt').live(\'keyup\', function() {
    $(this).typeWatch({ highlight: true, wait: 500, captureLength: 0, callback: calculate_expenses });
});

“Calculate_expenses”是一个javascript函数,它使用jquery ajax调用一个php页面,该页面返回在一个span中显示的数据。

我正在使用firebug来帮助我调试,而在Calculate_expenses函数中,我调用了一个“console.log”来调试此函数。

以下是最新消息。当我发生这种情况时,我只在DOM中有一个输入框,当我只按下一个键时,控制台中的输出就会发出一个调试信息,当我在同一个输入框中再次按下一个键输出时控制台加倍(即,Calculate_expenses函数被调用两次,但应该只被调用一次),当我再次按一个键(总共3次按键)时,控制台中的输出发出3次调用Calculate_expenses函数现在.....等等。我真的不知道这里发生了什么。代码在我看来,它只会调用Calculate_expenses函数1次,但是当使用firebug时,它实际上是在我不希望它时被反复调用。

有什么想法吗?这是我正在使用的方式.live()如果我只是使用“keyup”事件它工作正常,问题是我需要使用typeWatch插件来延迟ajax调用,直到键入完成并且keyup事件也触发不久。我使用live()的原因是因为我动态地将元素添加到dom中,这是我能够弄清楚如何使用typeWatch和动态添加元素到dom的唯一方法,需要总结... < / p>

您的想法表示赞赏。感谢。

4 个答案:

答案 0 :(得分:0)

$('expenses_txt').live()块放在哪里?听起来好像被多次触发了。

$('expenses_txt').live()行上设置断点(firebug脚本选项卡,单击行号周围的左边距)。它应该只触发一次。如果它多次触发,你会很方便地看到一个堆栈跟踪(这应该会让你回到罪魁祸首)。

另外,在闭包内设置断点(使用typeWatch的地方)。 typeWatch部分可能是罪魁祸首,因为它在每个keyup上重新实例化(无论this是否已被“处理​​”(并且多次绑定回调)。

如果它的类型观察在工作,你会想要检查它是否以某种方式绑定。最简单的方法是以某种方式标记DOM元素。例如,您可以使用:

jQuery('#element').data('hasTypeWatch',true) 

最初设置标志。使用以下方法检查:

jQuery('#element').data('hasTypeWatch')

检查插件文档以查看作者已经以某种方式解释了这一点。

答案 1 :(得分:0)

这是一个模型:

function handleData(data){
    console.log(data);
    $("#results").append("<p>"+ data +"</p>");
}

$(function(){
    $("#inputElm").focus();
    $("#inputElm").live('keyup', function(){
        $(this).typeWatch({
            callback: handleData,
            wait: 500,
            captureLength: 0
        });
    });
});

请注意,根据koobz的注释,控制台会在每个keyup上记录对typeWatch方法的多次调用。我想你想省略$ .live()处理程序,只需将typeWatch附加到你的输入。

答案 2 :(得分:0)

嗯,我还是很困惑。 Koobz,感谢firebug提示。我发现了我可以看到脚本的位置,但是断点似乎没有工作,或者停止代码,它会在我的主应用程序加载的.js文件中停止代码,但脚本是当特定页面加载时似乎没有识别断点并停止它们时动态添加,因此我无法单步执行代码。

我注意到一些奇怪的东西,但它可能只是我作为怪人,但jquery函数显示没有$()。例如: 我的源代码中的jquery代码编写如下:

$('income_txt')。live('keyup',function(){         $(this).typeWatch({highlight:true,wait:500,captureLength:-1,callback:calculate_income}); });

但是当查看firebug脚本选项卡时,它看起来像这样:

function(){    $(this).typeWatch({highlight:true,wait:500,captureLength:-1,callback:calculate_income}); }

这是jquery所禁止的吗?我假设它被绑定到“选择器”,因此不需要在它前面显示选择器,而只是使用“function()”......这是正确的吗?

关于.live()内容的任何其他想法,或者使用typeWatch的不同解决方法,无论我尝试它还是多次调用该函数,除非我删除.live()。如果我不使用.live(),则typewatch会对keyup事件起作用,但是使用.clone(true)动态添加到dom的新元素对该对象不起作用,并且typeWatch不会触发。我不知道如何将新创建的对象绑定到使用typewatch的事件,而不是使用.live(),这会导致其他问题。如果我忘记使用typeWatch并将我的keyup事件绑定到选择器它可以工作,但是这样做的主要问题是它调用ajax太快并且在每次击键时都会出现问题。

还有其他方法可以完成我想要做的事情吗?谢谢你的帮助。

答案 3 :(得分:0)

好吧,没有任何关于live和typewatch的工作......解决方法是使用onblur并让.clone()复制它。