Reputation: 28576
Why clicking on trigger1
and trigger2
doesn't fire click on open
?
<a id="trigger1" href="#" onclick="jQuery('#open').trigger('click');">trigger1</a>
<a id="trigger2" href="#" onclick="jQuery('#open').click();">trigger2</a>
<a id="open" href="http://google.com">open</a>
Using ready (trigger3
) doesn't work too:
<a id="trigger3" href="#">trigger3</a>
...
jQuery(document).ready(function(){
jQuery('#trigger3').bind('click', function(){
jQuery('#open').html('to be fired'); /* works */
jQuery('#open').click();
});
jQuery('#trigger3').click(function(){
jQuery('#open').html('to be fired'); /* works */
jQuery('#open').click();
});
});
Upvotes: 10
Views: 28394
Reputation: 6873
There is 3 types of links depending of the href
content :
1) The href
is a url
2) The href
is a javascript call like "javascript:"
3) The href
is useless ("#", "javascript:void(0)", ...), the function is directly bound on the link
That's why I make this little plugin to call the good method :
(function( $ ){
$.fn.triggerClick = function() {
var href = $(this).attr('href');
//No useful link into href, try to call js click
if(href.indexOf('#') == 0 || href.indexOf('javascript:void(') == 0 || href == '') {
$(this).click();
//JS call
} else if(href.indexOf('javascript:') == 0) {
eval(href);
//URL
} else {
document.location.href = href;
}
};
})( jQuery );
To call it, just use $('DOMelement').triggerClick()
.
Hope this could help.
(This plugin is a prototype. Thank's to tell me if there is some errors...)
Upvotes: 0
Reputation: 9719
From what your code looks like, you want when a user clicks on link one or two (trigger 1 or 2) you want the link in open
to be followed?
If this is the case, .click()
isn't actually the function you want, in fact jQuery doesn't seem to offer a method of directly clicking on an anchor element. What it will do is trigger any event's which are attached to an element.
Take a look at this example:
<a id="trigger" href="#" onclick="$('#open').click();">trigger</a>
<a id="open" href="http://google.com">open</a>
jQuery:
$('#open').click(function(){
alert('I just got clicked!');
});
So there is an event attached to the element with the ID open
that simply alerts to say it was clicked. Clicking on the trigger link simply triggers the click event on the element with the ID open
. So it's not going to do what you want! It will fire any events but it won't actually follow the link
I removed the 2nd trigger because .click()
is just a proxy for .trigger('click')
so they do the same thing!
So to trigger an actual click on an anchor, you will have to do a little more work. To make this slightly more reuseable I would change your HTML a little (I'll expain why in a moment):
<a href="#" class="trigger" rel="#open">trigger google</a>
<a id="open" href="http://google.com">google</a>
<br/><br/>
<a href="#" class="trigger" rel="#bing">trigger bing</a>
<a id="bing" href="http://bing.com">bing</a>
jQuery (shortest):
$('.trigger').click(function(e){
e.preventDefault();
window.location = $($(this).attr('rel')).attr('href');
});
OR:
$('.trigger').click(function(e){
e.preventDefault();
var obj = $(this).attr('rel');
var link = $(obj).attr('href');
window.location = link;
});
Basically any link you want to follow another element add the class="trigger"
to, this way it is re-useable. In the element you have added the class
to, add a rel="#element-to-be-clicked"
this will allow you to setup multiple clicks on different links.
class="trigger"
rel="#element-to-be-clicked"
href
address from the elementUpvotes: 7
Reputation: 2470
It's important to clarify that doing jQuery('#open').click()
does not execute the href attribute of an anchor tag so you will not be redirected. It executes the onclick
event for #open
which is not defined.
You can accomplish the redirect and the ability to cause it with your original jQuery('#open').click()
code by giving #open
a click event:
jQuery('#open').click( function (e) {
window.location.href = this.href;
});
Upvotes: 23
Reputation: 6740
Try this:
jQuery(document).ready(function(){
jQuery('#trigger3').bind('click', function(){
jQuery('#open').text('to be fired'); /* works */
jQuery('#open').click();
});
jQuery('#trigger3').click(function(){
jQuery('#open').text('to be fired'); /* works */
jQuery('#open').click();
});
});
jQuery('#open').html('to be fired'); will change the to just a text. That's why the 2nd select doesn't work.
Upvotes: 1
Reputation: 14328
try with removing onclick="jQuery('#open').click();"
Also try to putting $('#trigger1')
you are using jQuery('#trigger3')
On JSFIDDLE here.
Upvotes: 2