2014-11-17 30 views
-4

所以當我執行下面的代碼時,它會得到值。雖然程序經過併爲我點擊了一些東西,價值自然會發生變化。但我希望事先保存此值,然後將其與第二個值進行比較。保存具體的值Javascript

執行的代碼:

var Category = []; 

var ID1; 
var ID2; 

var dispatchMouseEvent = function(target, var_args) { 
    var e = document.createEvent("MouseEvents"); 
    e.initEvent.apply(e, Array.prototype.slice.call(arguments, 1)); 
    target.dispatchEvent(e); 
} 

var Level1Cats = document.getElementsByClassName("p-pstctgry-lnk-ctgry "); //GETTING LEVEL 1 CATS 

var Level1CatsLen = Level1Cats.length; //GETTING LEVEL 1 CAT LEN 

for (i = 0; i <= Level1CatsLen-1; i++) { 

    var ID1 = Level1Cats[i].id; 
    var temp1 = Level1Cats[i].innerHTML; 
    temp1.replace(/&amp;/gi, "&").replace(/<[^>]*>/gi, ""); 

    function GoToLevel2(i) { //GO TO NEXT LEVEL! 
    dispatchMouseEvent(Level1Cats[i], "mouseover", true, true); 
    dispatchMouseEvent(Level1Cats[i], "click", true, true); 
    } 

    function GetLevel2() { //GET NEXT LEVEL 
    var Level2Cats = document.getElementsByClassName("p-pstctgry-lnk-ctgry"); 
    return Level2Cats.length; 
    } 

    setTimeout(GoToLevel2(i),100); //RUN IT WITH TIMING 
    var Level2CatsLen = GetLevel2(); 

    // END OF LEVEL 1 
    var extracats2 = Level2CatsLen - Level1CatsLen; 
    console.log(extracats2+"e"); 
    if (extracats2 !== 2 || extracats2 !== 0) { 
     for (ii = 0; ii < extracats2; ii++) { //LEVEL 2 
     console.log(ii); 
     ID2 = Level2Cats[ii+Level1CatsLen].id; 
     var temp2 = Level2Cats[ii+Level1CatsLen].innerHTML; 
     temp2.replace(/&amp;/, "&").replace(/<[^>]*>/gi, ""); 

var Level2Children = []; 
for (l = 0; l < level1CatsLen; l++) { 
    Level2Children.push(Level2Cats[l].id); 
} 

//DO SOMETHING WITH CATEGORIES - Level 1 

Category.push({Name: temp1, ID: ID2, ParentID: 'null', ChildrenIDs: Level2Children}); 

//FINISH 

儘管當它完成,如果我叫Level1CatsLen它不是16,這是inital數現在是33,其是最後階段。

任何想法如何去做這件事?

+0

該值必須生存刷新頁面或不? – Beri

+1

目前還不清楚你在這裏問的問題。 –

+0

U表示類名爲「p-pstctgry-lnk-ctgry」的元素是否會改變,其狀態是否需要存儲? –

回答

0

更新答案

有幾個問題在這裏。

  1. 你有函數聲明控制結構,這是一個語法錯誤中:

    // ... 
    for (i = 0; i <= Level1CatsLen-1; i++) { 
    
        var ID1 = Level1Cats[i].id; 
        var temp1 = Level1Cats[i].innerHTML; 
        temp1.replace(/&amp;/gi, "&").replace(/<[^>]*>/gi, ""); 
    
        function GoToLevel2(i) {      // <=== Error 
        dispatchMouseEvent(Level1Cats[i], "mouseover", true, true); 
        dispatchMouseEvent(Level1Cats[i], "click", true, true); 
        } 
        // ... 
    } 
    

    瀏覽器必須容忍它的傾向,但方式他們容忍它從瀏覽器變化到瀏覽器。要在控制結構中創建一個功能,你需要使用的功能表達,而不是一個函數聲明:

    var GoToLevel2 = function(i) { 
    dispatchMouseEvent(Level1Cats[i], "mouseover", true, true); 
    dispatchMouseEvent(Level1Cats[i], "click", true, true); 
    }; 
    

    但見#2。

  2. 如果你打算將i傳遞給它們,則無需在每個循環中重新創建函數。

  3. setTimeout調用是不正確的:

    setTimeout(GoToLevel2(i),100); 
    

    電話GoToLevel2,傳遞i,並將其返回值setTimeout,完全相同的方式foo(bar())電話bar並將其返回值轉換爲foo

    要設置定時回撥到GoToLevel2,請使用函數引用。爲了確保接收到特定值(i),你可以使用Function#bind得到一個新的功能,將調用GoToLevel2i

    setTimeout(GoToLevel2.bind(null, i),100); 
    

有可能有進一步的問題,這些是那些那跳到我身上。


原來的答覆

你做的是,在這條線:

var Level1CatsLen = Level1Cats.length; 

由於DOM的變化,Level1Cats.length可能會改變(因爲getElementsByClassName返回現場NodeList)但Level1CatsLen不會。

var Level1Cats = document.getElementsByClassName("p-pstctgry-lnk-ctgry"); 
 
var Level1CatsLen = Level1Cats.length; 
 
snippet.log("Initial: Level1CatsLen = " + Level1CatsLen + ", Level1Cats.length = " + Level1Cats.length); 
 
tick(); 
 

 
function tick() { 
 
    var div = document.createElement('div'); 
 
    div.className = "p-pstctgry-lnk-ctgry"; 
 
    div.innerHTML = String(Level1Cats.length + 1); 
 
    document.body.appendChild(div); 
 
    snippet.log("Updated: Level1CatsLen = " + Level1CatsLen + ", Level1Cats.length = " + Level1Cats.length); 
 
    if (Level1Cats.length < 10) { 
 
    setTimeout(tick, 500); 
 
    } 
 
}
.p-pstctgry-lnk-ctgry { 
 
    border: 1px solid #888; 
 
    color: green; 
 
}
<div class="p-pstctgry-lnk-ctgry">1</div> 
 
<div class="p-pstctgry-lnk-ctgry">2</div> 
 
<div class="p-pstctgry-lnk-ctgry">3</div> 
 
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

好吧,所以我相信我可能已經清楚。此頁面具有動態填充的JavaScript類別。對不起,如果這些條款不是正確的使用.. 所以我最初抓住Level1Cats的長度,但它似乎改變了for循環的結束,即使這是在外面。它幾乎就像在調用Level1CatsLen時抓住它。 –

+0

@MattBiggs:我已更新答案以解決您添加的代碼。 –