Jump to content
  • 0

addEventListene


Дядя Саша
 Share

Question

Есть переменная (child) которая содержит ссылку на объект, на который надо повесить обработчик события onclick.

Делаю так:

child.addEventListener ? child.addEventListener("onclick", setAtributes(), true) :
child.attachEvent("onclick", setAtributes);

attachEvent в осле работает замечательно, а вот addEventListener в опере все же вешает обработчик, но он по какой то причине выполняется сразу при загрузке страницы???.

В ФФ совсем ничего не вешает, но при первой загрузке выполняется...

Вторая проблема в том - что я не могу получить ид объекта, а мне он очень нужен. Пишу child.id - в ИЕ работает и все.

Посмотреть можно тут - http://workofhouse.narod.ru/mak/

Лутше сперва осликом:)

Link to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 0
...выполняется сразу при загрузке страницы???

Это потому, что Вы сами назначили вызов функции:

child.addEventListener("onclick", setAtributes(), true)

Уберите скобки после имени функции...

Link to comment
Share on other sites

  • 0

Если смысл был в том чтобы поменять обработчик события, то эффекта нет. Думаю чтото не так именно с самим объектом к которому я его (событие) пытаюсь повесить? Потому что ФФ не хочет возвращать даже его тег (в отличии от експлорера) он помоему воспринимает его как текст.

function getA() {
var parent = document.getElementById("menu")
for (var i = 0; i < parent.childNodes.length; i++) {
if (parent.childNodes[i].firstChild) {
child = parent.childNodes[i].firstChild
child.addEventListener ? child.addEventListener("onclick", setAtributes(), true) : child.attachEvent("onclick", setAtributes);
}
}
}

function setAtributes() {
alert("Превед!")
}

parent = document.getElementById("menu") - Это таблица в которой находится пять ссылок, на которые надо повесить обработчик.

У меня такое предчувствие что child в ИЕ возвращает ссылку на A, а в ФФ и Опере например на tbody. Может такое быть?

Наверно надо просмотреть всю таблицу и найти именно А.

if (child.tagName == "A")

Link to comment
Share on other sites

  • 0

Так и знал! Просто напросто надо было проверить тип дочернего узла. У ФФ с этим проблемы...

Сделал так:

function getA(obj) {
var objChild
for (var i = 0; i < obj.childNodes.length; i++) {
if (obj.childNodes[i].nodeType == 1) {
objChild = obj.childNodes[i]
getA(objChild);
if (objChild.nodeName == "A") {
objChild.addEventListener ? objChild.addEventListener("click", setAtributes, true) :
objChild.attachEvent("onclick", setAtributes);
}
}
}
}


function setAtributes() {
alert("Превед!")
}

getA(document.getElementById('menu'));

Правда в опере не работает, хотя ссылка теперь передается верная. Что я заметил еще,

если здесь child.addEventListener("click", setAtributes(), true) : поставить скобки в опере работает, но выполняется первий раз сразу после загрузки страници...

Кто нибудь может чтото посоветовать?

Link to comment
Share on other sites

  • 0

Или как написал AKS поменять truе на false, или просто начать проверять с метода IE.

function getA() {
var t = document.getElementById("menu").getElementsByTagName('a'), l = t.length;
while (l--) {
//t[l].addEventListener ? t[l].addEventListener("click", setAtributes, false) : t[l].attachEvent("onclick", setAtributes);
t[l].attachEvent ? t[l].attachEvent("onclick", setAtributes) : t[l].addEventListener("click", setAtributes, true);
}
}

Link to comment
Share on other sites

  • 0

Спасибо огромное, я уже допер :mad: все работает:) метод возвращает true когда все выполнено успешно, а я его сразу завершил, если я правильно понял.

С этим все хорошо, так теперь опять проблема - опера начинает переходить по пустой ссылке и обновляет страничку((( а мне нельзя этого делать...:mad:

Zeroglif

Да уж. Я столько мучился... А второй вариант гораздо проще, но мне не был известен такой подход (document.getElementById("menu").getElementsByTagName('a')), надо запомнить :)

Link to comment
Share on other sites

  • 0
...просто начать проверять с метода IE.

Ха, а я совсем забыл про "опера'тивный" attachEvent!

Вообще, есть подозрение, что задачу можно решить, вешая обработчик на родителя (в данном случае на таблицу)...

Link to comment
Share on other sites

  • 0
Ха, а я совсем забыл про "опера'тивный" attachEvent!

Вообще начинаю ее тихонько ненавидеть.

Вообще, есть подозрение, что задачу можно решить, вешая обработчик на родителя (в данном случае на таблицу)...

Я буду передавать функции ид нажатой ссылки и выполнять определенные действия

Link to comment
Share on other sites

  • 0

Обратило на себя внимание имя функции-обработчика события click - setAtributes. Мне показалось, что в функции могут происходить довольно простые действия, может быть всего лишь манипуляции с атрибутами стиля. А тогда такую задачу можно решать вообще с помощью псевдоклассов дескриптора <а>...

Link to comment
Share on other sites

  • 0

На самом деле все гораздо хуже :) Мне надо определить ид ссылки на которой был щелчок и сделать видимым соответственно блок над ней. У каждой ссылки есть идентификатор - а1..а5, у блоков m1..m5, думаю прочитать второй символ идентификатора, тоесть номер и прибавить к нему m, получу ид блока. Для блоков задан атрибут visibility: hidden. Надо будет сменить его на visible, при повторном нажатии (или после onmouseout с таймером в пару секунд) обратно спрятать. Это конечно извращение, но мне очень интересно сделать именно так :)

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy