2010-04-19 60 views
0

是的,我遇到了這個非常基本的問題(或者看起來很像)。我對JS很新,仍然試圖讓我的頭腦,但我很熟悉PHP,並沒有經歷過這樣的事情。我只是不能清空這個該死的數組,並且每次運行這個時都會將其添加到最後。無法清空JS陣列

我不知道爲什麼,我開始認爲這是某種聯繫方式chekbox編號的命名,但我可能是錯把....

id="alias[1321-213]"id="alias[1128-397]"id="alias[77-5467]"和等等。

我試圖堅持

checkboxes = [];checkboxes.length = 0;

在每一個地方可能。在函數開始之後,在函數結束時,甚至在函數結束之前,即使在函數之前,但它沒有幫助,並且清空此數組的唯一方法是重新加載頁面。請告訴我我做錯了什麼,或者至少將我指向一個我可以RTFM的地方。我完全沒有想法。

function() { 

    var checkboxes = new Array(); 
    checkboxes = $(':input[name="checkbox"]'); 

     $.each(checkboxes, 
      function(key, value) { 
        console.log(value.id);        
        alert(value.id); 
      } 
     ); 
    checkboxes.length = 0;       
} 

我也看過Mastering Javascript Arrays 3次,以確保我沒有做錯事,但仍然無法弄清楚....

+0

你想清空數組,或創建一個新的數組並將其分配給同一個「checkboxes」變量? – Greg 2010-04-19 20:31:51

+0

我真的不知道該怎麼做,但是這個數組必須在每次函數運行時用動態數量的元素重新填充/重新創建。 – solefald 2010-04-19 20:36:49

+0

我很確定雙引號不應該在jQuery選擇器中。你有沒有試過'checkboxes = $('input [type = checkbox]');'獲取頁面上的所有複選框? – Ricket 2010-04-19 21:20:39

回答

4

我覺得有走出來的,是因爲你清除陣列很多困惑 - 只是也許不是你想要的目的,或在錯誤的時間,等

function() { 
    var checkboxes = new Array();    // local-scope variable 
    checkboxes = $(':input[name="checkbox"]'); // new instance 

    $.each(checkboxes, /* ... */);    // (truncated for brevity) 

    checkboxes.length = 0;      // this clears the array 
               // but, for what...? 
               // nothing happens now 
} 

根據你的代碼片段,每次調用函數都會重新創建並清除數組。但是,所有使用數組的操作都是在數組滿了的情況下完成的(清除後沒有任何反應)。

此外,checkboxes是該函數的一個私有變量。該變量僅在執行該功能期間存在,並且一旦該功能完成就被遺忘。

那麼,什麼是大局? 爲什麼你想清除數組?


要猜測,這聽起來像你打算清除它的下一次函數調用。
即(在doSomething填補了函數名):

doSomething(); // log all array elements and clears the array 
doSomething(); // does nothing, since the array is already empty 

要做到這一點,你需要在一個位置來定義checkboxes功能之外,無論是作爲一個全局變量或使用閉包(重更建議,雖然比較複雜,選擇):

注意:如果你還沒有關閉前處理,他們可能不只有一個實例後太大的意義。但是,有thousands of resources available,包括Stack Overflow,以幫助解釋他們比我在這裏更好。

// closure (or instantly-called function) 
// allows for defining private variables, since they are only known by 
// code blocks within this function 

(function() { 
    // private (closure-scoped) variable(s) 
    var checkboxes = $(':input[name="checkbox"]'); 

    function doSomething() { 
     $.each(checkboxes, /* ... */); 

     checkboxes.length = 0; 
    } 
})(); 

閉合將運行一次,限定checkboxes作爲輸入的陣列而doSomething將清除之前迭代的陣列。現在

,最後一步是暴露doSomething - 事業,與checkboxes,它也是私有的。您可以通過完成從封閉傳遞函數引用給一個變量封閉外露出它:

