In my chrome extension\'s content script, I click on certain links/buttons on webpages from certain sites. To do that, I use following code in the content script (I embed jQ
jQuery's click trigger function does not trigger a non-jQuery DOM click listener (jsfiddle.net/k2W6M).
The jQuery documentation should really point out this fact. I'm sure more than a few people have gone on a wild chase over this.
I was struggling with this same problem for a few days, trying to trigger an onclick handler on a link with .click() and .trigger("click"), all in vain, until I saw this.
For the sake of having a complete answer to this question, dispatching a MouseEvent to the element has the same effect as clicking the element. The following code worked for me, and should work when trying to click an element/link on a page from a content script:
$(css_selector)[0].dispatchEvent(new MouseEvent("click"))
content_script is sandboxed executed,see https://developer.chrome.com/extensions/content_scripts
However, content scripts have some limitations. They cannot:
$ in the content_script can't access $ on the webpage,but the events data stored inner $,so we could not trigger.
// taken from jQuery#1.11.2 from line4571, trigger method
...
// jQuery handler
handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
}
// Native handler
handle = ontype && cur[ ontype ];
Due to browser extension sand-boxing, and basic jQuery functionality, you cannot trigger a non-jQuery click event with trigger or click.
You can however call the raw DOM element click method, which will act exactly as if the element was clicked with the mouse. Just use [0] to access the DOM element:
$(css_selector)[0].click();
Although you would seldom need to, you can trigger all matching buttons using the same code in an each. As the this in an each is the DOM element it is quite simple:
$(css_selector).each(function(){
this.click();
});