通过JQuery在Enter键上关注HTML元素的下一个tab索引

sqserrrh  于 2023-11-17  发布在  jQuery
关注(0)|答案(7)|浏览(109)

**Hi Friends,**我正在做一个小任务,让用户在按下回车键时可以对html元素进行索引。

由于我是jquery的新手,我写了一些代码,在我看来,它会工作,但其中有一些问题。

初步调查结果

罪魁祸首代码,它不工作,因为在Msg标签中的输出是“未定义”

$('*').attr('tabindex').id

字符串


的数据
下面给出了代码,我甚至创建了一个JSFiddle

jQuery

$(document).ready(function (eOuter) {
    $('input').bind('keypress', function (eInner) {
        if (eInner.keyCode == 13) //if its a enter key
        {
            var tabindex = $(this).attr('tabindex');
            tabindex++; //increment tabindex
            //after increment of tabindex ,make the next element focus
            $('*').attr('tabindex', tabindex).focus();

                       **//Msg Label**
            //Just to print some msgs to see everything is working
            $('#Msg').text( this.id + " tabindex: " + tabindex 
               + " next element: " + $('*').attr('tabindex').id);

            return false; // to cancel out Onenter page postback in asp.net
        }
    });
}
);

超文本标记语言

<div>
    Employee Info<br />
    Name<br />
    <input name="TxtbxName" type="text" value="ok" id="TxtbxName" tabindex="1" />
    <br />
    Age<br />
    <input name="TxtbxAge" type="text" id="TxtbxAge" tabindex="2" />
    <br />
    Gender<br />
    <select name="DdlGender" id="DdlGender" tabindex="3">
      <option selected="selected" value="Male">Male</option>
      <option value="Female">Female</option>
    </select>
    <br />
    <div>
        Previous Employment<br />
        <select name="DdlCompany" id="DdlCompany" tabindex="4">
   <option selected="selected" value="0">Folio3</option>
   <option value="1">Null Soft</option>
   <option value="2">Object Soft</option>
   <option value="3">Excepption Soft</option>
    </select>
        &nbsp;&nbsp;or Enter Code&nbsp;&nbsp;
        <input name="TxtbxCompanyCode" type="text" id="TxtbxCompanyCode" tabindex="5" />
        <br />
        Address<br />
        <input name="TxtbxAddress" type="text" id="TxtbxAddress" tabindex="6" />
        <br />
       <input type="submit" name="BtnSubmit" value="Submit" id="BtnSubmit" tabindex="7"/>
        <br />
        <label id="Msg">Message here</label>
    </div>
</div>

让我知道我错在哪里:

q1qsirdb

q1qsirdb1#

我发现了几个jQuery的小问题。在这里修复:JSFiddle
这一行:

$('*').attr('tabindex', tabindex).focus();

字符串
可以这样写:

$('[tabindex=' + tabindex + ']').focus();


和这个:

$('#Msg').text($(this).id + " tabindex: " + tabindex 
           + " next element: " + $('*').attr('tabindex').id);