var doSomething = (function() { 
    /* ... */ 

    return doSomething; // note that you DO NOT want parenthesis here 
})(); 
+0

喬納森,非常感謝你的詳細解釋。我真的想給你一個投票,但我有點害羞,能夠這樣做。不幸的是,將新的數組定義放在我的函數外面並沒有幫助。我嘗試過每一個可能(並且邏輯上)可能的單一位置,但都無濟於事。新的元素只是被添加到舊的數組中,我無法讓它工作。閉包看起來像一個有趣的概念,但我不認爲我可以在我的代碼中使用它:http://pastebin.com/AFfqKBis 可能我的代碼只是根本錯誤,因爲這是我第一次與JS .. 。 – solefald 2010-04-19 23:14:57

+0

你的問題是在DOM中留下一些亂七八糟的東西,你放在這裏的功能沒問題。真。 – naugtur 2010-04-20 16:19:53

0

什麼這樣做:

checkboxes = new Array(); 
+0

是的。這是函數中的第一行...嘗試在最後添加它也沒有幫助... – solefald 2010-04-19 20:39:09

0

您也可以刪除它。

delete checkboxes; 
+0

對於用'var'語句聲明的變量,'delete'不起作用,那些標識符被設置爲屬性[Variable Object](http://bclary.com/2004/11/07/#a-10.1.3),它們是用'{DontDelete}'特殊屬性創建的,請看這篇文章:[理解'delete'](http://perfectionkills.com/understanding-delete/) – CMS 2010-04-19 21:03:32

2

是定長甚至可能嗎? ;)

任何方式複選框是一個jQuery對象不是數組。

當你做checkboxes = $(':input[name="checkbox"]');它不再是一個數組,並且以前沒有任何影響。如果你用任何我知道的語言給它賦予新的東西,那麼它與變量無關。

你正在做一些jQuery相關的錯誤。請詳細說明,以便我可以幫助

您確定將所有的名稱都設置爲「複選框」嗎?它似乎沒有很多意義。也許你減了$(':input[類型="checkbox"]');

編輯:這很有趣。上面的選擇器也不太好。它應該是:

$('input:checkbox'); 

爲去除填充:

刪除 VARNAME

刪除 arrname [ELEM]

是做正確的方式。

賦值null不會改變長度,但會造成麻煩。

+0

我從一個PHP頁面獲取的數據和複選框轉換爲jQuery UI模式對話框。數據顯示得很好,我可以檢查這個元素並看到一切都是正確的。所有的複選框都具有相同的'name =「複選框」',只是在每次運行後數組似乎沒有被清空。另外,我已經嘗試過刪除複選框,但它似乎也不起作用。也許在我的代碼中有其他地方存在問題,但我只能將其縮小到這個特定的功能... – solefald 2010-04-19 20:44:36

+0

您在選擇它們時出現錯誤。該變量就好了。首先擺脫':'在開始,第二 - 獲取螢火蟲,看看你的網站是否只包含你想要的複選框。我想有些地方有一些舊的隱藏的。 – naugtur 2010-04-19 20:48:31

+0

是的,我使用Chrome和'console.log(value.id);'記錄控制檯中的所有內容。每次我在alert()對話框上點擊確定時,我都可以看到每個複選框標識符都被記錄下來,所以所有元素都在那裏,當我關閉對話框並再次打開它時,複選框數組仍然具有上一次運行的元素在裏面。必須參加會議,我會在回來時報告進度。謝謝 – solefald 2010-04-19 20:59:10

0

重新運行時將再次搜索所有複選框的功能。

考慮這樣的策略:

function() { 
    var checkboxes = $(':input[name=checkbox]:not(.examined)'); 
    checkboxes.addClass('examined'); 

    $.each(checkboxes, function(key, value) { 
     // ... stuff 
    }); 
} 

你也可以使用.data()如果你不想「污染」的DOM。