2010-06-15 4 views
2

Je souhaite déclencher des événements à partir d'une extension firefox, en particulier cliquer sur des événements. J'ai essayé de jQuery .click() ainsi que l'ensemble:Déclenchez des événements depuis l'extension du navigateur Firefox?

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

Ce qui ne fonctionne pas pour moi, et je me demandais si cela est encore possible? (pour déclencher des événements d'une extension firefox)?

Je pense que cela peut avoir quelque chose à voir avec le document sur lequel je crée l'événement ... mais je ne suis pas sûr.

Si oui, comment le fait-on?

+0

Je m'excuse car votre réponse a parfaitement fonctionné! J'espère que je l'ai récompensé à temps. – Alex

+0

ne vous inquiétez pas, il était parfaitement à l'heure !, je suis content que ma réponse a bien fonctionné pour vous, merci beaucoup! – CMS

Répondre

5

Tout d'abord, pour clic événements, vous devez créer un objet événement avec le type MouseEvents, non HTMLEvents et utiliser event.initMouseEvent au lieu de event.initEvent.

Pour accéder au document de l'onglet en cours de Firefox à partir d'une superposition XUL, vous pouvez utiliser la propriété content.document, mais puisque vous avez déjà accès à l'élément DOM que vous voulez cliquer, vous pouvez utiliser la propriété Node.ownerDocument, qui sera reportez-vous à l'objet document de niveau supérieur pour ce noeud.

J'ai fait une fonction simple pour simuler 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); 
} 

Utilisation:

triggerMouseEvent(element, 'click'); 

Vérifiez une utilisation des tests here.

Vous pouvez également transmettre un objet comme troisième argument si vous souhaitez modifier les valeurs des propriétés event object.

+0

@Alex, puisque vous avez déjà l'élément DOM que vous voulez * cliquer *, nous pouvons utiliser la propriété 'Node.ownerDocument' au lieu d'utiliser' content.document', essayez-le ;-) – CMS