Перегрузка функции JavaScript getElementById - PullRequest
0 голосов
/ 28 июля 2011

У меня проблема со старым сайтом. Весь код JavaScript на нем использует функцию getElemenById. Но теги разметки сайта не имеют свойства id, вместо этого они имеют только свойство name. Хотя это все еще работает для IE, браузер возвращает элементы даже по свойству name. Для всех остальных браузеров это ошибка в JS. Интересно, есть ли способ перегрузить эту функцию в другом браузере, чтобы сделать веб-сайт совместимым с другими браузерами?

Ответы [ 3 ]

12 голосов
/ 28 июля 2011

Нет способа «перегрузить» функцию в JavaScript в том смысле, что вы сделали бы это в строго типизированном языке, таком как Java или C. На самом деле, каждая функция в JavaScript уже перегружена в этом смысле, так что вы можетеВызовите любую функцию с любым числом и типом аргументов.

Однако вы можете вставить собственный прокси перед существующей версией и реализовать прокси с любым поведением, которое вы предпочитаете.Например:

document._oldGetElementById = document.getElementById;
document.getElementById = function(elemIdOrName) {
    var result = document._oldGetElementById(elemIdOrName);
    if (! result) {
        var elems = document.getElementsByName(elemIdOrName); 
        if (elems && elems.length > 0) {
            result = elems[0];
        }
    }

    return result;
};
1 голос
/ 28 июля 2011

Попробуйте getElementsByName. Это используется для получения коллекции элементов относительно их имени

1 голос
/ 28 июля 2011

Я бы не рассчитывал на корректную работу getElementById.Звучит достаточно просто, чтобы выполнить поиск и замену, которая выполняет что-то вроде этого:

// Replace
document.getElementById("foo");
// With
myGetElementById("foo", document);

// Replace
myElement.getElementById("foo");
// With
myGetElementById("foo", myElement);

Тогда вы можете myGetElementById, как хотите, не беспокоясь о том, что может произойти в старых IE, а что нет, если вы переопределите getElementById.

...