没有以jQuery的方式调用id属性(您使用的是JavaScript语法,但$(this)的结果是一个jQuery对象。所以. $(this).id变成了$(this).attr('id')
表单仍然有一个提交问题,我没有深入研究,但它改变了焦点,现在填写了'#Msg'元素。

pu82cl6c

pu82cl6c2#

下面是我在keydownfocusNextElement 的完整工作代码[Enter]**没有 jQuery,基于以下 stackoverflow 答案创建了JSFiddle example

  1. How to prevent ENTER keypress to submit a web form?
  2. Focus Next Element In Tab Index
<script type="text/javascript">

    function focusNextElement() {
      var focussableElements = 'a:not([disabled]), button:not([disabled]), input[type=text]:not([disabled]), [tabindex]:not([disabled]):not([tabindex="-1"])';
      if (document.activeElement && document.activeElement.form) {
        var focussable = Array.prototype.filter.call(document.activeElement.form.querySelectorAll(focussableElements),
          function(element) {
            return element.offsetWidth > 0 || element.offsetHeight > 0 || element === document.activeElement
          });
        var index = focussable.indexOf(document.activeElement);
        focussable[index + 1].focus();
      }
    }

    window.addEventListener('keydown', function(e) {
      if (e.keyIdentifier == 'U+000A' || e.keyIdentifier == 'Enter' || e.keyCode == 13) {
        if (e.target.nodeName === 'INPUT' && e.target.type !== 'textarea') {
          e.preventDefault();
          focusNextElement();
          return false;
        }
      }
    }, true);

</script>

字符串

d8tt03nd

d8tt03nd3#

不想做新的职位,使垃圾邮件与解决方案,我发现有用的。
从其他来源收集信息(Brian Glaz code nice-one),并使用Enter键制作了跨浏览器版本的Focus Next Element In Tab-index

制表符索引不是一个接一个**,但也可以包含空格(1,2,9,11,30等)

var tabindex = 1; //start tabindex || 150 is last tabindex
    $(document).keypress(function(event) {
        var keycode = (event.keyCode ? event.keyCode : event.which);
        if(keycode == '13') { //onEnter
            tabindex++;
            //while element exist or it's readonly and tabindex not reached max do
            while(($("[TabIndex='"+tabindex+"']").length == 0 || $("[TabIndex='"+tabindex+"']:not([readonly])").length == 0) && tabindex != 150 ){
                tabindex++;
            }
            if(tabindex == 150){ tabindex = 1 } //reseting tabindex if finished
            $("[TabIndex='"+tabindex+"']").focus()
            return false;
        }
    });
    
    $("input").click(function() { //if changing field manualy with click - reset tabindex 
        var input = $(this);
        tabindex = input.attr("tabindex");
    })

字符串
我希望有人会发现它有用。随时编辑/评论它。

tvz2xvvm

tvz2xvvm4#

var tab = $(this).attr("tabindex");
tab++;
$("[tabindex='"+tab+"']").focus();

字符串

bttbmeg0

bttbmeg05#

为了解决这个问题,我生成了一个小的jquery函数来查找下一个有效的tabindex;假设它更容易维护,并且可能比while循环快一点:

function getNextTabindex(currentTabIndex) {
  return $("[tabindex]").index($("[tabindex=" + currentTabIndex + "]")) + 1;
}

字符串
希望这对需要它的人有帮助;这是测试和工作。
简而言之:查找当前tabindex的元素,在所有tabindex元素的列表中找到该元素,得到它的索引并增加索引。
然后,使用这个函数,你可以这样选择下一个tabindex元素:

$('[tabindex=' + getNextTabindex($(":focus").attr("tabindex")) + ']').focus();


我没有测试电话,但假设它工作。

piztneat

piztneat6#

tab-index应该总是0。正如WebAIM Keyboard Accessibility documentationW3C criterion所指出的。希望这对你有帮助。

eqoofvh9

eqoofvh97#

var tabindex= $(this).attr("tabindex");
tabindex++;
$("[tabindex='"+tabindex+"']").focus();

字符串
表格中可编辑单元格的示例

$(document).on('dblclick', 'td', function () {
        console.log('clicked');
        this.contentEditable = 'true';
    });
 $(document).on('keydown', 'td', function (event) {
        if (event.keyCode === 9 || event.keyCode === 13) {
            this.contentEditable = 'false';
            //  $(this).next().focus().dblclick().focus();
            var tabindex = $(this).attr('tabindex');
            tabindex++;
            var next = $('[tabindex=' + tabindex + ']').focus().dblclick();
            if (next.is('td') == false)
                return true;
            var sel, range;
            if (window.getSelection && document.createRange) {
                range = document.createRange();
                range.selectNodeContents(next[0]);
                range.collapse(true);
                sel = window.getSelection();
                sel.removeAllRanges();
                sel.addRange(range);
            } else if (document.body.createTextRange) {
                range = document.body.createTextRange();
                range.moveToElementText(next[0]);
                range.collapse(true);
                range.select();
            }

            return false;
        }
    });


Editable cells in dynamic table

相关问题