javascript как - getElementsByClassName & IE8:объект не поддерживает это свойство или метод




включить работает (5)

Используйте document.querySelectorAll('.verdana14.toAdd') .

См. Также мою связанную запись в блоге .

На этот вопрос уже есть ответ:

Я знаю, что « getElementsByClassName » не поддерживается IE8 . Знаете ли вы, что я могу использовать вместо этого? Меня раздражает ошибка

«Объект не поддерживает это свойство или метод».

Код HTML:

function sumar() {
var elems = document.getElementsByClassName('verdana14 toAdd');
var myLength = elems.length;
total = 0;
for (var i = 0; i < myLength; ++i) {
   if (elems[i].value!="") {
       total += parseInt(elems[i].value,10);
       }
    }

var promedio = total/myLength;
parseFloat(document.getElementById('promediocal').value = promedio.toFixed(2));
}

Это текст ввода, который вызывает функцию javascript:

<input name='AE_EA_1_BIV_003_2' type='text' class='verdana14 toAdd' id='AE_EA_1_BIV_003_2' style='width:50px' onChange='sumar()'/>
<input name='AE_EA_1_BIV_003_3' type='text' class='verdana14 toAdd' id='AE_EA_1_BIV_003_3' style='width:50px' onChange='sumar()'/>
<input name='AE_EA_1_BIV_003_4' type='text' class='verdana14 toAdd' id='AE_EA_1_BIV_003_4' style='width:50px' onChange='sumar()'/>

использовать jQuery или фильтровать результаты getElementsByTag


Метод getElementsByClassName не поддерживается IE8.

Вы должны использовать document.querySelectorAll('.classname') (работает в IE8 +) или библиотеку, которая реализует эту функциональность - например:

  • jQuery
  • Moo Tools
  • DOJO
  • YUI
  • Prototype

    ... Среди прочих ...

querySelectorAll поддержка:

http://www.quirksmode.org/dom/w3c_core.html#t13

Поддержка getElementsByClassName :

http://www.quirksmode.org/dom/w3c_core.html#t11


Вы можете написать свой собственный. Что-то вроде:

function GEBCN(cn){
    if(document.getElementsByClassName) // Returns NodeList here
        return document.getElementsByClassName(cn);

    cn = cn.replace(/ *$/, '');

    if(document.querySelectorAll) // Returns NodeList here
        return document.querySelectorAll((' ' + cn).replace(/ +/g, '.'));

    cn = cn.replace(/^ */, '');

    var classes = cn.split(/ +/), clength = classes.length;
    var els = document.getElementsByTagName('*'), elength = els.length;
    var results = [];
    var i, j, match;

    for(i = 0; i < elength; i++){
        match = true;
        for(j = clength; j--;)
            if(!RegExp(' ' + classes[j] + ' ').test(' ' + els[i].className + ' '))
                match = false;
        if(match)
            results.push(els[i]);
    }

    // Returns Array here
    return results;
}

Будет работать очень хорошо, но вы можете написать быстрее, если хотите. Затем вы можете просто изменить:

document.getElementsByClassName('verdana14 toAdd');

Для того, чтобы:

GEBCN('verdana14 toAdd');

Основываясь на ответе Markus' и vsync , это расширенная версия. Функция принимает любое количество аргументов. Его можно использовать для установки свойств на узлах DOM и создания глубоких копий значений. Однако первый аргумент дается ссылкой.

Чтобы обнаружить узел DOM, используется функция isDOMNode () (см. Вопрос о переполнении стека JavaScript isDOM - как вы проверяете, является ли объект JavaScript объектом DOM? )

Он был протестирован в Opera 11, Firefox 6, Internet Explorer 8 и Google Chrome 16.

Код

function mergeRecursive() {

  // _mergeRecursive does the actual job with two arguments.
  var _mergeRecursive = function (dst, src) {
    if (isDOMNode(src) || typeof src !== 'object' || src === null) {
      return dst;
    }

    for (var p in src) {
      if (!src.hasOwnProperty(p))
        continue;
      if (src[p] === undefined)
        continue;
      if ( typeof src[p] !== 'object' || src[p] === null) {
        dst[p] = src[p];
      } else if (typeof dst[p]!=='object' || dst[p] === null) {
        dst[p] = _mergeRecursive(src[p].constructor===Array ? [] : {}, src[p]);
      } else {
        _mergeRecursive(dst[p], src[p]);
      }
    }
    return dst;
  }

  // Loop through arguments and merge them into the first argument.
  var out = arguments[0];
  if (typeof out !== 'object' || out === null)
    return out;
  for (var i = 1, il = arguments.length; i < il; i++) {
    _mergeRecursive(out, arguments[i]);
  }
  return out;
}

Некоторые примеры

Установить innerHTML и стиль HTML-элемента

mergeRecursive(
  document.getElementById('mydiv'),
  {style: {border: '5px solid green', color: 'red'}},
  {innerHTML: 'Hello world!'});

Слияние массивов и объектов. Обратите внимание, что undefined может использоваться для сохранения значений в lefthand array / object.

o = mergeRecursive({a:'a'}, [1,2,3], [undefined, null, [30,31]], {a:undefined, b:'b'});
// o = {0:1, 1:null, 2:[30,31], a:'a', b:'b'}

Любой аргумент, не являющийся объектом JavaScript (включая null), будет проигнорирован. За исключением первого аргумента, также удаляются узлы DOM. Остерегайтесь того, что строки, созданные как новые String (), фактически являются объектами.

o = mergeRecursive({a:'a'}, 1, true, null, undefined, [1,2,3], 'bc', new String('de'));
// o = {0:'d', 1:'e', 2:3, a:'a'}

Если вы хотите объединить два объекта в новый (не затрагивая ни один из двух), поставьте {} в качестве первого аргумента

var a={}, b={b:'abc'}, c={c:'cde'}, o;
o = mergeRecursive(a, b, c);
// o===a is true, o===b is false, o===c is false

Изменить (по ReaperSoon):

Также объединить массивы

function mergeRecursive(obj1, obj2) {
  if (Array.isArray(obj2)) { return obj1.concat(obj2); }
  for (var p in obj2) {
    try {
      // Property in destination object set; update its value.
      if ( obj2[p].constructor==Object ) {
        obj1[p] = mergeRecursive(obj1[p], obj2[p]);
      } else if (Array.isArray(obj2[p])) {
        obj1[p] = obj1[p].concat(obj2[p]);
      } else {
        obj1[p] = obj2[p];
      }
    } catch(e) {
      // Property in destination object not set; create it and set its value.
      obj1[p] = obj2[p];
    }
  }
  return obj1;
}






javascript internet-explorer-8