Пара вещей там:: -)
1) addEventListener
и removeEventListener
работают с более новой цепочкой обработчиков DOM2, которая полностью отделена от более старого стиля "DOM0" (атрибуты onXYZ
). Таким образом, вы не можете удалить обработчик с помощью removeEventListener
, который изначально был назначен с помощью onXYZ
attriubte. Для этого присвойте "" свойству отраженного атрибута.
element.onmouseover = "";
2) Когда вы используете removeEventListener
, вы должны передать такую же ссылку на функцию , которую вы использовали изначально. Так что это никогда ничего не удалит:
element.removeEventListener('mouseout', function(){changeImageSrc('ownedimage' + jsid, 'images/collection/got.gif')}, false);
... потому что он создает совершенно новую функцию для передачи в removeEventListener
, и поскольку эта функция отсутствует в цепочке обработчика событий, вызов игнорируется.
Я бы, вероятно, подошел к проблеме, имея отдельный обработчик событий, но затем изменив данные, с которыми он работает. Вы можете сделать это, сохранив URL альтернативного изображения на самом фактическом элементе, используя атрибут data-xyz
(скажем, data-oversrc
и data-stdsrc
или что-то подобное). Затем две ваши функции (одна для наведения мыши, другая для наведения мыши), которые изменяют URL в зависимости от изображения:
function handleMouseOver() {
this.src = this.getAttribute('data-oversrc');
}
function handleMouseOut() {
this.src = this.getAttribute('data-stdsrc');
}
Я бы полностью отбросил обработчики onXYZ
из элементов и заменил их одноразовыми addEventListener
(attachEvent
в IE), которые назначают оба из них.
data-xyz
атрибуты, как и все пользовательские атрибуты, недопустимы в HTML4 и более ранних версиях. Начиная с HTML5, они проверяются, и, поскольку ни у одного из основных браузеров нет проблем с недопустимыми атрибутами, вы можете сразу начать использовать их.
Не по теме # 1 : В наши дни я обычно рекомендую использовать библиотеку JavaScript, чтобы сгладить различия в браузерах и реализовать для вас полезные функции. Например, ваш код, использующий addEventListener
и removeEventListener
, не будет работать в IE до IE9, потому что у него просто нет этих методов. Если вы используете библиотеку, такую как jQuery , Прототип , YUI , Закрытие или любой из нескольких других , они будут заниматься этим для вас, чтобы вы могли сосредоточиться на собственной добавленной стоимости.
Не по теме # 2 : Событие mouseover
происходит многократно, когда мышь проходит над элементом, и она и mouseout
всплывают в DOM. Это означает, что для таких эффектов, как ваш, если вы не можете использовать CSS (и не можете использовать IE6), вам лучше использовать события mouseenter
и mouseleave
в большинстве случаев. Но это специфичные для IE события, которые не поддерживаются большинством других браузеров. Войдите в любую приличную библиотеку JavaScript. :-) Они будут эмулировать mouseenter
и mouseleave
в браузерах, которые не поддерживают их напрямую. Из списка выше я знаю наверняка, что jQuery и Prototype делают это; Я был бы удивлен, если бы другие не имели подобную функциональность.