9

有没有一种好方法可以禁用 iOS 11 Apple 键盘生成的“智能标点符号”——在 HTML 登录表单上的 Safari 中——尤其是用户名字段?

问题是我们的用户名中有撇号。在 iOS 11 上键入他们的用户名并且不知道他们无法登录的 unicode 的微妙之处。

理想情况下,我们可以指示此类用户禁用智能引号或通过按住撇号键键入正确的字符 - 但我正在为小孩子开发教育软件,这是不可能的。

问题更严重的是,还有一小部分用户在其用户名中带有实际的单引号,因此简单的替换映射不起作用 - 我们无法规范化用户名,因为它们来自一个数字我们无法控制的外部系统/不能有太多发言权。

4

2 回答 2

11

不幸的是,根据这个 MDN 页面,没有已知的 Webkit<input><textarea>属性来禁用智能引号,但您可以使用我编写的源自此 QA 的脚本对其进行修补:如何在浏览器中禁用 textarea 字段的智能引号?

window.addEventListener('DOMContentLoaded', attachFilterToInputs );

function attachFilterToInputs() {

    var textInputs = document.querySelectorAll( 'input[type=text], input[type=password], input[type=email], input[type=search], input[type=url], textarea, *[contenteditable=true]' );
    for( var i = 0; i < textInputs.length; i++ ) {
        textInputs[i].addEventListener( 'keypress', preventPretentiousPunctuation );
    } 
}

var conversionMap = createConversionMap();

function createConversionMap() {

    var map = {};
    // Open-quotes: http://www.fileformat.info/info/unicode/category/Pi/list.htm
    map[ 0x2018 ] = '\'';
    map[ 0x201B ] = '\'';
    map[ 0x201C ] = '"';
    map[ 0x201F ] = '"';

    // Close-quotes: http://www.fileformat.info/info/unicode/category/Pf/list.htm
    map[ 0x2019 ] = '\'';
    map[ 0x201D ] = '\"';

    // Primes: http://www.fileformat.info/info/unicode/category/Po/list.htm
    map[ 0x2032 ] = '\'';
    map[ 0x2033 ] = '"';
    map[ 0x2035 ] = '\'';
    map[ 0x2036 ] = '"';

    map[ 0x2014 ] = '-'; // iOS 11 also replaces dashes with em-dash
    map[ 0x2013 ] = '-'; // and "--" with en-dash

    return map;
}

function preventPretentiousPunctuation( event ) {

    if( event.key.length != 1 ) return;

    var code = event.key.codePointAt(0);
    var replacement = conversionMap[ code ];
    if( replacement ) {

        event.preventDefault();
        document.execCommand( 'insertText', 0, replacement );
    }
} 
于 2018-03-06T21:06:07.910 回答
7

感谢的答案大纲。不幸的是,当我们实施他们的解决方案并在 iOS 11 设备上进行测试时,我们发现keypress事件侦听器根本没有触发。我们使用input事件和正则表达式字符串替换重新设计了他们的解决方案,发现这对我们有用。

这是我们的变体,使用 jQuery 作为选择器和更短的替换列表。

<script type="text/javascript">

    // Here are the reference to Unicode Characters in the Punctuation
    // Open-quotes: http://www.fileformat.info/info/unicode/category/Pi/list.htm    
    // Close-quotes: http://www.fileformat.info/info/unicode/category/Pf/list.htm    

    window.addEventListener('DOMContentLoaded', attachFilterToInputs);

    // Patch the iOS Smart Punctuation functionality on restricted field(s), 
    // so that the user types acceptable characters.
    function attachFilterToInputs() {
        try {
            $("[name$='MyProtectedFieldName']").on('input', preventPretentiousPunctuation);
        }
        catch (err) {
            // do nothing
        }
    }

    function preventPretentiousPunctuation(event) {
        try {
            var str = $(this).val();
            var replacedStr = "";
            replacedStr = str.replace(/[\u2018\u2019\u201C\u201D]/g, 
                (c) => '\'\'""'.substr('\u2018\u2019\u201C\u201D'.indexOf(c), 1));

            if (str !== replacedStr) {
                $(this).val(replacedStr);
            }            
        }
        catch (err) {
            // do nothing
        }        
    }
</script>

添加作为答案,因为我没有代表发表评论。

于 2018-04-18T03:33:20.547 回答