0

この関数は、ループを開始せずに継続的に実行されます。

setTimeout は、refreshTags 関数の実行を許可するためのものです。

私は最高のスクリプトではないと確信しています - 私は教祖ではありません - しかし、このスクリプトが無限ループで実行されている理由について何か考えはありますか?

function addTag() 
{
console.log('running'); 
refreshTags(); 
var t = document.getElementById('existingTags').textContent.match(/tag1/); 
var u = 'tag1'; 
if (t == u) {alert('This ticket has already been resolved by our team.')}; 
if (t != u) 
    {
    refreshTags();
    setTimeout(function() 
    {
        document.getElementById('tagToAdd').value = 'tag1';
        document.getElementById('tagSubmit').click(); 
        alert('Ticket resolved!'); 
    }, 2000)
}; 
}

編集: 以下の addTag を呼び出すコード。

var resolveButton = document.createElement("a");
resolveButton.href = '#';
resolveButton.innerHTML = '<span>Resolve</span>';
resolveButton.setAttribute("onClick", "addTag()");
resolveButton.setAttribute("type", "button");
resolveButton.setAttribute("class", "button1");

var cha = document.getElementById('chatter_view');
cha.parentNode.insertBefore(resolveButton, cha);
4

1 に答える 1

0

この特定のコードに無限ループがある理由を答える代わりに、「無限ループをどのように防止してデバッグしますか?」というより大きな質問に答えようとします。

私が見つけた最善の防御策の 1 つは、制御が常に一方向に流れるようにコードを構成することです。ここにはさまざまなレイヤーがあります。

  • onclick イベント ハンドラが addTag() を呼び出しています。
  • addTag() は refreshTags() を呼び出しています
  • addTag() は setTimeout を呼び出しており、後で DOM のクリックをトリガーします。

コードの流れを一方向に保つための簡単な修正は、専用のイベント ハンドラを作成することresolveButtonOnclick() { addTag() }です。resolveButtonOnclick は、resolveButton の onclick ハンドラーからのみ呼び出されます。これにより、コードの監査がはるかに簡単になります。console.log('running')addTag() 関数の先頭にすでに a を配置しています。ここで、console.log() を resolveButtonOnclick() に配置すると、onclick ハンドラーが無限ループに含まれているかどうかがすぐにわかります。

あなたのコードを見ることはできませんが、refreshTags() が addTag() を呼び出すと、制御フローが循環することになります。これは必ずしも悪いことではありませんが、ある時点で終了することに特に注意する必要があります。

最も大きな循環制御フローは、addTag() が .click() メソッドを使用して DOM にコールバックすることです。Javascript から直接フォームを送信するか、XHR を使用する方が、より速く、よりクリーンになります。

このループをデバッグするには、console.log() を使用するのが適切です。それらをさらに追加し (たとえば、addTag() を呼び出すすべての場所)、どこから呼び出されているかを調べます。他に試すことができるのは、Chrome の DevTools を使用することです。addTag() の先頭に呼び出して、スタック トレースを調べます。

于 2012-08-27T05:11:43.147 に答える