mootools — использование addEvent к элементу не работает должным образом?

#mootools #addeventlistener

#mootools #addeventlistener

Вопрос:

бьюсь об это головой, и это начинает болеть.

У меня возникли проблемы с добавлением события к элементу. Я могу добавить событие, а затем немедленно вызвать его с помощью element.fireEvent(‘click’), но как только элемент присоединен к DOM, он не реагирует на щелчок.

пример кода:

 var el = new Element('strong').setStyle('cursor','pointer');
el.addEvent('click',function () { alert('hi!'); });
el.replaces(old_element); // you can assume old_element exists
el.fireEvent('click'); // alert fires
  

однако, как только я прикрепляю это к DOM, элемент не реагирует на щелчок. стили зависают (курсор становится указателем при наведении курсора мыши), но событие не срабатывает. также пробовал наведение курсора мыши, но безрезультатно.

какие-либо подсказки здесь? я упускаю что-то основное? Я делаю это повсеместно, но в этом одном случае это не работает.

Редактировать—————-

хорошо, вот еще немного кода. к сожалению, я не могу предоставить реальный код, так как он предназначен для проекта, который все еще находится в жесткой изоляции.

в принципе, все узлы выбираются как «заменяемые», затем json, найденный в атрибуте rel = «», задает основу для того, на что его следует заменить. В данном конкретном случае замененный элемент — это имя пользователя, при нажатии на которое должна отображаться некоторая информация.

опять же, если я запускаю событие непосредственно после его прикрепления, все хорошо, но элемент не реагирует на щелчок после его прикрепления.

HTML————

 <p>Example: <span class='_mootpl_' rel="{'text':'foo','tag':'strong','event':'click','action':'MyAction','params':{'var1': 'val1','var2': 'val2'}}"></span></p>
  

JAVASCRIPT——
предположения:
1. приведенные ниже две функции являются частью более крупного класса
2. ROOTELEMENT устанавливается при инициализации ()
3. MyAction определяется до выполнения любого синтаксического анализа (и должным образом обрабатывается в тесте .fireEvent ())

 parseTemplate: function() {
    this.ROOTELEMENT.getElements('span._mootpl_').each(function(el) {
        var _c = JSON.decode(el.get('rel'));
        var new_el = this.get_replace_element(_c); // sets up the base element
        if (_c.hasOwnProperty('event')) {
            new_el = this.attach_event(new_el, _c);
        }
    });
},

attach_event: function(el, _c) {
    el.store(_c.event '-action',_c.action);
    el.store('params',_c.params);
    el.addEvent(_c.event, function() {
        eval(this.retrieve('click-action')   '(this);');
    }).setStyle('cursor','pointer');
    return el;
},
  

Комментарии:

1. Вы проверяли в firebug, действительно ли элемент имеет размер, который вы ожидаете? Иногда элемент не имеет высоты и его нельзя щелкнуть.

2. Я вижу это, в нем есть текст. Я прикрепляю щелчок к тегу <strong> с текстом внутри него. как указано, изменение курсора курсором мыши на указатель работает просто отлично, но щелчок не срабатывает.

Ответ №1:

Работает просто отлично. Тестовый пример:http://jsfiddle.net/2GX66 /

Комментарии:

1. да, это так, в изолированной скрипке. в данном контексте это не так.

Ответ №2:

отлаживать это непросто, когда вам не хватает содержимого / DOM.

первое — используете ли вы делегирование событий или у вас есть обработчики событий для родительского элемента, которые это делают event.stop() ?

если да, замените на event.preventDefault()

вторая вещь, которую нужно сделать. не заменяйте элемент, а поместите его куда-нибудь еще в первый узел, подобный DOM document.body , и посмотрите, работает ли он там.

если это работает в другом месте, смотрите # 1

хотя я понимаю, что вы сказали «пример кода», вы должны записать это как:

 new Element('strong', {
    styles: {
        cursor: "pointer"
    },
    events: {
        click: function(event) {
            console.log("hi");
        }
    }
}).replaces(old_element);
  

нет смысла выполнять 3 отдельных оператора и сохранять ссылку, если вы не собираетесь ее повторно использовать. тем не менее, вам действительно следует показать ФАКТИЧЕСКИЙ код, если вам нужен совет. в этом фрагменте вы даже не задаете текст содержимого, поэтому элемент не будет отображаться, если он inline . может ли это быть проблемой стиля, как отображается элемент, встроенный? встроенный блок?

можете ли вы назначить ему класс, который изменяет его при наведении псевдо-курсора и посмотреть, как он это делает? имейте в виду, вы говорите, что курсор застревает, что означает, что вы можете навести на него курсор мыши — следовательно, css работает. это также устраняет возможность наличия каких-либо прокладок элемента above it / transparent els, которые могут предотвратить всплывающее событие.

наконец. присвойте ему идентификатор в процессе разработки. назначьте событие родительскому элементу через:

parentEl.addEvent("click:relay(strong#idhere)", fn);

и посмотрите, работает ли это таким образом (вам нужно Element.delegate из mootools-больше)

удачи, должны нравиться странные проблемы — делает нашу работу стоящей. опубликовать URL-адрес или JSFIDDLE тоже было бы не худшим решением…

Комментарии:

1. код является частью более крупной системы шаблонов на стороне клиента, которую я пишу. все остальное отлично работает, включая добавление событий к другим элементам, просто не в этом одном случае, и это сводит меня с ума. 😉 Я понимаю вашу точку зрения о том, что на самом деле не нужно создавать ссылку, если ее не нужно сохранять, однако я прикрепляю к элементу через .store() то, что позже будет .retrieve() с помощью действия click. спасибо за предложения здесь, я попробую добавить click: relay к родительскому элементу и дам вам знать, если это исправит проблему.

2. что ж, пока безуспешно. похоже, я вернулся к чертежной доске по этому вопросу.