Для каждой поддержки JavaScript в IE?
У меня есть этот код:
<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>
Как я могу заставить вышеуказанный script работать в IE?
Ответы
Ответ 1
Internet Explorer не поддерживает "для каждого" цикла. Вам нужно будет изменить код для использования регулярных циклов:
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);
}
Изменить: Кроме того, способ, которым вы используете "для каждого", может не всегда делать то, что вы хотите, даже в Firefox. Подобно "for" (key in object) "loop", для каждого "итерации над all свойства объекта, включая свойства из его прототипа. Это действительно сделано для итерации над свойствами объекта, а не массивами.
В JavaScript 1.7 вы можете создать Iterator, который корректно работает с такими массивами:
for each (let [i, checkbox] in Iterator(checkboxes)) {
checkbox.checked = source.checked;
}
Конечно, это работает только в Firefox 2.0 +.
Ответ 2
Или вы можете попробовать и расширить объект Array для браузеров, которые не поддерживают метод foreach на нем, как предлагается здесь:
https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Objects:Array:forEach#Compatibility
Ответ 3
Я думаю, что jQuery.each - лучшее решение для него
var idArr = ["LocationFirst","LocationSecond","LocationThird","LocationFourth","LocationFifth"];
$.each(idArr,function(index, entry) {
//some code
});
он будет перебирать все элементы в массиве "idArr" и может делать что-то с каждым элементом.
Ответ 4
Изначально IE8 устарел до foreach, но как я могу использовать jQuery, я решил использовать jQuery.each для решения этой проблемы.
Моя копия и вставка из jQuery API Doc:
var obj = {
"flammable", "inflammable"
"duh": "no duh"
};
$. each (obj, function (key, value) {
alert (key + ":" + value);
});
http://api.jquery.com/jQuery.each/
Ответ 5
Можно использовать модифицированную форму для каждого в Internet Explorer, синтаксис следующий.
var checkboxes = document.getElementsByName('DG2');
for (var i in checkboxes)
checkboxes[i].checked = 'true';
Ответ 6
У меня была проблема с forEach на IE 11
И я нашел обходное решение, подобное этому
Array.prototype.slice.call(document.getElementsByName('element_name')).forEach(function (el) {
if (el.checked) {
console.log('checked');
}
Он работает для меня хорошо.
Ответ 7
Чтобы ответить Мэтью Крамли, у вас также может возникнуть проблема с неудачей getElementByName()
в IE, объясненной здесь:
Малоиспользуемый метод getElementsByName()
является частью спецификации DOM Level 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
. Поэтому для размещения NAME
внутри DIV
на самом деле является недопустимым HTML.
(Таким образом, он будет работать в вашем случае (NAME
поля INPUT
), но использовать его в IE небезопасно)
Moz/Firefox не имеет проблемы с этим и с радостью вернет все три элемента DIV. Но MSIE рассматривает его как недействительный атрибут NAME
как атрибут expando и исключает эти элементы
Возможное исправление задается с помощью этого script.
Примечание: когда вы кодируете a for
, alwatys добавляет, затем прилагая керлинг-скобки { and }
: это безопаснее. Если вы добавите вторую строку кода в свой цикл, это будет учтено блоком for
.
Ответ 8
Я немного почистил бы его.
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'...