适当模拟“模式”属性
Properly simulate "pattern" attribute with javascript
我试图用javascript复制html5模式属性,但得到不一致的结果。
模式为[a-zA-Z'. '']+
在Chrome中,输入"asd 123"无法通过测试。
使用类似
的东西el.value.match(new RegExp(el.pattern))
允许"asd 123"通过,显然是因为"asd "是匹配的。
我可以通过将^
和$
添加到我的模式的开始和结束来解决这个特定的问题,但问题是-是否有一些函数在那里被实现为模式属性?还有其他惊喜吗?
还有其他惊喜吗?
是的。您可以在HTML5规范中查找pattern
属性:
如果一个
input
元素指定了一个pattern
属性,并且该属性的值在被编译为一个JavaScript正则表达式并禁用了global
、ignoreCase
和multiline
标志(参见ECMA262第5版,15.10.7.2到15.10.7.4节)时编译成功,那么得到的正则表达式就是该元素编译后的模式正则表达式。
这很好,因为这意味着JS正则表达式将与HTML正则表达式完全相同。
编译后的模式正则表达式在与字符串匹配时,必须将其开始锚定在字符串的开始,结束锚定在字符串的结束。
注意:这意味着用于该属性的正则表达式语言与JavaScript中使用的相同,除了模式属性是针对整个值匹配的,而不仅仅是针对任何子集(有点像它暗示了模式开始时的
^(?:
和结束时的)$
)。
可以看到,仅仅添加^
和$
是不够的。例如,如果有人输入了一个分离A|B
,那么^A|B$
就不正确-它需要是^(A|B)$
。
您可能还会注意到,pattern
属性不适用于设置为multiple
的输入。
是否有一些函数在那里被实现为模式属性?
您可以查看https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills#web-forms的一些常见的填充库/插件,但我还没有测试任何标准兼容。
添加^
和$
或多或少与pattern
属性完全相同。根据最新版本的w3c规范pattern
在HTML 5 (http://www.w3.org/html/wg/drafts/html/master/forms.html#the-pattern-attribute):
这意味着用于此属性的正则表达式语言与JavaScript中使用的正则表达式语言相同,只是模式属性是针对整个值匹配的,而不仅仅是针对任何子集(有点像它暗示了^(?.
(重点)
这样一个函数的本质可能类似于
function validate( el ) {
// Check hasAttribute to avoid a regex like ^(?:null)$
return el.value && el.hasAttribute( 'pattern' )
? new RegExp( '^(?:' + el.getAttribute( 'pattern' ) + ')$' ).test( el.value )
: null
}
(IE 8+ because of hasAttribute)
虽然正确的验证实现还必须考虑其他因素,例如required
属性的存在。详细信息请参见数据表单验证和HTML5表单shims(例如使HTML5表单向后兼容)。
- 数据属性仅在切换设备模式下工作
- PhoneGap 2.0(Cordova)DatePicker插件'模式'-属性以获取日期和时间
- 如何在javascript对象中设置属性的类型,就像mongoose模式设计一样
- 为什么在原型中定义属性被视为反模式
- 为什么除了html5输入模式属性之外,这个简单的regex在任何地方都能工作
- 输入元素模式属性的Javascript正则表达式在reFiddle上有效,但在页面上无效
- 对象绑定模式的rest属性应该是最后一个
- JS:两个或多个非严格模式下具有相同名称的对象属性
- 如何使用lodash返回与模式匹配的属性数组
- 在Backbone.js'上设置属性的模式是什么;模型和视图
- 在[background:url({{XXX}})无重复中心的严格模式下,不允许分配只读属性
- Javascript AMD模式混淆-持久化属性值
- TypeScript 工厂模式说属性不存在
- 查找具有与模式匹配的属性的元素
- 将泛型函数动态关联到对象属性时的作用域.(模块模式)
- 具有单个属性的引导模式
- 无法在严格模式下创建对象属性
- 什么是保留在挖空扩展中创建的自定义属性的好模式
- 如何获取当前可编辑选择的 ckEeditor 内联模式的 id 属性的值
- Ember.js是通用计算属性模式的简写