Search code examples
javascriptjqueryhtmlaccessibility

Prevent certain elements from receiving focus


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?


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>