Prevent certain elements from receiving focus

accessibility, html, javascript, jquery

Solution

This works (updated) :

$body.on("focus.spt", "*", function(e){
  $this = $(this);
  if (!$this.is($mobileMenu) && !$this.is($menuItems)) {
    $this.blur();
    var next=$this.nextAll().find('a,input');
    if (next.length>0) next[0].focus();
  } else {
    console.log('ok',this);
    e.stopPropagation();
  }
})

(updated) fiddle -> http://jsfiddle.net/CADjc/ You can see in the console which elements that receives focus `(main-menu a` and `mobile-menu`)

Tested on :

<input type="text" tabindex="1" value="test">
<span><input type="text" tabindex="2" value="test"></span>
<div><input type="text" id="mobile-menu" tabindex="3" value="mobile-menu"></div>
<div><span>
    <div id="main-menu">
        <a tabindex="4">main-menu</a>
        <a tabindex="5">main-menu</a>
    </div>
</span></div>
<span>
<input type="text" tabindex="6" value="test">
</span>

Problem

So I have the following function. What it does is listens for the focus event on all elements. If that element is either in `$mobileMenu` or `$menuItems` it permits it otherwise it removes the focus: ``` var $body = $("body"); var $mobileMenu = $("#mobile-menu"); var $menuItems = $("#main-menu a"); $body.on("focus.spf", "*", function(e){ e.stopPropagation(); $this = $(this); // Prevent items from recieving focus and switching view if (!$this.is($mobileMenu) && !$this.is($menuItems)) { $this.blur(); } else { console.log(this); } }) ``` The issue I have is that this prevents the user from focusing on anything whatsoever if a normally focusable element that is now non-focusable precedes any of my white-listed elements as it just attempts to refocus on the same element over and over again. Does anyone know how I can tell it to instead skip to the next focusable element?

Original source