Кросс-браузер, метод getAttribute() javascript?

пытается определить подходящий метод кросс-браузера для получения атрибутов с помощью javascript? использование javascript-библиотеки (jQuery/Mootools/etc.) не является вариантом.

Я пробовал следующее, но часто получаю атрибуты "null" или "нет", если IE пытается использовать метод "else". Может ли кто-нибудь помочь?

<script type="text/javascript">
//...
    getAttr: function(ele, attr) {
      if (typeof ele.attributes[attr] == 'undefined'){
        return ele.getAttribute(attr);
      } else {
        return ele.attributes[attr].nodeValue;
      }
    },
//...
</script>


<div>
 <a href="#" onclick="location.href='http://www.yo.com#foo'; return false;">Link</a>
</div>

используя вышеуказанный html, в каждом браузере, как мне getAttr (ele, 'href')? (предполагается, что выбор элемента node не является проблемой)

Ответы

Ответ 1

Что касается вашего обновления вопроса, вы можете попробовать это.

Это может быть излишним, но если getAttribute() и точечная нотация не возвращают результат, он выполняет итерацию через объект attributes, чтобы попытаться найти соответствие.

Пример: http://jsfiddle.net/4ZwNs/

var funcs = {
    getAttr: function(ele, attr) {
        var result = (ele.getAttribute && ele.getAttribute(attr)) || null;
        if( !result ) {
            var attrs = ele.attributes;
            var length = attrs.length;
            for(var i = 0; i < length; i++)
                if(attrs[i].nodeName === attr)
                    result = attrs[i].nodeValue;
        }
        return result;
    }
};

var result = funcs.getAttr(el, 'hash');
Тем не менее, вам нужно провести кросс-браузерное тестирование.: О)

Используя ele.attributes, вам необходимо получить к ним доступ по индексу, например:

ele.attributes[0].nodeName;   // "id" (for example)
ele.attributes[0].nodeValue;  // "my_id" (for example)

Попытка пройти attributes появляется имя атрибута, возвращающее значение, значение которого typeof равно object, поэтому ваш код else работает, хотя ele.attributes[attr] не дает вам нужного значения.

Ответ 2

В подавляющем большинстве случаев вы можете просто использовать встроенную функцию getAttribute.

например.

ele.getAttribute(attr)

Согласно QuirksMode, это должно работать на всех основных браузерах (включая IE >= 6) с небольшим исключением:

В IE5-7 доступ к атрибуту style дает объект, и доступ к атрибуту onclick дает анонимную функцию, обернутую вокруг фактического содержимого.

Ответ 3

Вы пытаетесь получить доступ к свойствам элемента ele, прежде чем вы установили, если эти свойства существуют. Попробуйте такую ​​цепочку доказательств:

if (ele.attributes && ele.attributes[attr] && typeof ele.attributes[attr] == 'undefined')

и др.