Javascript覆盖表单onsubmit事件无效

时间:2015-04-30 11:33:19

标签: javascript forms javascript-events

我正在覆盖这样的表单提交事件:

form.onsubmit = function(event) {
  event.preventDefault();

但是当我在一个单独的函数中调用这样的表单时提交:

form.submit();

未调用onsubmit函数,并且照常传送表单。

有什么想法吗?

编辑:

我也在这个表单中创建一个文件输入并立即调用它的click事件。这会影响表单提交事件吗?:

if (fileInput && document.createEvent)
{
    var evt = document.createEvent('MouseEvents');
    evt.initEvent('click', true, false);
    fileInput.dispatchEvent(evt);
}

编辑#2:

我在文件输入值发生变化后通过调用表单的提交函数来提交表单:

function nameFileLabel(id)
{
    var f = document.getElementById('fileForm' + id);
    var l = document.getElementById("fileText_" + id);
    var i = document.getElementById("fInputId" + id);
    if (i.value != '')
    {
        l.innerHTML = i.value.replace('fakepath', '...');
        var theUploadForm = document.getElementById('fileDiv_' + id);
        theUploadForm.style.visibility = 'visible';
        theUploadForm.style.display = 'block';
        f.submit();
    }
}

4 个答案:

答案 0 :(得分:4)

要防止表单发布,您的函数必须返回false。

form.onsubmit = function(event) {
    event.preventDefault();
    return false;
}

答案 1 :(得分:1)

试试这个

form.submit = function() {
  //event.preventDefault();     No need of this call
  //do your processing here
}

答案 2 :(得分:1)

正如Manish所指出的,覆盖提交函数和在javascript中调用提交表单都会使事件的传播变得复杂。因此,在javascript中向表单添加了一个隐藏按钮,并调用了按钮的单击功能,而不是表单提交功能。它似乎已经起作用了,它感觉就像一个kludge!非常感谢大家的快速帮助。 : - )

function nameFileLabel(id)
{
    var f = document.getElementById('fileForm' + id);
    var l = document.getElementById('fileText_' + id);
    var i = document.getElementById('fInputId' + id);
    var b = document.getElementById('sub' + id);
    if (i.value != '')
    {
        l.innerHTML = i.value.replace('fakepath', '...');
        var theUploadForm = document.getElementById('fileDiv_' + id);
        theUploadForm.style.visibility = 'visible';
        theUploadForm.style.display = 'block';
        b.click();
    }
}

答案 3 :(得分:0)

关注@ garryp"回答错误"。要添加,请继续阅读MDN event.stopImmediatePropagation以查看event.preventDefault和event.stopPropagation之间的差异和用例。

在旁注,"返回false;"是同样的呼唤;

  event.preventDefault();
  event.stopPropagation();

希望这有帮助。