我们有一个正则表达式,我们用于电子邮件。我们的应用程序正在继承正则表达式,所以它可能不是一个选项来切换它......无论如何,同样的步骤似乎在浏览器中的JavaScript崩溃。我已经能够在IE和Chrome中重现,但不能重现Firefox。下面是代码:角度ng模式崩溃浏览器
var mod = angular.module("myApp", []);
mod.controller("MainCtrl", function ($scope) {
//Pattern that blows up the browser during ng-pattern
$scope.emailPattern = /^(?!.*\.{2})([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+([\.][a-zA-Z0-9!#$%&'*+\/=?^_`{|}~-]+)*)@((([\-]?[a-zA-Z0-9]){2,}[\.])*(([a-zA-Z0-9][\-]?){1,})+).(([\.]([a-zA-Z0-9][\-]?){2,}([a-zA-Z0-9])*)+)$/;
});
HTML:
<div ng-app="myApp" ng-controller="MainCtrl">
<form name="emailForm" novalidate>
<input type="text" ng-model="user.email" name="email" maxlength="80" required ng-pattern="emailPattern">
</form>
<br>
{{user.email}}
</div>
Fiddle here。以下是导致浏览器崩溃的基本步骤:
- 在文本框中键入一串字母直到它已满(其他输入可能正常,但这是我用过的)。
- 退格2个字符。
- 击中首页键返回到输入的前面。
- 类型的字符:一个@
这将崩溃的IE和Chrome一致。有没有人遇到过这个bug?任何已知的解决方法?
我能够重现。 –
嗨我注意到ng-pattern的文档上它说:'* @param {string =} ngPattern如果该值与 * RegExp模式表达式不匹配,则设置'pattern'验证错误键。对于定义为范围表达式的 *模式,内联模式或“regexp”的预期值为'/ regexp /'。'。 也许你的问题是使用范围表达式和内联模式。 –
当我将它用作范围表达式或内联表达式时,崩溃存在。使正则表达式“更简单”不会导致浏览器崩溃,但按原样验证正则表达式应该没有问题。 – Patrick