Запустить события из расширения браузера Firefox?

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

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

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

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

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

1 ответ

Решение

Прежде всего, для событий клика вам нужно создать объект события с типом 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');

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

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

Другие вопросы по тегам