2009-03-16 3 views
5

У меня есть ссылка, которая имеет слушатель, прикрепленный к нему (я использую YUI):JavaScript: имитировать щелчок по ссылке

YAHOO.util.Event.on(Element, 'click', function(){ /* some functionality */}); 

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

$('Element').click() 

Спасибо.

ответ

3

Вы можете объявить свою функцию отдельно.

function DoThisOnClick() { 
} 

Затем присвоить его OnClick событие, как и вы сейчас, например:

YAHOO.util.Event.on(Element, 'click', DoThisOnClick) 

А вы можете назвать это всякий раз, когда вы хотите :-)

DoThisOnClick() 
+0

True ... но обработчик события YUI имеет доступ к переменным, таким как «этот» и другие параметры, обрабатываемые инфраструктурой YUI. Было бы идеально, чтобы просто запустить одно и то же событие. – 2009-03-16 01:19:30

+0

«this» содержит ссылку на объект, который вы нажали. Если вы вызываете функцию самостоятельно, такого объекта нет. Поэтому ваша функция должна справиться с этим. Попробуйте: if (this) // сделать smth; else // делать что-л., когда нет «этого» –

-1

Из курса $ («Элемент»). Click() не будет работать, но может, если вы включите jquery, он хорошо работает вместе с yui.

Как я untestand вам нужно сделать следующее:

function myfunc(){ 
//functionality 
} 

YAHOO.util.Event.on(Element, 'click', myfunc); 

Затем вызовите MyFunc, когда что-то еще должно произойти.

-4

Неспособность имитировать щелчок пользователя по произвольному элементу является преднамеренным и по понятным причинам.

+0

Просьба уточнить. – TweeZz

9

Вы ищете fireEvent (IE) и dispatchEvent (другие).

Для YUI 3 это все обернутые красиво в Y.Event.simulate():

YUI().use("node", function(Y) { 
    Y.Event.simulate(document.body, "click", { shiftKey: true }) 
}) 
9

MDC имеет хорошую example of using dispatchEvent для имитации щелчка события.

Вот код, чтобы имитировать щелчок на элементе, который также проверяет, если что-то отменило событие:

function simulateClick(elm) { 
    var evt = document.createEvent("MouseEvents"); 
    evt.initMouseEvent("click", true, true, window, 
    0, 0, 0, 0, 0, false, false, false, false, 0, null); 
    var canceled = !elm.dispatchEvent(evt); 
    if(canceled) { 
    // A handler called preventDefault 
    // uh-oh, did some XSS hack your site? 
    } else { 
    // None of the handlers called preventDefault 
    // do stuff 
    } 
} 
+0

Это работает очень хорошо, и его очень легко реализовать. Благодаря ! – gramm

+0

Должен ли я иметь YUI для этого? –

+0

Нет, вам не нужно использовать YUI, чтобы использовать это. –

0

1) Первое решение

в статье http://mattsnider.com/simulating-events-using-yui/ описывает, как имитировать щелчок с помощью YA HOO:

var simulateClickEvent = function(elem) { 
    var node = YAHOO.util.Dom.get(elem); 

    while (node && window !== node) { 
     var listeners = YAHOO.util.Event.getListeners(node, 'click'); 

     if (listeners && listeners.length) { 
      listeners.batch(function(o) { 
       o.fn.call(o.adjust ? o.scope : this, {target: node}, o.obj); 
      }); 
     } 

     node = node.parentNode; 
    } 
}; 

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

2) ВТОРОЕ РЕШЕНИЕ

Существует и другой способ сделать это. Например:

var elem = YAHOO.util.Dom.get("id-of-the-element"); 
elem.fireEvent("click", {}); 

, где функция используется как

3) Третье решение

Version 2.9 YUI2 имеет лучшее решение: http://yui.github.io/yui2/docs/yui_2.9.0_full/docs/YAHOO.util.UserAction.html

4) ВПЕРЕД РЕШЕНИЕ

YUI3 также имеет лучшее и чистое решение: http://yuilibrary.com/yui/docs/event/simulate.html

Смежные вопросы