是否有一个解决方法,文本输入maxlength无法在Safari中工作?

时间:2014-12-05 15:47:38

标签: html safari

在OS X 10.10.1上的safari版本8.0(10600.1.25.1)中,如果您有以下内容:

<input type="text" maxlength="5" >

用5个字符填充,然后将插入符号(用鼠标或键盘)放在字符串中间的某个位置(不是在开头或结尾),键入将导致输入更多字符。

具体来说,在计算&#34;长度&#34;时,它会忽略插入符后面的字符。字符串,所以如果插入符最初放在位置1,则可以输入9个字符。

这在最新的chrome或firefoxes上无法重现。

此效果可在此页面上看到:http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_input_maxlength

我使用maxlength错了吗?这是一个众所周知的解决方法吗?我没有开心地搜索了一下......

2 个答案:

答案 0 :(得分:7)

试试这个: HTML:

<input name="mytest" type="text">

Jquery:

$('input[name="mytest"]').keypress(function() {
    if (this.value.length >= 5) {
        return false;
    }
});

答案 1 :(得分:0)

我遇到了类似的问题,经过大量的研究,大脑支持和来自这个网站的帮助,这就是我所做的。它阻止在Firefox中选择所有[CTRL + A],退格/删除错误。对我来说很好。也可能为别人工作。请原谅全球命名空间污染。

function getBrowserInfo() {
    //function that returns an array with browser name at index 0, version at index 1
    var N=navigator.appName, ua=navigator.userAgent, tem;
    var M=ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);

    if(M && (tem= ua.match(/version\/([\.\d]+)/i))!= null) {
      M[2]= tem[1];
    }

    M = M ? [M[1], M[2]]: [N, navigator.appVersion, '-?'];

    return M;
}

function crossBrowserify() {
        //checks for browsers that lack support and adds the handler leaving compatible browsers like Firefox unaffected
        var browserInfoArr = getBrowserInfo(),
        browser = browserInfoArr[0],
        browserVersion = browserInfoArr[1];

        if(browser.toLowerCase() == "safari" && browserVersion >= 8 && browserVersion < 9) {
            $(document).on("keypress", "input[type='text']", preventExcessCharacters);
        }
    }

function preventExcessCharacters(e) {
        //fix for a bug in Mac OSX Safari 8
        var $this = $(this),    //caching element to prevent performance issues due to frequent DOM access
            mxLength = $this.attr("maxlength");

        if(mxLength){
            if (e.which < 0x20) {
                // e.which < 0x20, then it's not a printable character
                // e.which === 0 - Not a character
                return;     // Do nothing
            }
            if (this.value.length == mxLength) {
                e.preventDefault();
            } else if (this.value.length > mxLength) {
                // Maximum exceeded
                // fix for copy paste bug
                this.value = this.value.substring(0, mxLength);
            }
      }

    }

//set handler if browser lacks support
crossBrowserify();