2009-12-04 6 views
0

Итак, я использую этот фрагмент <tr onclick="this.toggleClassName('selected')"> на веб-странице. (функция Prototype.js). Он отлично работает. Все, что я делаю, это щелкнуть по строке таблицы, и, похоже, она будет выбрана. Он работает везде, кроме IE и Opera. Это просто удобство, поэтому мне все равно, работает ли оно, но в IE он выдает ошибку и спрашивает пользователя, хочет ли он/она отлаживать.«это» ключевое слово в IE

Сообщение об ошибке, которое я получаю, это «Объект не поддерживает это свойство или метод». Какой объект или какой метод он может иметь в виду? Любые мысли о простом способе реализации этой функции в IE? Как насчет того, чтобы просто не высылать сообщения об ошибках пользователю?

Спасибо, Дейв

(http://math.davehampson.net)

ответ

4

Да, это в основном основная проблема с прототипом.

Прототип работает по-разному в разных браузерах. В браузерах, которые позволяют играть с прототипами объектов хоста (например, HTMLTableRowElement), он добавляет к этим прототипам свои собственные функции, такие как toggleClassName, так что каждый раз, когда вы получаете <tr>, вы можете напрямую вызвать этот метод на нем. Woohoo, как удобно!

К сожалению, возможность изменения прототипов узлов DOM - это то, что не поддерживает стандарт ECMAScript или DOM. Это работает в Firefox, потому что Mozilla хорош, но вы не можете ожидать, что он будет работать во всех браузерах; он, конечно, не будет работать в IE.

Так что для других браузеров, вы должны сказать Prototype добавить («увеличить») свои собственные методы на каждый объект, который вы хотите иметь дело с:

Element.extend(this); 

Теперь вы можете вызвать this.toggleClassName безопасно во всех браузерах ,

После того, как вы увеличили этот конкретный <tr>, каждый раз, когда вы будете получать к нему доступ в будущем, он по-прежнему будет дополнен, поэтому вы можете по-прежнему называть его toggleClassName. Более того, если вам придётся получить доступ к элементу через методы Prototype - например, $('mytrid') - он автоматически увеличит его для вас.

Это не удобная функция: это ловушка. Это побуждает вас писать код, который работает в вашем браузере (который поддерживает прототип-взлом), но не удастся в другом месте. Это побуждает вас писать код, который срабатывает, если вы взаимодействуете с элементами страницы в определенном порядке, что гарантирует, что все они будут дополнены до того, как будут вызваны расширенные методы, но затем упадет, если вы взаимодействуете с элементами в другом порядке.

Это отладочная катастрофа, и именно поэтому я не использую прототип.

(На следующей неделе, для дополнительной забавы пламени, почему я не использую jQuery.)

+0

Это более или менее то, почему я тоже не использовал Prototype, но я должен отметить, что если вы всегда выполняете '$ (this) .whatever()', то Prototype достаточно умен, чтобы не повторно расширять элемент, который уже был продлен. Это может уменьшить зависимость от вещей, происходящих в определенном порядке. –

+0

ОК, я буду укусить (хотя это не по теме), почему бы вам не использовать jQuery? Я обещаю, что не буду тебя плакать ;-) –

+0

Спасибо! Я еще не понимаю 100%, но это было трюк! –

0

'это' ключевое слово является Javascript фундаментальных и в вашем примере вернет узел tr dom. я подозреваю, что prototypejs присоединяет методы к dom-узлам, и по какой-то причине это не делается/работает для IE и Opera.