可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have numerous anchor tags on my page that only trigger jQuery actions on the same page.
The don't redirect the user to another location, which is the normal expected behavior of an anchor tag.
I don't want to have restful urls in my app for every action. But, I also don't like sending the user to the top of the page every time they click on one of these <a href="#">
tags.
What's a better value to put inside the href
value of the anchor tag besides #
?
回答1:
Can you reference a fragment on the page that could work as a logical fallback to the non-executed JavaScript action? If so, it makes a lot of sense to reference <a href="#account">
and have an id="account"
on the page that could work as a fallback.
Another option is to reference the dynamically loaded content directly; that way you can quite conveniently use the href
in the Ajax call instead of hard-coding what to request in JavaScript somehow; <a href="/path/to/dynamic/content">
.
Lastly, you can not have the <a href="#">
statically in the HTML at all, but instead create it on the fly with jQuery since it's only used by jQuery anyway. No need to pollute the markup with placeholders for JavaScript if the placeholders are only used by and for JavaScript anyway.
Regarding "sending the user to the top of the page"; you should just return false
from your the function you have hooked up as a click()
handler;
$('a').click(function() {
// Do your stuff.
// The below line prevents the 'href' on the anchor to be followed.
return false;
});
回答2:
You should really be using a <button>
element for JS-only actions. They have a default action (if inside a form) but outside of a form they’re purely for user triggered actions that you bind your JS event handler to.
回答3:
If you have links that aren't links, perhaps they shouldn't be links? :-) You might consider a different UI element that doesn't have a default behavior (outside of a form), like button
(you can style buttons to a substantial degree). Or you could use span
or similar, but if you do be sure to set the appropriate accessibility information (such as an ARIA role="link"
) so that you don't mess up screen readers (and browser tabbing).
But if you want to continue to use <a href="#">...</a>
, just attach a handler to them that calls event.preventDefault();
or returns false
.
回答4:
#
is fine. But the callbacks that are triggered should then return false
.
// assigning a click callback to all anchors
$('a').click(function(evt){
//... do stuff
return false; // avoid jump to '#'
})
回答5:
I prefer to use:
<a href="javascript:">foo</a>
unless it is actually an ajax call to load a partial template in which case I use something like this:
<a href="/link/to/page" onClick="ajax_request_to_partial(); return false;">foo</a>
By returning false in the onclick event, you make sure the site is not reloaded, but it can still be used for opening the url in a new page.
回答6:
If the anchor is useless to people who don't have javascript, then they shouldn't see it at all.
The best alternative is to generate these links using jQuery on page load - that way the only people who see them are those who will use them.
In this case, having href="#"
is fine, because as long as your event handler finishes with return false;
then the href
will never be followed
回答7:
Have you tried omitting the href parameter?
<a>Link title</a>
That should work just fine and not provoke the browser to load a webpage or change the pages position. In fact it won't do anything unless you have some JavaScript to support it.
The href parameter is optional so why include it if you aren't using it?
回答8:
I use below code and that works fine.
<div class="panel-heading">Definition
<div class="pull-right">
<i class="fa fa-wrench"></i>
<a id="step3Ad" href="javascript:void(0);">Advanced</a>
</div>
</div
回答9:
return false;
Use this to stop browser sending them to top of page?
回答10:
if you bind some action on click on you can call preventDefault() to avoid sending user in top of page
$("a.clickable").live('click',function(){$(this).doSome(); $(this).preventDefault()});