防止input密钥上的表单提交

如何防止input键提交angular度的forms?

有没有办法赶上13键和禁用它或设置为无效的窗体,除非从一个ID为x的button提交?

谢谢

既然你有反正点击,你甚至可以使用<button type="button"> ,即使在form标签内。 button元素的默认行为是type="submit" ,这是你想要防止的。 所以,根本不需要JavaScript!

几个小时后,这个奇怪的代码是唯一的工作。

我在等待更好的答案,不会接受这个怪物:

 app.directive('onKeyup', function() { return function(scope, elm, attrs) { var allowedKeys = scope.$eval(attrs.keys); elm.bind('keydown', function(evt) { angular.forEach(allowedKeys, function(key) { if (key == evt.which) { evt.preventDefault(); // Doesn't work at all window.stop(); // Works in all browsers but IE document.execCommand("Stop"); // Works in IE return false; // Don't even know why it's here. Does nothing. } }); }); }; }); 

并通过在所有表单input上使用它来触发它:

 <input on-keyup="bla" keys="[13]" .... /> 

现在,每当用户按回车键,窗口尝试提交,然后不这样做,没有那么默默。 丑,但它的作品。

编辑 :keydown比元素绑定的keyup要好一些,现在input键无声无息地失败了

我也遇到过类似的问题,最后我把button从表格中取出来了。 看到我使用ng-click并且所有的东西都和ng-model绑定在一起ng-model它是否在表单内部并不重要。

我意识到这是不好的做法,但它肯定会跳过编写自定义指令来拦截击键。

其他用户已经写了会造成这个麻烦。 请注意:没有type =“…”声明的button默认为“提交”! 所以确保你总是使用type =“button”。

检查这个 :

如果表单有2个input字段,没有button或input[type = submit],则按回车键不会触发提交

因此,如果您的表单有2个input字段,则可以使用类似于<span ng-click="submit()">Sumbit</span>字段来防止在这些input字段中input密钥的按键。

我遇到了这个问题。 是的,您需要从您的页面中删除所有type ='submit',并确保其他任何button的type =“button”,但挑战仍然可以使用正常的validation提交。

我创build了一个指令,触发表单提交+表单状态进行validation。 更换:

 <button type="submit"> 

 <button submit-button type="button"> 

指示:

 export default /*@ngInject*/ function submitButton($log) { return ({ require: '^form', link: link, restrict: 'A' }); function link(scope, element, attributes, formCtrl) { element.on('click', clickHandler); function clickHandler() { formCtrl.$setDirty(true); formCtrl.$setSubmitted(true); angular.element(element[0].form).triggerHandler('submit'); $log.info('Form Submitted'); } } 

当你关注你的提交button时,你仍然可以按ENTER来提交,对于我认为更好的用户体验和可访问性。

你可以使用表单标签上的ng-submit来捕获你的控制器中的默认表单提交,它将阻止提交:

http://docs.angularjs.org/api/ng.directive:ngSubmit

或者,如果你真的想要抓住关键事件,也可以通过一个事件,你可以调用stop:

http://docs.angularjs.org/api/ng.directive:ngKeyup

我find的最简单的解决scheme是使用inputtypes作为button,而不是使用ng-click提交和绑定表单提交function,而不是使用表单标签中的ng-submit。

我希望这有帮助。

这是我的奇怪,但快速和简单的解决scheme,没有任何指示。

HTML:

  <form ng-submit='submitForm()'> <input type='text'> <button type='submit' ng-mousedown='doSubmit=true'>submit</button> </form> 

控制器:

  $scope.submitForm = function() { if (!$scope.doSubmit) { return; } $scope.doSubmit = false; console.log('execute some actions'); } 

当表单中的控件具有焦点时,单击Enter键时会提交表单。 如果你使用ng-submit注册一个监听器,你可以拦截这个监听器,并使用防止默认值来停止默认过程(即提交表单)。 看看th

如果你试图阻止表单被提交到一个单一的元素上,你可以添加下面的ng-keypress处理函数(这是用于Angular 1.x的):

 <input type="text" name="myField" ng-keypress="keyPressHandler($event)"/> 

通过keyPressHandler的以下实现:

 $scope.keyPressHandler = function(e) { if (e.keyCode === 13) { e.preventDefault(); e.stopPropagation(); // Perform your custom logic here if any } } 
 angular.element(document).ready(function () { angular.element(window).keydown(function () { if(event.keyCode == 13) { event.preventDefault(); return false; } }); }); 

试试这个在angularjs控制器

点击“提交”button,尝试设置一个variables,并检查它是否已经在提交表单中设置。

 $scope.click = function () { $scope.clicked = true; $scope.submit(); }; $scope.submit = function () { if ($scope.clicked) { ... submit } else { ... prevent defaults } $scope.clicked = false; }; 

见jsfiddle