Javascript 使用requirejs提交表单大约提交800次
在当前的项目中,我们试图切换到requrejs,但我在提交简单表单时遇到了一些问题。每次单击表单submit buuton时,表单存储大约800次。我在表单中有一个令牌,一旦表单被基于PHP的存储过程存储,它就会被删除。我已经尝试使用数据属性来防止重复提交Javascript 使用requirejs提交表单大约提交800次,javascript,html,forms,requirejs,Javascript,Html,Forms,Requirejs,在当前的项目中,我们试图切换到requrejs,但我在提交简单表单时遇到了一些问题。每次单击表单submit buuton时,表单存储大约800次。我在表单中有一个令牌,一旦表单被基于PHP的存储过程存储,它就会被删除。我已经尝试使用数据属性来防止重复提交 $("#myForm").submit(function(event) { if($(this).data('submitted') === true) { event.preventDefault();
$("#myForm").submit(function(event) {
if($(this).data('submitted') === true) {
event.preventDefault();
return false;
}
$(this).data('submitted', true);
});
我甚至尝试将全局变量设置为true/false或一些超时函数,并使用requirejs提供的domReady模块,使所有字段都成为只读/禁用按钮。没有什么变化。在所有情况下,表单在取消提交之前提交大约800次。请问,有人知道为什么表单提交太多吗
谢谢,卡尔
编辑
我的requirejs配置减少了配置,因为文件名在这里并不重要,而且配置很大
var config = {
baseUrl: 'http://example.com/scripts/',
paths: {
app1: 'app/app1',
app2: 'app/app2',
lib1: 'libs/lib1'
},
waitSeconds: 20
}
requirejs.config(config);
// initializes the main page, loading page-dependent modules
require(['initial', "libs/domReady!"], function(app) {
app.init();
});
// the module app, a bit reduced. This will be loaded during the module loader and initialized
define("app/modules/form", [
'jquery',
'libs/domReady',
'document',
'notifier'
], function($, domReady, doc) {
var module = {
needInit: true,
initialized: false,
init: function() {
if(this.initialized) return false;
this.initialized = true;
$("#myForm").submit(function(event) {
var $form = $(this);
if($form.data('submitted')) {
event.preventDefault();
return false;
}
$form.data('submitted', true);
// normally would validate here. this has been removed to reduce possible script errors
return true;
});
}
}
});
主脚本中调用的app.init有一个模块加载器,用于从数据属性加载模块,并防止双重加载已加载的模块
编辑2
我现在包括了一个事件处理程序列表器,它只将1个事件处理程序记录到表单中。想想看,事件处理程序没有被多次加载吗?看起来@Adam和@Louis都是对的。我太专注于表单及其事件,没有认出页面的其余部分。经过长时间的研究和更多的测试,我发现页面上使用了一个外部插件,而不是挂接到表单中的表单内部。禁用插件或至少更改为新插件后,表单按预期提交。非常感谢您的建议在哪里搜索 不要试图破解它以防止重复提交,找出根本原因。听起来您可能多次将requirejs设置架构为包含这段代码,从而多次附加提交处理程序。你能检查页面上加载的JS代码并验证提交处理程序只存在一次吗?我已经尝试了,我能做的是:m脚本加载一次。我已经验证过,模块的init函数只触发一次。如何防止requirejs以另一种方式多次加载模块?如果不看到您的requirejs代码,我们无法知道。@KarlAftring requirejs模块是单例的,。您不太可能意外地获得同一模块的多个实例。您添加了一个可以列出事件处理程序的工具。除非此工具专门用于处理jQuery,否则它将具有误导性。jQuery为每个事件类型安装一个处理程序,即使开发人员同时安装100个不同的处理程序,然后对开发人员安装的所有处理程序执行自己的内部分派。