Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript onKeyUp()上的格式设置导致光标跳到输入字段的末尾_Javascript_Typescript_Rendering_Frontend - Fatal编程技术网

Javascript onKeyUp()上的格式设置导致光标跳到输入字段的末尾

Javascript onKeyUp()上的格式设置导致光标跳到输入字段的末尾,javascript,typescript,rendering,frontend,Javascript,Typescript,Rendering,Frontend,我是刚从大学毕业的新手。这是我第一次遇到这样的问题。我正在编写一个同事的代码,所以我不想对他的代码做太多修改,只需用他的代码修复一个问题,而不需要彻底修改它 我们有3个输入样式字段:输入、电话、号码 输入字段是一个自由文本字段,用于诸如名称之类的内容。 “电话”字段是一个仅限号码的字段,用于在屏幕上为用户实时将号码序列格式化为10位数的电话号码,格式为(XXX)XXX-XXXX。 数字字段用于ssn等仅允许数字的情况。非数字字符将被拒绝 这三个字段都扩展了基本格式字段。在这个基本格式字段中,我们

我是刚从大学毕业的新手。这是我第一次遇到这样的问题。我正在编写一个同事的代码,所以我不想对他的代码做太多修改,只需用他的代码修复一个问题,而不需要彻底修改它

我们有3个输入样式字段:输入、电话、号码

  • 输入字段是一个自由文本字段,用于诸如名称之类的内容。
  • “电话”字段是一个仅限号码的字段,用于在屏幕上为用户实时将号码序列格式化为10位数的电话号码,格式为(XXX)XXX-XXXX。
  • 数字字段用于ssn等仅允许数字的情况。非数字字符将被拒绝
  • 这三个字段都扩展了基本格式字段。在这个基本格式字段中,我们有一个onKeyUp(event:event)函数,它在用户每次键入字符时调用format函数。我们这样做是为了在电话字段中添加()之类的内容,并在数字字段中删除非数字字符

    问题就在这里

    通过在每次击键时调用format函数,我们的光标在每次击键后跳转到输入字段中值的末尾。因此,如果我在输入字段中有一个预先存在的名称:“John Smith”,我想返回并编辑该字段,使其看起来像“John Joe Smith”,那么每次击键后,光标都会跳到字符串的末尾

    我的目标是保留击键时的格式,以便电话号码继续被格式化,数字字段实时拒绝非数字值,但我还希望允许中值编辑,而无需在每次击键后将光标踢到值的末尾


    有没有办法在调用格式之前捕获光标位置,然后在调用格式之后返回光标位置?或者另一个可能容易实现的解决方案?

    您可以从触发事件的元素中获取插入符号位置,然后使用
    子字符串在该位置插入文本。下面是我的一个项目中的一个片段,我必须处理插入制表符(
    \t
    ):


    谢谢,我将尝试一下。我能够使用e.target.selectionStart捕获插入符号位置,并在格式化后将其设置在我的元素中,谢谢!很高兴。你可以接受答案,这样人们就知道答案是正确的,而无需阅读评论。:)
    case 9: // Insert tab key at caret location
        e.preventDefault();
        var caret = e.target.selectionStart;
        e.target.value = e.target.value.substring(0, caret) + '\t' + e.target.value.substring(caret);
        break;