【问题标题】:Place Cursor on Input Number box when tab is pressed按下选项卡时将光标放在输入数字框上
【发布时间】:2019-11-09 04:07:12
【问题描述】:

我有以下 HTML 输入类型 Number

HTML:

<input type=“number” class=“reqField” id=“number1” placeholder=“Enter Number only/>
<input type=“number” class=“reqField” id=“number2” placeholder=“Enter Number only/>

JS:

function focusInNumber (id) {
var thisID = id;
var nextID = id + 1;
var preID = id - 1;
clearTimeout(numberReturn);
$(“#number” + thisID).prop(“disabled”, false);
placeCursor($(“#number” + thisID));
}
function focusOutNumber (id) {
var thisID = id;
var nextID = id + 1;
var preID = id - 1;
var value = $(“#number” + thisID).val();
var regex = new RegExp(/^\d*$/);
var regex1 = new RegExp(/^.*[\+\-\.].*/);
var l = $(“#number” + thisID).val().length;
if(value.match(regex3)) {
alert(“Just enter numerical digits”);
numberReturn = setTimeout(function() {
placeCursor($(“#number” + thisID));
},5000);
} else {
if (l<=0) {
alert(“This field cannot be empty”);
placeCursor($(“#number” + thisID));
},5000);
} else {
if(value.match(regex)) {
placeCursor($(“#number” + nextID));
}
}
}
function placeCursor(id) {
id.focus();
//id.val(id.val());
var tmp= id.val();
id.val(“”);
id.va(tmp);
//id.focus().val(“”).blur().focus().val(tmp);
}

$(document).ready(function(){
....
$(“#number1”).focusin(function(){
focusInNumber(1);
});
$(“#number1”).focusout(function(){
focusOutNumber(1);
});
...
});

所以问题是每次按下标签时,下一个文本框都会聚焦但光标不在其中。 我必须点击它才能输入。 我不明白为什么它在 chrome 和 IE 上会这样。

由于只有文本/搜索、url、电话和密码类型才允许使用 chrome 选择,而数字类型则不允许,selectionStartselectionEnd 是不可选择的。 我也无法将文本框的类型从数字更改为文本。

placeCursorfunction 上的每个注释代码都是尝试过的选项,但无法解决问题。

当标签从文本框Number1 按下到Number2 时,请帮助将光标放在文本框上,一旦它只有数字。

更新

得到

未捕获的 RangeError:超出最大调用堆栈大小

在每个 .focus() 上。这是使光标不在焦点输入文本框上的问题。 Try-Catch 会忽略错误,但不会将光标放在输入文本框上。有人可以帮忙修复它吗?

【问题讨论】:

  • @Synapsis :不,我不认为这是重复的,因为 .focus() 是“不”,将光标放在文本框中是我的问题。不,也没有大写混淆。
  • TAB 按钮在 google 和 IE 上都适用于我,它还允许我写作。如果它对您不起作用,只需添加焦点功能,这样当您在第一个输入字段中插入一个值时,它会自动聚焦第二个而不按 TAB 如果您想检查您的代码是否有效,请将其添加到此在线编辑器:w3schools.com/html/tryit.asp?filename=tryhtml_default
  • @Synapsis 选项卡适用于 w3school 试用版!但是该选项卡无法处理实际代码,因为它是一个大型 js,对表单进行了更多验证。
  • 你能告诉我你调用函数的代码部分吗?

标签: javascript jquery html google-chrome internet-explorer-9


【解决方案1】:

<input type=“number” class=“reqField” id=“number1” placeholder=“Enter Number only/>
<input type=“number” class=“reqField” id=“number2” placeholder=“Enter Number only/>

您可以尝试在插入值后调用一个函数,以便光标将聚焦在下一个文本框上。

function setFocus() {
    document.getElementById("myTextbox").focus();
}

【讨论】:

  • “插入值后”是什么意思?是在 focusout() 上还是在 focusOutNumber() 函数中验证后?我对 placeCursor() 函数进行了同样的尝试,“.focus()”不会将光标放在文本框中。请帮忙。
  • @vikrammohan 奇怪的是“选项卡”不起作用,尝试在我添加到答案中的 sn-p 上使用选项卡,如果“选项卡”按钮允许你写,请告诉我在下一个框中
  • 你用的是什么IE版本? chrome 同样的问题......另外,尝试在没有任何脚本的情况下运行代码并检查它是否有效
  • IE 版本 9 和 Chrome 版本 75.0.3770.100。没有脚本文件,代码将无法工作,这种验证和焦点只是整个表单的一小部分。
【解决方案2】:

尝试使用以下代码:

<script src="https://code.jquery.com/jquery-3.4.1.js"></script>
<script type="text/javascript">
    var numberReturn = 0;
    function focusInNumber(id) {
        var thisID = id;
        var nextID = id + 1;
        var preID = id - 1;
        $("#number" + thisID).prop("disabled", false);
    }
    function focusOutNumber(id) {
        var thisID = id;
        var nextID = id + 1;
        var preID = id - 1;
        var value = $("#number" + thisID).val();
        var regex = new RegExp(/^\d*$/);
        var regex1 = new RegExp(/^.*[\+\-\.].*/);
        var l = $("#number" + thisID).val().length;
        if (!value.match(regex)) {
            alert("Just enter numerical digits");
            $("#number" + thisID).val("");
            placeCursor($("#number" + thisID));
        } else {
            if (l <= 0) {
                alert("This field cannot be empty");
                placeCursor($("#number" + thisID));
            } else {
                if (value.match(regex)) {
                    console.log(nextID);
                    placeCursor($("#number" + nextID));
                    console.log("validate success");
                }
            }
        }
    }
    function placeCursor(id) {
        console.log(id);
        //$(id).focus();
        id.focus();
        var tmp = id.val();
        id.val("");
        id.val(tmp);
    }
    $(document).ready(function () {
        $("#number1").focusin(function () {
            focusInNumber(1);
        });
        $("#number1").focusout(function () {
            focusOutNumber(1);
        });
    });
</script>

结果如下(当按下Tab键或点击第一个文本框外时,它会聚焦到第二个文本框):

如果还是不行,尝试新建一个页面并测试上面的代码,如果还是不行,可能是浏览器的问题,尝试清除浏览器缓存和历史记录或尝试重置浏览器设置。

【讨论】:

  • 这在创建为单独的 HTML 时有效,而不是在写入原始代码时...☹️
  • 您的页面是否包含其他javascript代码,请尝试调试您的javascript代码,也许有什么地方可以防止这种行为。
  • 看起来 .focus() 导致“未捕获 RangeError:超出最大调用堆栈大小”。通过 try and catch 我可以忽略它,但是 .focus() 仍然无法正常工作。 ☹️
  • 也更新了问题。请帮助解决它。
  • 关于“超出最大调用堆栈大小”的错误,我建议你可以尝试参考this threadthis article,无论你是使用递归还是遇到超出范围的问题。您可以尝试在 JavaScript 函数和关键进度中添加一些 console.log 方法,然后使用 F12 开发人员工具跟踪进度并调试您的代码。
【解决方案3】:

堆栈大小超出问题是由全局.focus()on input 标记引起的,该标记突出显示输入标记的标签。

深入挖掘后找到了避免堆栈大小超出问题的解决方案,并将光标放在选项卡上的输入区域。

Function placeCursor(id) {
 id.focus(function(e) {
  e.stopPropagation();
  e.cancelBubble();
  id.caretToEnd();
  });
  id.focus();
}

添加.stopPropagation().cancelBubble()停止循环输入标签.focus()placeCursor()函数的.focus()

.caretToEnd() 来自 jquery.caret.js 库

还在所有 placeCursor() 调用中使用 setTimeout()

var q1 = setTimeout(function() {
 placeCursor($(“#number” + thisID));
},100);

这就像一个魅力。

【讨论】:

  • 对这类问题使用外部库不是一个好方法。,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2014-08-12
  • 2011-12-18
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多