2

再帰setTimeout関数 getRandomProducts はonloadhtml body タグで呼び出されるため、常に反復されます。

関数 setCategoryTree はonclick、ナビゲーション バーのネストされた ul 内のリンクから呼び出されています。次に、この関数は変数 mainCategory を getRandomProducts に渡します。ここで、変数はその初期化を維持するためにグローバルに宣言されます。

...だから、私がやろうとしているのは、ナビゲーションバーでリンクがクリックされたときに getRandomProducts 関数をリセットし、クリックされたリンクからカテゴリ名を渡すことです。ただし、clearTimeout機能していないように見えるため、複数の再帰ループが同時に実行されるため、反復がより頻繁に発生します。

それだけでなく、グローバル変数が setCategoryTree からのデータを意図したとおりに格納していません (基本的に、静的変数と同様にグローバル変数を使用しようとしています)。window.alertコメント アウトされているで、このすべての動作を確認しました。

関連する Javascript コードは次のとおりです。

var mainCategory = ""; // initialized from setCategoryTree
var category = mainCategory;

function getRandomProducts(category)
{
    //window.alert(category);
    if(typeof category == "undefined")
        category = "all";
    else
        clearTimeout(t);

    var req = new XMLHttpRequest();

    var products = document.getElementById("products");

    req.onreadystatechange = function()
    {
        if( (req.readyState == 4) && (req.status == 200) )
        {
            var result = req.responseText;
            products.innerHTML = result;
        }
    }
    req.open("GET", "default.php?category=" + category, true);
    req.send(null);

    var t = setTimeout("getRandomProducts()", 1000);
}

function setCategoryTree(link)
{
    var categoryTree = document.getElementById("categoryTree");

    /* climbing the DOM-tree to get the category name (innerHTML of highest "a" tag) */
        mainCategory = link.parentNode.parentNode.parentNode.getElementsByTagName("a")[0].innerHTML;

    var subcategory = link.innerHTML;

    categoryTree.innerHTML = "-- " + mainCategory + "  -- " + subcategory;

    getRandomProducts(mainCategory);
}
4

1 に答える 1

1

関数内で変数を設定してtいます。次にこの関数が呼び出されると、変数tは使用できなくなります。

したがって、変数を関数の上に設定します(関数内ではありません)

var randomProductsTimeout = false;

function getRandomProducts(category){

    randomProductsTimeout = setTimeout()[..]
于 2012-04-10T07:32:43.207 に答える