2009-01-05 62 views
29

我有這樣的代碼:在IE中支持每個JavaScript?

<script> 
function toggle(source) { 

    checkboxes = document.getElementsByName('DG1'); 
    for each(var checkbox in checkboxes) 
    checkbox.checked = source.checked; 

    checkboxes = document.getElementsByName('DG2'); 
    for each(var checkbox in checkboxes) 
    checkbox.checked = source.checked; 

    checkboxes = document.getElementsByName('DG3'); 
    for each(var checkbox in checkboxes) 
    checkbox.checked = source.checked; 

    checkboxes = document.getElementsByName('DG4'); 
    for each(var checkbox in checkboxes) 
    checkbox.checked = source.checked; 

    checkboxes = document.getElementsByName('DG5'); 
    for each(var checkbox in checkboxes) 
    checkbox.checked = source.checked; 
} 
</script> 

<input type="checkbox" onClick="toggle(this)" />Select All<br/> 

<form method=POST action="DGUsageServlet"> 
    <input type="checkbox" name="DG1">DG1</input> 
    <input type="checkbox" name="DG2">DG2</input> 
    <input type="checkbox" name="DG3">DG3</input> 
    <input type="checkbox" name="DG4">DG4</input> 
    <input type="checkbox" name="DG5">DG5</input> 
</form> 

我怎樣才能讓上面的腳本在IE工作?

+0

縮進代碼4個空格將爲您提供代碼格式。 – 2009-01-05 07:01:14

回答

38

Internet Explorer不支持「for each」循環。您需要更改代碼使用常規的for循環:

function toggle(source) { 
    var checkboxes = document.getElementsByName('DG1'); 
    for (var i = 0; i < checkboxes.length; i++) { 
     checkboxes[i].checked = source.checked; 
    } 
    ... 
} 

或者,你可以使用像jQuery庫,像這樣做:

function toggle(source) { 
    $("input[name^=DG]").attr("checked", source.checked); 
} 

編輯:此外,方式你使用「for each」可能並不總是做你想要的東西,即使在Firefox中也是如此。類似於「for(key in object)」循環,「for each」遍歷全部對象的屬性,包括來自其原型的屬性。它真的用於迭代對象屬性,而不是數組。

在JavaScript 1.7,你可以創建一個像這樣的陣列正常工作的Iterator:

for each (let [i, checkbox] in Iterator(checkboxes)) { 
     checkbox.checked = source.checked; 
    } 

當然,在Firefox這僅適用2.0+。

+1

是的。多個JavaScript實現頭上的痘。 – 2012-04-21 01:46:11

+3

當天,您只需在多種體系結構中兼容* source *即可。現在,您必須在多種瀏覽器架構上實現「二進制」兼容,再加上一堆鬆散散落的磚塊,其中有一隻死獾被困在底下,尖叫着憐憫。 – 2012-11-06 01:14:15

+0

-1由於IE8中的toString,`[1,2,3] .length`可能是4。更好地使用hasOwnProperty。 – 2013-10-08 15:22:29

2

要完成馬修Crumley的回答,你也可能有一個問題,在IE中getElementByName()故障,解釋here

很少使用getElementsByName()方法是DOM 1級規範的一部分,由支持Internet Explorer和Mozilla/Firefox。 getElementsByName()

根據HTML 4.01規範,唯一支持NAME屬性的元素是BUTTON, TEXTAREA, APPLET, SELECT, FORM, FRAME, IFRAME, IMG, A, INPUT, OBJECT, MAP, PARAM and META。所以在內放置一個DIV實際上是無效的HTML。

(所以它會在你的情況下工作(一個INPUT場的NAME),但它是不安全的使用它在IE)

萬盎司/ Firefox不會有這個問題,將愉快地返回所有三個DIV元素。但MSIE會將其無效NAME屬性作爲expando attribute並且排除那些元件

一種可能的修復與this script給出。


注意:當你編寫一個for,alwatys然後添加封閉卷曲括號{ and }:它是安全的。如果在循環中添加第二行代碼,將由for塊考慮。

0

我會把它清理一下。

function select(){ 
    var butt = document.getElementById('selectall'); 
    butt.onclick = selectall; 

    function selectall(){ 
     for(var i=1;i<6;i++){ 
      var id='DG'+i; 
      var all = document.getElementById(id); 
      all.setAttribute('checked','checked'); 
     } 
    } 
} 

,但它僅適用於的getElementById()(而不是getElementsByName(),有什麼我不明白)。只需添加到每個輸入id ='selectall',id ='DG1'...

3

可以在Internet Explorer中爲每個修改後的表單使用,其語法如下。

var checkboxes = document.getElementsByName('DG2'); 
for (var i in checkboxes) 
    checkboxes[i].checked = 'true'; 
4

本地IE8是過時的,以的foreach,但我怎麼使用jQuery,我選擇了jQuery.each來克服這個問題。

我複製並粘貼到jQuery的API文檔:

var obj = { 
   "flammable", "inflammable" 
   "duh": "no duh" 
}; 
$. each (obj, function (key, value) { 
   alert (key + ":" + value); 
}); 

http://api.jquery.com/jQuery.each/

5

我覺得jQuery.each是它

var idArr = ["LocationFirst","LocationSecond","LocationThird","LocationFourth","LocationFifth"]; 

$.each(idArr,function(index, entry) { 
    //some code 
}); 

它會遍歷所有的最佳解決方案數組「idArr」中的元素,並可以對每個元素做一些事情。

3

我有一個問題用foreach在IE 11

,我發現這樣的

Array.prototype.slice.call(document.getElementsByName('element_name')).forEach(function (el) { 
    if (el.checked) { 
     console.log('checked'); 
    } 

這是很好的工作對我來說是變通的解決方案。