Skip to content

Instantly share code, notes, and snippets.

@Zegnat
Created February 24, 2012 12:03
Show Gist options
  • Star 13 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save Zegnat/1900563 to your computer and use it in GitHub Desktop.
Save Zegnat/1900563 to your computer and use it in GitHub Desktop.
Fixing your skip links. [JS]
(function(a,b,c){for(b=a.length;b--;)if(a[b].getAttribute('href').substr(0,1)=='#')a[b].onclick=function(c){c=document.getElementById(this.hash.substr(1));c.setAttribute('tabindex','0');c.focus();c.removeAttribute('tabindex');};})(document.links);
@komputist
Copy link

Hi! Would it be possible to extend this method so that links followed from the longdesc attribute or the cite attribute would also change focus? For a Webkit browser that allows you to open @longdesc URLs and @cite URLs, see iCab. http://www.icab.de Longdesc attribute URLs and cite attribute URL are, in iCab, opened via a contextual menu. I have a test page here: http://malform.no/testing/a-demo-of/longdesc-with-hidden-iframe/

@pmgodin-zz
Copy link

I preferred the native javascript version since the jQuery one may interfere with deeplinking "/#/deeplink" syntax because "/" cannot be used as jQuery selector.

@Zegnat
Copy link
Author

Zegnat commented Oct 10, 2012

@komputist sorry for missing your comment. I’ll try to look into it but I can’t promise anything. It’s easy to bind to an onClick event and I don’t expect iCab to trigger a JavaScript event because you want to display the longdesc.

Maybe I can couple this to the onhashchange event, but no promises.

@Zegnat
Copy link
Author

Zegnat commented Oct 10, 2012

@komputist sorry for missing your comment. I’ll try to look into it but I can’t promise anything. It’s easy to bind to an onClick event and I don’t expect iCab to trigger a JavaScript event because you want to display the longdesc.

Maybe I can couple this to the onhashchange event, but no promises.

@virtualgeoff
Copy link

The jQuery solution above doesn't work if the targets are not actual links i.e. if they are not able to accept focus. So I tried your pure JS solution but it interferred with some in-page scrolling I have that also uses fragment identifiers.

In the end I combined both approaches:

$('.skiplinks a').click(function() {
    $("#" + $(this).attr("href").slice(1)).attr("tabindex",-1).focus().removeAttr("tabindex");
});

@simeydotme
Copy link

Thank you so much for this, works perfectly for me!
I think this should be included in the HTML5 Boilerplate , it's as important as .visuallyhidden and chromeframe, can't believe I didn't realise this was broken sooner.

@Veyfeyken
Copy link

This breaks the back-button of the browser. More info and fix on WebAIM's e-mail list:
http://webaim.org/discussion/mail_thread?thread=6363

Also, please vote for a webkit fix:

https://bugs.webkit.org/show_bug.cgi?id=116046
https://code.google.com/p/chromium/issues/detail?id=262171

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment