2012-05-14 6 views
0

В частности, я хотел бы переопределить функцию getElementsByClassName, которая доступна в каждом браузере, кроме IE. Вместо этого IE использует querySelectorAll.Переопределить функцию Javascript

Element.prototype.getElementsByClassName = function(className) { 
    if(document.getElementsByClassName) { 
     return this.getElementsByClassName(className); 
    } else if(document.querySelectorAll) { 
     return this.querySelectorAll(className); 
    } 
}; 

Но при запуске кода в Firefox вместо него используется нативная функция. Будет ли это по-прежнему работать как кросс-браузерное решение и вместо этого использовать мой прототип, если getElementsByClassName недоступен или есть способ переопределить встроенную функцию, чтобы мой код использовался каждый раз? Я могу назвать прототип аналогичным именем, но для удобства чтения id предпочитает сохранять его одинаково.

+2

Почему бы вам не использовать настоящую прокладку (полипол)? Это: 'if (! Element.prototype.getElementsByClassName) {Element.prototype.getElementsByClassName = function() {...}; } 'http://polyfilljs.com/polyfills/getelementsbyclassname.html –

+0

Вы сбиты с толку, * getElementsByClassName * - это метод [host] (http://es5.github.com/#x4.3.8), а не [native ] (http://es5.github.com/#x4.3.6). – RobG

+0

@ MattBall - не используйте этот метод. Вы не можете ожидать, что сможете модифицировать ** хост ** объекты или методы таким образом (исследование, почему Prototype.js бросил его как стратегию). И если вы попытаетесь, вы должны хотя бы включить тщательное тестирование функций. – RobG

ответ

1

Я просто хотел добавить ответ Мэтта Болла в качестве истинного принятого ответа на этот вопрос. Как он упомянул, лучше всего использовать полиполк вместо того, как я его первоначально настраивал.

if(!Element.prototype.getElementsByClassName) { 
    Element.prototype.getElementsByClassName = function(className) { 
     return this.querySelectorAll(className); 
    } 
} 
+1

Это не очень хорошее решение, так как многие браузеры не реализуют прототип схемы наследования для объектов DOM (часто те, которые не имеют * getElementsByClassName *). Он также не имеет подходящего определения функции, что очень важно. – RobG

+0

Вы должны взглянуть на то, как на самом деле работает полипол. http://polyfilljs.com/js/mylibs/getelementsbyclassname.js –

+0

@RobG У вас есть лучшее решение, которое вы бы не прочь поделиться? – ryandlf

Смежные вопросы