Подтвердить что ты не робот

Для каждой поддержки 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?

4b9b3361

Ответ 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 +.

Ответ 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'...