Focus Next Element In Tab Index

后端 未结 20 2120
失恋的感觉
失恋的感觉 2020-11-27 03:06

I am trying to move the focus to the next element in the tab sequence based upon the current element which has focus. Thus far I have not turned up anything in my searches.<

20条回答
  •  暖寄归人
    2020-11-27 03:16

    This is my first post on SO, so I don't have enough reputation to comment the accepted answer, but I had to modify the code to the following:

    export function focusNextElement () {
      //add all elements we want to include in our selection
      const focussableElements = 
        'a:not([disabled]), button:not([disabled]), input[type=text]:not([disabled])'
      if (document.activeElement && document.activeElement.form) {
          var focussable = Array.prototype.filter.call(
            document.activeElement.form.querySelectorAll(focussableElements),
          function (element) {
              // if element has tabindex = -1, it is not focussable
              if ( element.hasAttribute('tabindex') && element.tabIndex === -1 ){
                return false
              }
              //check for visibility while always include the current activeElement 
              return (element.offsetWidth > 0 || element.offsetHeight > 0 || 
                element === document.activeElement)
          });
          console.log(focussable)
          var index = focussable.indexOf(document.activeElement);
          if(index > -1) {
             var nextElement = focussable[index + 1] || focussable[0];
             console.log(nextElement)
             nextElement.focus()
          }                    
      }
    }
    

    The changing of var to constant is non-critical. The main change is that we get rid of the selector that checks tabindex != "-1". Then later, if the element has the attribute tabindex AND it is set to "-1", we do NOT consider it focussable.

    The reason I needed to change this was because when adding tabindex="-1" to an , this element was still considered focussable because it matches the "input[type=text]:not([disabled])" selector. My change is equivalent to "if we are a non-disabled text input, and we have a tabIndex attribute, and the value of that attribute is -1, then we should not be considered focussable.

    I believe that when the author of the accepted answer edited their answer to account for the tabIndex attribute, they did not do so correctly. Please let me know if this is not the case

提交回复
热议问题