ключевое слово "this" в IE - PullRequest
       50

ключевое слово "this" в IE

0 голосов
/ 04 декабря 2009

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

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

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

(http://math.davehampson.net)

Ответы [ 3 ]

4 голосов
/ 04 декабря 2009

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

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

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

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

Element.extend(this);

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

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

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

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

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

1 голос
/ 04 декабря 2009

Попробуйте использовать это вместо:

$(this).toggleClassName('selected')

Подробная причина, почему здесь: http://prototypejs.org/learn/extensions/

0 голосов
/ 04 декабря 2009

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

...