2016-06-29 9 views
-1

私はこのトラッキングのスニペットを持っています "addToCart.gif"をクリックするたびに4回呼び出すのはなぜですか? 私はそれぞれの場合に "console.log()"を追加しました - そしてそれがループしていることに気付きました。JavaScriptと無限ループ

これは、関数が終了する前に同じ関数を呼び出しているためですか? これを行うには良い方法がありますか?アドバイスできますか?

ありがとうございました!

<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> 

enter image description here

+0

ループでは、代わりに 'count <= 10 'です。 –

+0

"関数が終了する前に"同じ関数を呼び出すのではなく、setTimeout()を使って同じ関数への将来の呼び出しをキューに入れます。 else caseには擬似ループを停止する条件がないので、if条件が満たされないと、elseは永遠に起こり続けます。 – nnnnnn

+0

クリックイベントハンドラを追加する前にjQueryが読み込まれるまで待つのですか?これは悪い考えのようです。 –

答えて

0

この行をチェックし、他のコードが良いようだ、私は参照のみ可能問題は、この行は常にfalseを返すということです。

if(typeof jQuery == 'function' && jQuery(".add-to-cart[src*='addToCart.gif']").length > 0 && count < 10) 

そのはconsitionが

0

falseの場合、他のはええ、私は問題がSetTimeoutaddToCartClickTracking();その通話の両方を使用しているに同意する場合にのみ実行することになっても、コールsetTimeout(addToCartClickTracking,400);が問題をすることはないだろうタイムアウト関数を呼び出して、タイムアウト関数と関数を呼び出す関数をもう一度呼び出します。ポイントを取得します。

私は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(「/製品/」)> 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> 

私はあなたのコードのポイントを誤解場合、私は謝罪し、私は多分にいくつかの助けの私のヒントを願っています君は。がんばろう。