Javascript和无限循环
我有这个跟踪片段(如下) 我想知道为什么每次你点击“addToCart.gif”,它可能会打4个电话。 我在每个if案例中添加了“console.log()”,并注意到它正在循环 这是因为它在函数结束之前调用同一个函数吗? 有没有更好的方法可以让你提出建议 非常感谢你Javascript和无限循环,javascript,jquery,performance,Javascript,Jquery,Performance,我有这个跟踪片段(如下) 我想知道为什么每次你点击“addToCart.gif”,它可能会打4个电话。 我在每个if案例中添加了“console.log()”,并注意到它正在循环 这是因为它在函数结束之前调用同一个函数吗? 有没有更好的方法可以让你提出建议 非常感谢你 <script type="text/javascript">// <![CDATA[ var href = location.href if(href != "" && href.indexOf
<script type="text/javascript">// <![CDATA[
var href = location.href
if(href != "" && href.indexOf("/product/") > 0){
mboxDefine("clicked-addToCart","clicked-addToCart")
var count=0;
function addToCartClickTracking(){
if(typeof jQuery == 'function' && jQuery(".add-to-cart[src*='addToCart.gif']").length > 0 && count < 10){
console.log("adding click tracking")
jQuery(".add-to-cart[src*='addToCart.gif']").click(function(){
mboxUpdate("clicked-addToCart")
});
count=10;
} else {
console.log("trying again")
count++;
setTimeout(addToCartClickTracking,400);
}
}
addToCartClickTracking();
}
// ]]>
</script>
/0){
mboxDefine(“单击添加到艺术作品”、“单击添加到艺术作品”)
var计数=0;
函数addToCartClickTracking(){
if(typeof jQuery==“function”&&jQuery(“.add to cart[src*='addToCart.gif']”)。长度>0&&count<10){
日志(“添加单击跟踪”)
jQuery(“.add to cart[src*='addToCart.gif']”)。单击(函数(){
mboxUpdate(“单击添加到开始”)
});
计数=10;
}否则{
日志(“重试”)
计数++;
设置超时(addToCartClickTracking,400);
}
}
addToCartClickTracking();
}
// ]]>
检查这一行,其他代码看起来不错,我看到的唯一可能的问题是这一行总是返回false
if(typeof jQuery == 'function' && jQuery(".add-to-cart[src*='addToCart.gif']").length > 0 && count < 10)
if(typeof jQuery=='function'&&jQuery(.add to cart[src*='addToCart.gif'])。长度>0&&count<10)
还有调用
setTimeout(addToCartClickTracking,400)
不会产生问题,因为它应该只在另一个if consistion为false时运行是的,我同意问题是同时使用了设置超时
和addToCartClickTracking()代码>它调用一个超时函数,然后再次调用该函数,该函数调用超时函数和。。。你明白了
我认为删除setTimeout,或者更好的方法是替换addToCartClickTracking();用它可以解决你的问题
坦率地说,我不明白递归的意义。你真的可以把它全部删除,只需使用
jQuery(".add-to-cart[src*='addToCart.gif']").click(function(){
mboxUpdate("clicked-addToCart")
});
它能处理你想做的一切。我看到的唯一好处是,您可以处理动态添加的元素,您可以这样做:
jQuery(document).on("click",".add-to-cart[src*='addToCart.gif'], function(){
mboxUpdate("clicked-addToCart")
});
我看到一些其他(次要)建议:
使用$=jQuery(除非有理由不这样做)
不要每次都检查jQuery是否存在(如果确实需要,可以将其设置为变量)
href!=“”&&href.indexOf(“/product/”)>0--这些不能是
如果href存在,则indexOf将抛出错误,即使href不存在,也不需要检查两次
我也觉得检查网页应该不重要,但我不知道你的网站是如何工作的,所以我不能说太多
因此,最后我的建议是将代码更改为以下内容:
<script type="text/javascript">
var href = location.href
var isProductPage=href.indexOf("/product/");
if(!isProductPage){//Do Something if you are on the wrong page}
$(document).on("click",".add-to-cart[src*='addToCart.gif'], function(){
mboxUpdate("clicked-addToCart")
});
</script>
var href=location.href
var isProductPage=href.indexOf(“/product/”);
如果(!isProductPage){//如果您在错误的页面上,请执行某些操作}
$(文档).on(“单击“,”。添加到购物车[src*='addToCart.gif'],函数(){
mboxUpdate(“单击添加到开始”)
});
如果我误解了你的代码,我很抱歉,我希望我的提示可能对你有所帮助。祝你好运。在你的循环中count它不是在“函数结束之前”调用同一个函数,而是在用setTimeout()排队等待将来对同一个函数的调用。else案例没有停止伪循环的条件,因此如果不满足if条件,则else将永远发生。是否尝试在加载jQuery之后再添加click事件处理程序?这似乎不是一个好主意。