Все коллеги по веб-интерфейсу хорошо знакомы с document.getElementById. В процессе разработки нам часто приходится использовать его для получения элемента с идентификатором страницы xx. Поскольку старый прототип JS-библиотеки стал популярным, всем нравится сокращать его вот так.
Скопируйте код кода следующим образом:
// Метод 1
функция $(id){ return document.getElementById(id });
Кто-нибудь когда-нибудь задумывался, почему написано так, а не так?
Скопируйте код кода следующим образом:
// Метод 2
вар $ = document.getElementById;
Написание $ таким образом будет более кратким и понятным. Назначьте метод документа getElementById переменной $ и используйте $ для получения элемента с идентификатором страницы xx. Фактически, метод 2 возможен в IE6/7/8 (в IE9 есть некоторые изменения), но не в Firefox/Safari/Chrome/Opera. Пожалуйста, также проверьте это самостоятельно.
Почему Firefox/Safari/Chrome/Opera не может получить его методом 2. Причина в том, что внутренняя реализация метода getElementById в этих браузерах должна полагаться на этот (документ), а IE в этом не нуждается. Другими словами, метод 2 говорит, что он отсутствует при вызове в Firefox/Safari/Chrome/Opera. Ниже приведен простой пример.
Скопируйте код кода следующим образом:
//Определяем функцию show
функция show(){alert(this.name);}
//Определяем объект p с атрибутом name
вар p = {name:'Джек'};
show.call(p); // -> 'Джек'
показать(); // -> ''
show.call(null); // -> ''<BR>
Вы можете видеть, что на это опирается реализация show (проще говоря, это используется в теле метода). Поэтому, если в среде (контексте выполнения) при вызове нет атрибута name, ожидаемый результат не будет получен.
Другими словами, IE6/7/8 не использует это при реализации document.getElementById, но IE9/Firefox/Safari/Chrome/Opera должен использовать это, где это объект документа. Когда метод 2 вызывается напрямую, внутренним объектом this является объект окна, поэтому метод 2 не может получить элемент, как правило, на основе идентификатора в Firefox/Safari/Chrome/Opera.
Если вы измените среду выполнения document.getElementById на document вместо window, вы сможете использовать $ как обычно. следующее
Скопируйте код кода следующим образом:
// Исправление document.getElementById
document.getElementById = (функция (fn) {
функция возврата(){
вернуть fn.apply(документ,аргументы);
};
})(document.getElementById);
// После восстановления присвойте значение $, $ можно будет использовать как обычно.
вар $ = document.getElementById;
Опять же, новый метод привязки функции в ECMAScript5 может достичь того же эффекта.
Скопируйте код кода следующим образом:
// Метод 3
var $ = document.getElementById.bind(документ);
Но в настоящее время метод 3 поддерживается только IE9/Firefox/Chrome/.
Проанализировав ситуацию с getElementById, легко понять, почему следующие методы различаются в разных браузерах.
Скопируйте код кода следующим образом:
вар prinf = document.write;
prinf('<h3>Test prinf</h3>'); // IE6/7/8 может работать, другие браузеры сообщают об ошибках
вар prinfln = document.writeln;
prinfln('<h3>Test prinfln</h3>'); // IE6/7/8 может работать, другие браузеры сообщат об ошибке
вар перезагрузки = location.reload;
reload(); // IE6/7/8 может работать, другие браузеры сообщат об ошибке
вар идти = History.go;
go(-2); // IE6/7/8 может работать, другие браузеры сообщат об ошибке