我真的很困惑,甚至不确定要搜索什么来寻找答案。我正在多次调用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>
您的想法表示赞赏。感谢。
答案 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)
我注意到一些奇怪的东西,但它可能只是我作为怪人,但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()复制它。