防止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:
我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