Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript和无限循环_Javascript_Jquery_Performance - Fatal编程技术网

Javascript和无限循环

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

我有这个跟踪片段(如下) 我想知道为什么每次你点击“addToCart.gif”,它可能会打4个电话。 我在每个if案例中添加了“console.log()”,并注意到它正在循环

这是因为它在函数结束之前调用同一个函数吗? 有没有更好的方法可以让你提出建议

非常感谢你

<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事件处理程序?这似乎不是一个好主意。