我想在我的网站上为每个表单附加一个事件监听器,以便在提交表单时,会弹出一个确认框,询问用户是否确定要继续。如果用户不确定,我不希望表单触发。
到目前为止,我有这段代码:
window.onload = function() {
for(var i=0; i<document.forms.length; i++){
document.forms[i].addEventListener("submit",formSubmit,false);
}
}
function formSubmit(e) {
if (confirm("Are you sure?")) {
return true;
}
return false;
}
注意:
window.onload
是我唯一的选择(我认为?)我试过这个:
var frame = document.getElementById("frameID").contentDocument;
for(var i=0; i<frame.forms.length; i++){
frame.forms[i].addEventListener("submit",formSubmit,false);
}
但它只适用于第一帧,如果我通过“后退”按钮进入页面,它似乎不起作用。这与wondow.onload
的工作方式有关吗?
提前感谢您的帮助!
更新
根据@Jan Pfeifer给出的答案,我有以下代码解决了即使您选择“取消”时表单仍然提交的问题,但它没有正确地将侦听器添加到每个帧中的每个表单。我正在为此开始一个赏金 - 任何人都可以让它适用于每个浏览器中嵌套的iframe吗?
function attach(wnd,handler){
for(var i=0; i<wnd.document.forms.length; i++){
var form = wnd.document.forms[i];
form.addEventListener('submit',handler,false);
}
for(var i=0; i<wnd.frames.length; i++){
var iwnd = wnd.frames[i];
attach(iwnd,handler);
}
}
function formSubmit(e){
if(!confirm('Are you sure?')) {
e.returnValue = false;
if(e.preventDefault) e.preventDefault();
return false;
}
return true;
}
window.addEventListener('load',function(){attach(window,formSubmit);},false);
答案 0 :(得分:2)
你需要递归。 attach 函数将为每个表单添加处理程序,并在每个iframe上调用自身以对其执行相同操作。返回值未传递,因此您需要手动取消该事件。
更新更正错误
function attach(wnd,handler){
for(var i=0; i<wnd.document.forms.length; i++){
var form = wnd.document.forms[i];
form.addEventListener('submit', handler,false);
}
for(var i=0; i<wnd.frames.length; i++){
var iwnd = wnd.frames[i];
attach(iwnd,handler);
}
}
function formSubmit(e){
if(!confirm('Are you sure?')) {
e.returnValue = false;
if(e.preventDefault) e.preventDefault();
return false;
}
return true;
}
window.addEventListener('load', function(){attach(window,formSubmit);},false);
答案 1 :(得分:2)
所以我自己设法解决了这个问题。
有两个主要问题:
wnd.frames[i]
有时会返回iframe的window
,有时会返回document
,具体取决于浏览器 - 我已经将选择iframe的方法更改为wnd.document.getElementsByTagName("iframe")[i].contentWindow
如果有点罗嗦,那就更可靠了。window
有一个未定义的document
或name
,Chrome和IE都会停止执行,所以我添加了一个简单的if语句来捕获它。结果如下:
function attach(wnd,handler){
if (!(wnd.document === undefined)) {
for(var i=0; i<wnd.document.forms.length; i++){
var form = wnd.document.forms[i];
form.addEventListener('submit',handler,false);
alert("Found form in " + wnd.name);
}
for(var i=0; i<wnd.document.getElementsByTagName("iframe").length; i++){
var iwnd = wnd.document.getElementsByTagName("iframe")[i].contentWindow;
alert("Found " + iwnd.name + " in " + wnd.name);
attach(iwnd,handler);
}
}
}
function formSubmit(e){
if(!confirm('Are you sure?')) {
e.returnValue = false;
if(e.preventDefault) e.preventDefault();
return false;
}
return true;
}
window.addEventListener('load', function(){
attach(window,formSubmit);
},false);