我有以下代码在我的网站上发表评论
$('#leave-comment').keypress(function(e) {
if (e.which == 13 && !e.shiftKey) {
post_comment();
}
});
然后以下是post_comment函数
$('#leave-comment').submit();
$('#frm-leave-comment').unbind('submit');
$('#frm-leave-comment').submit(function(e) {
// Code here for submit
}
当我第一次按下输入时,它会按下按键(通过发出警报进行验证)。它也会按下正确的键(输入 - 13),它还会运行post_comment函数。
问题是它没有提交表格
$('#frm-leave-comment').submit(function(e) {
然而,我第二次按回车键确实提交了表格并且运作正常。
需要注意的一点是,第一个代码块是从加载了ajax的页面运行的。
第二个代码块在页面加载时加载了外部javascript。
我检查过jquery没有加载两次。
还有其他一些令人讨厌的事情发生,如果我将顶部代码块包装在$(文档)中。现在它不会触发代码,并且在我的网站上的其他地方使用stopPropagation时,它会工作第二个时间,但不是第一次,所以我认为这只是加载jquery的方式的问题,而不是上面的代码。
有没有人知道这里可能会发生什么?
答案 0 :(得分:1)
据推测,您的表单没有任何默认的“提交”操作?至少这似乎是您在上述评论中声称的内容:
当我打电话给提交时,我输入e.preventDefault来停止提交表单。
让我们分解你的功能:
首次调用该函数:
$('#leave-comment').submit(); // does nothing, by your design
$('#frm-leave-comment').unbind('submit'); // removes any existing submit handler, so doesn't observably do anything
$('#frm-leave-comment').submit(function(e) { /*...*/ }); // adds a new submit handler, to be used *the next time* the form is submitted
第二次调用该函数:
$('#leave-comment').submit(); // invokes your submit handler
$('#frm-leave-comment').unbind('submit'); // removes your submit handler
$('#frm-leave-comment').submit(function(e) { /*...*/ }); // re-adds *the same submit handler* you just removed
因此,当您第一次执行此功能时,您实际上并未提交任何内容。您只是绑定要在下次执行此函数时使用的提交处理程序。
和你保持解除绑定并重新绑定相同的提交处理程序。
这太过于复杂了。完全删除post_comment
函数,并在页面加载时绑定您的提交处理程序:
$(function () {
$('#frm-leave-comment').submit(function(e) {
// Code here for submit
}
});
然后在您的keypress
处理程序中,只需提交表单:
$('#leave-comment').keypress(function(e) {
if (e.which == 13 && !e.shiftKey) {
$('#leave-comment').submit();
$('#frm-leave-comment').submit();
}
});