Да, это в основном основная проблема с прототипом.
Прототип работает по-разному в разных браузерах. В браузерах, которые позволяют вам играть с прототипами хост-объектов (например, HTMLTableRowElement), он добавляет свои собственные функции, такие как toggleClassName
, в эти прототипы, так что каждый раз, когда вы получаете <tr>
, вы можете вызывать этот метод на нем непосредственно. Woohoo, как удобно!
К сожалению, возможность изменять прототипы узлов DOM - это то, что фактически не поддерживает ни ECMAScript, ни стандарт DOM. Это работает в Firefox, потому что Mozilla хороша, но вы не можете ожидать, что она будет работать во всех браузерах; это конечно не будет работать в IE.
Таким образом, для других браузеров вы должны указать Prototype добавить («augment») свои собственные методы к каждому объекту, с которым вы хотите иметь дело:
Element.extend(this);
Теперь вы можете безопасно звонить this.toggleClassName
во всех браузерах.
После того, как вы добавите этот конкретный <tr>
, каждый раз, когда вы получите к нему доступ в будущем, он все равно будет дополнен, так что вы все равно сможете вызывать toggleClassName
для него. Более того, если вам случится получить доступ к элементу с помощью методов Prototype, таких как $('mytrid')
, он автоматически увеличит его для вас.
Это не удобная функция: это ловушка. Он побуждает вас писать код, который работает в вашем браузере (который поддерживает взлом прототипов), но в другом месте не получится. Он поощряет вас писать код, который работает, если вы взаимодействуете с элементами страницы в определенном порядке, который гарантирует, что все они будут дополнены до вызова расширенных методов, но затем падает, если вы взаимодействуете с элементами в другом порядке.
Это отладочная катастрофа, и именно поэтому я не использую прототип.
(На следующей неделе, для дополнительного удовольствия, я не использую jQuery.)