2016-01-19 13 views
0

我很努力使我的网站登录功能适用于所有浏览器 - 最接近在Firefox中出现“ReferenceError:event is not defined”错误。提交替代表格以阻止默认

我知道现在有很多关于preventDefault的文章在Firefox中处理方式不同,但我发现的选项似乎都不适用于所有浏览器。这是我的基本设置...

<button id="signinbutton" name="signin" type="submit" onclick="signInSubmit(this.form, this.form.signInPassword);">Sign In</button> 

function signInSubmit(theForm, theHashPassword) { 
    event.preventDefault(); //disables submit action so I can add custom code 
    //rest of sign in... 
    //e.g. theForm.appendChild(p); 
} 

原因火狐给出了错误,是我没有显式地从我的点击通过“事件” /提交处理程序(我不认为我可以做我的现有的设置,因为我直接用其他参数调用“signInSubmit”)。从其他职位我尝试了...

  • 删除event.preventDefault()和更改按钮类型“提交”,“按钮”(但这只是防止登录所有的浏览器都工作,因为我“M传递数据使用this.form)

  • 除去event.preventDefault()和加入‘返回false’在signInSubmit()的底部 - 这有同样的问题,以上述的组合也

  • 最有前途的建议是从我的按钮中删除onclick属性,并实施类似...

    $('#signInForm').submit(function(e) { if(!ready){ e.preventDefault(); signInSubmit(this.form, this.form.signInPassword, false); } });

但是从一个jQuery选择.submit()的情况下,当然,我不能用“this.form”来称呼我的原始形式,也不可以有我了能够以signInInSubmit所期望的格式返回表单,格式为$('#signInForm')" or "$('#signInForm').serialize()

道歉,如果对这个问题的想法都是相当混乱的,但我真的希望有人注意到我的设置中可以重新设计的东西 - 感谢任何想法!

+1

请勿使用点击事件来控制表单提交。使用提交事件。否则,键盘提交将绕过你的代码! –

+0

请提供您的输出HTML样本,以便模型准确:) –

+0

好吧,换句话说,完全删除onclick - 但这是一个普遍的安全建议,而不是解决我的问题的东西吗? – d3wannabe

回答

1

the most promising suggestion was to remove the onclick attribute from my button and implement something like

是的。去做。

I can't use "this.form" to refer to my original form

这是因为事件是在表单的上下文中触发而不是提交按钮。使用this而不是this.form

$('#signInForm')" or "$('#signInForm').serialize() 

原始函数需要一个DOM对象来表示窗体。其中第一个是围绕这种对象的jQuery包装器,第二个是来自表单的一串URL编码数据。

如果你打算使用这种方法(你不应该这样做,因为this更优雅),那么你可以使用$('#signInForm')[0]从jQuery对象中提取DOM对象。