Запустить события из расширения браузера Firefox? - PullRequest
2 голосов
/ 15 июня 2010

Я хочу запускать события из расширения Firefox, в частности, события клика. Я пробовал jQuery .click() так же как и все:

 var evt = document.createEvent("HTMLEvents");
 evt.initEvent("click", true, false );
 toClick[0].dispatchEvent(evt);

Это не работает для меня, и мне было интересно, возможно ли это вообще? (для запуска событий из расширения Firefox)?

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

Если да, то как это сделать?

1 Ответ

5 голосов
/ 23 июня 2010

Прежде всего, для событий click необходимо создать объект события с типом MouseEvents, а не HTMLEvents и использовать event.initMouseEvent вместо event.initEvent.

Чтобы получить доступ к document текущей вкладки Firefox из оверлея XUL, вы можете использовать свойство content.document, но так как у вас уже есть доступ к элементу DOMесли вы хотите щелкнуть, вы можете использовать свойство Node.ownerDocument, которое будет ссылаться на объект document верхнего уровня для этого узла.

Я сделал простую функцию для симуляции MouseEvents :

function triggerMouseEvent(element, eventName, userOptions) {
  var options = { // defaults
    clientX: 0, clientY: 0, button: 0,
    ctrlKey: false, altKey: false, shiftKey: false,
    metaKey: false, bubbles: true, cancelable: true
     // create event object:
  }, event = element.ownerDocument.createEvent("MouseEvents");

  if (!/^(?:click|mouse(?:down|up|over|move|out))$/.test(eventName)) {
    throw new Error("Only MouseEvents supported");
  }

  if (typeof userOptions != 'undefined'){ // set the userOptions
    for (var prop in userOptions) {
      if (userOptions.hasOwnProperty(prop))
        options[prop] = userOptions[prop];
    }
  }
  // initialize the event object
  event.initMouseEvent(eventName, options.bubbles, options.cancelable,
                       element.ownerDocument.defaultView,  options.button,
                       options.clientX, options.clientY, options.clientX,
                       options.clientY, options.ctrlKey, options.altKey,
                       options.shiftKey, options.metaKey, options.button,
                       element);
  // dispatch!
  element.dispatchEvent(event);
}

Использование:

triggerMouseEvent(element, 'click');

Проверить использование теста здесь .

Вы также можете пройтиобъект в качестве третьего аргумента, если вы хотите изменить значения объекта события свойств.

...