如何在开启智能标点的iPhone端jQuery中正确转义撇号完成文本校验
问题原因
iOS系统默认开启的*Smart Punctuation(智能标点)*功能,会自动将用户输入的半角直撇号(Unicode编码\u0027,即代码中硬编码匹配的普通单引号)替换为排版用弯撇号(Unicode编码\u2019),导致原有严格相等的校验逻辑无法识别iPhone端用户输入的合法文本,出现校验不通过的问题。原代码中定义了apostrophe = '\u0027'变量但未实际使用,没有解决字符不匹配的核心问题。
修复方案
优先选择前端侧字符归一化方案,不依赖用户修改系统设置,兼容性覆盖所有iOS版本:
- 输入取值后先做字符统一处理:把所有常见撇号变体(智能标点生成的左右弯单引号、全角单引号等)全部替换为标准半角直撇号,再走原有校验逻辑
- 修正后的可直接运行代码如下:
$("#actionButton").click(function() { // 取值后立即做撇号归一化处理 var seats = $("#number2") .val() .replace(/[\u2018\u2019\uFF07]/g, "'"); var error = null; if (seats === "EMPORER'S EYE" || seats === "Emporer's Eye") { $("#message").fadeIn(); $("#draggable, #draggable2").fadeOut(); } else { $("#messageWrong").fadeIn().delay(2500).fadeOut(); $("#draggable, #draggable2").fadeOut().delay(2500).fadeIn(); } var setflag = error != null; });
可选补充优化
- 可以给输入框添加关闭自动修正的属性,减少系统自动替换字符的概率,注意该方案不能替代上述归一化逻辑,低版本iOS系统不支持该属性:
<input type="text" id="number2" autocorrect="off" spellcheck="false">
- 如果不想修改用户输入的原始值,也可以把严格相等判断改为正则匹配,兼容所有撇号变体:
// 正则同时匹配直撇号、智能弯撇号场景 var validPattern = /^EMPORER['\u2019]S EYE$|^Emporer['\u2019]s Eye$/; if (validPattern.test(seats)) { // 校验通过逻辑 }
注意:不要引导用户手动关闭iOS全局智能标点设置,该操作路径复杂,绝大多数用户不会为单个页面修改系统配置,前端侧做字符兼容是成本最低、效果最稳定的方案。
内容的提问来源于stack exchange,提问作者Maxwell Runion
相关产品推荐
相关产品推荐

