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