Javascript: симуляция клика по ссылке - PullRequest
5 голосов
/ 16 марта 2009

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

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

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

$('Element').click()

Спасибо.

Ответы [ 7 ]

9 голосов
/ 16 марта 2009

MDC имеет хороший пример использования 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
  }
}
9 голосов
/ 16 марта 2009

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

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

YUI().use("node", function(Y) {
    Y.Event.simulate(document.body, "click", { shiftKey: true })
})
3 голосов
/ 16 марта 2009

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

function DoThisOnClick () {
}

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

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

И вы можете звонить, когда захотите: -)

DoThisOnClick ()
1 голос
/ 28 мая 2011

В случае, если кто-то столкнется с этим в поиске независимого от фреймворка способа запуска любого события HTML и мыши, посмотрите здесь: Как смоделировать щелчок мыши с помощью JavaScript?

0 голосов
/ 30 августа 2014

1) ПЕРВОЕ РЕШЕНИЕ

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

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) ТРЕТЬЕ РЕШЕНИЕ

Версия 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

0 голосов
/ 16 марта 2009

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

0 голосов
/ 16 марта 2009

Конечно, $ ('Element'). Click () не будет работать, но может, если вы включите jquery, он хорошо работает вместе с yui.

Поскольку я не понимаю, вам нужно сделать следующее:

function myfunc(){
//functionality
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...