Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Alternative to <a href="#"> when the anchor tag only triggers a jQuery action without redirecting the user?

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 #?

like image 725
xylitol Avatar asked Nov 19 '10 12:11

xylitol


4 Answers

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;
});
like image 156
Asbjørn Ulsberg Avatar answered Oct 21 '22 10:10

Asbjørn Ulsberg


You should really be using a <button> element for JS-only actions. They have a default action (if inside a form, or with a form attribute that associates them with a form) but without an attached form they’re purely for user triggered actions that you bind your JS event handler to.

like image 21
Robin Whittleton Avatar answered Oct 21 '22 10:10

Robin Whittleton


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
like image 5
extjs user Avatar answered Oct 21 '22 10:10

extjs user


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.

like image 3
T.J. Crowder Avatar answered Oct 21 '22 10:10

T.J. Crowder