【问题标题】:html input field value setter not working properly in chrome and safari using jqueryhtml输入字段值设置器在使用jquery的chrome和safari中无法正常工作
【发布时间】:2015-05-08 05:31:13
【问题描述】:

我正在尝试使用 jquery 在 keyup 事件上设置 html 输入字段值。

<input style="width: 45%;" type="text" name="user_phone" value="" placeholder="Your phone number" />

首先我尝试像这样使用 .val() 设置器。

http://jsfiddle.net/6xwzy81k/3/

$(document).ready(function(){
  $('input[name=user_phone]').keyup(function() {
    var number = $('input[name=user_phone]').val();
    if (!number.contains('(') && !number.contains(')') && number.length === 2) {            
        $('input[name=user_phone]').val('(' + number + ')');
    } else if (number.contains('(') && !number.contains(')') && number.length === 3) {
        $(this).val(number + ')');
    } else if (!number.contains('(') && number.contains(')') && number.length === 3) {
        $(this).val('(' + number);
    }
  });
});

这在 Firefox 中运行良好,但在 chrome 和 safari 中它不起作用。然后正如其他一些问题中所建议的那样,我使用 .prop() 而不是 .val() 尝试了这种方式

http://jsfiddle.net/6xwzy81k/2/

$(document).ready(function(){
  $('input[name=user_phone]').keyup(function() {
    var number = $('input[name=user_phone]').val();
    if (!number.contains('(') && !number.contains(')') && number.length === 2) {            
        $('input[name=user_phone]').prop('value','(' + number + ')');
    } else if (number.contains('(') && !number.contains(')') && number.length === 3) {
        $(this).prop('value', number + ')');
    } else if (!number.contains('(') && number.contains(')') && number.length === 3) {
        $(this).prop('value', '(' + number);
    }
  });
});

同样的事情发生了,它在 firefox 中按预期工作,但在 safari 或 chrome 中却没有。

【问题讨论】:

  • 我认为contains() 行不通。使用indexOf()
  • 好的,我试试,谢谢建议
  • 根据MDN docsString.prototype.contains() 更名为String.prototype.includes()。此外:这是一项实验性技术,是 ECMAScript 6(Harmony)提案的一部分。由于该技术的规范尚未稳定,请查看兼容性表以了解在各种浏览器中的使用情况。

标签: jquery html google-chrome


【解决方案1】:

由于其他答案指出了您的代码中的错误,因此这里是另一种解决方案。如果您想以 (###) ###-#### 的形式格式化数字,这里有一个解决方案,它使用正则表达式首先提示非数字,然后根据实际数字的长度,格式化它们。在 chrome 和 safari 中测试。还处理删除/退格

也使用了你的fiddle

$(document).ready(function(){
    
    $('input[name=user_phone]').keyup(function() {
        var number = $('input[name=user_phone]').val();
        var digits = number.replace(/[^0-9\.]+/g, '');
        var lastDigitIndex = (digits.length < 10) ? digits.length : 10;
        
        var key = event.keyCode || event.charCode; 
        
        if (key != 8 && key != 46) {
            if (digits.length >= 3) {
    
                var output = '(' + digits.substring(0, 3) + ') ';
                
                if (digits.length >= 6) {
                    output += digits.substring(3, 6) 
                        + '-' + digits.substring(6, lastDigitIndex);
                }
                else {
                    output += digits.substring(3, lastDigitIndex);
                }
                
                $(this).val(output);
            }
        }
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<input style="width: 45%;" type="text" name="user_phone" value="" placeholder="Your phone number" />

【讨论】:

  • 这个看起来很棒。现在我只需要以简单的方式实现它,但我想迟早我必须实现这样的东西。 +1
【解决方案2】:

它给出了number.contains is not a function in console。所以我建议你使用$.contains,如下所示,效果很好!!

DEMO HERE

$(document).ready(function(){
    $('input[name=user_phone]').keyup(function() {
        var number = $('input[name=user_phone]').val();
        if (!$.contains(number,'(') && !$.contains(number,')') && number.length === 2) {            
            $('input[name=user_phone]').val('(' + number + ')');
        } else if ($.contains(number,'(') && !$.contains(number,')') && number.length === 3) {
            $(this).val(number + ')');
        } else if (!$.contains(number,'(') && $.contains(number,')') && number.length === 3) {
            $(this).val('(' + number);
        }
    });
});

【讨论】:

  • 您的解决方案也可以,但是有一个小问题,我应该无法清除最后一个')'。但这不是主要问题,所以我将接受它作为答案,但是使用 .indexOf() 而不是 .contains() 来实现代码,这可以按我想要的方式正常工作,而且似乎很多人推荐不使用这个。谢谢。
猜你喜欢
  • 2011-07-17
  • 2011-11-09
  • 2012-07-08
  • 2013-12-24
  • 2015-11-14
  • 2011-11-27
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多