Erro "Enviar não é uma função" em JavaScript

264

Alguém pode me dizer o que está acontecendo de errado com este código? Tentei enviar um formulário com JavaScript, mas o erro ".submit não é uma função" é mostrado. Veja abaixo para mais detalhes do código:

<form action="product.php" method="get" name="frmProduct" id="frmProduct" enctype="multipart/form-data">

<input onclick="submitAction()" id="submit_value" type="button" name="submit_value" value="">

</form>

<script type="text/javascript">
    function submitAction()
    {
        document.frmProduct.submit();
    }
</script>

Eu também tentei isso:

<script type="text/javascript">
    function submitAction()
    {
        document.forms["frmProduct"].submit();
    }
</script>

Ambos me mostram o mesmo erro :(

Jin Yong
fonte
Qual navegador envia essa mensagem? Você pode postar a fonte completa?
harto
Considerando que o código postado funciona para mim no IE7 e no Chrome2, talvez haja algo errado no código que você não postou?
Lasse V. Karlsen
11
Talvez você tenha um campo com o nome ou o ID enviado e, assim, .submit () é sombreado por esse campo?
Lasse V. Karlsen
esse erro ocorreu quando você tem o mesmo id = "frmProduct" em diferentes elementos.
Optimaz ID 30/08/19

Respostas:

736

enviar não é uma função

significa que você nomeou seu botão de envio ou algum outro elemento submit. Renomeie o botão para btnSubmite sua chamada funcionará magicamente.

Ao nomear o botão enviar, você substitui a submit()função no formulário.

epascarello
fonte
55
Aqui está um truque útil. Se você está preso com o seu enviar ser botão #submit, você pode obter em torno dele por roubar de outra instância do formulário submit()método, por exemplo: document.createElement('form').submit.call(document.frmProduct).
Neil E. Pearson
35
Parece que todo mundo tem que aprender esse da maneira mais difícil. Faria uma pergunta da entrevista bom trabalho
SeanDowney
9
Eu simplesmente removi o nome = 'submit' e a sua tia Bob funcionou !!
Zzapper
2
Espantado, eu nunca me deparei com isso, mas, infelizmente, esse era o problema!
Natebeaty 8/07
3
Eu só perdi meu 2-3 horas para este problema, muito obrigado pela resposta
Mehul Prajapati
12
<form action="product.php" method="post" name="frmProduct" id="frmProduct" enctype="multipart/form-data">

<input id="submit_value" type="button" name="submit_value" value="">

</form>

<script type="text/javascript">

document.getElementById("submit_value").onclick = submitAction;

function submitAction()
{
    document.getElementById("frmProduct").submit();
    return false;
}
</script>

EDIT: Eu acidentalmente troquei os IDs ao redor

Chad Grant
fonte
document.getElementById ("frmProduct"). submit não é uma função :(
Jin Yong
1
Você tem mais de um elemento com o ID 'frmProduct'?
Tvanfosson 07/05/2009
Adicionar submitAction como manipulador para o envio e, em seguida, invocar o envio a partir dele pode criar um loop infinito. O manipulador deve ser associado ao clique do botão.
Tvanfosson 07/05/2009
1
Voto com respostas precisas hein? caras coxos, etapa em nós para obter os pontos que você está vendendo suas almas para
Chad Grant
@Chad Grant - Não poderia concordar mais.
Fenton
10

Verifique se não há outro formulário com o mesmo nome e verifique se não há name = "submit" ou id = "submit" no formulário.

gopeca
fonte
9

Se você não tem oportunidade de alterar, name="submit"também pode enviar o formulário desta maneira:

function submitForm(form) {
    var submitFormFunction = Object.getPrototypeOf(form).submit;
    submitFormFunction.call(form);
}
Terbiy
fonte
5
HTMLFormElement.prototype.submit.call(form)também funciona
musa
5

Eu tive o mesmo problema quando estava criando um aplicativo MVC usando com páginas mestras. Tentei procurar o elemento com 'submit' como os nomes mencionados acima, mas não foi o caso.

Para o meu caso, ele criou várias tags na minha página, por isso houve alguns problemas relacionados ao formulário correto.

Para contornar isso, deixarei o botão manipular qual objeto de formulário usar:

onclick="return SubmitForm(this.form)"

e com o js:

function SubmitForm(frm) {
    frm.submit();
}
Quangahh
fonte
3

Este tópico já tem muitas respostas, mas a que funcionou melhor (e mais simples - uma linha!) Para mim foi uma modificação do comentário feito por Neil E. Pearson em 21 de abril de 2013:

Se você está preso com o botão enviar sendo #submit, pode contornar isso roubando o método submit () de outra instância de formulário.

Minha modificação no método dele e o que funcionou para mim:

document.createElement('form').submit.call(document.getElementById(frmProduct));

jlemley
fonte
2

atribuir um nome a um elemento de formulário a uma sombra simples da propriedade de envio. verifique se você não possui um elemento de formulário com o nome submit e deve conseguir acessar a função de envio corretamente.

Ahmed Eid
fonte
2

De fato, a solução é muito fácil ...

Original:

    <form action="product.php" method="get" name="frmProduct" id="frmProduct"
enctype="multipart/form-data">
    <input onclick="submitAction()" id="submit_value" type="button" 
    name="submit_value" value="">
</form>
<script type="text/javascript">
    function submitAction()
    {
        document.frmProduct.submit();
    }
</script>

Solução:

    <form action="product.php" method="get" name="frmProduct" id="frmProduct" 
enctype="multipart/form-data">
</form>

<!-- Place the button here -->
<input onclick="submitAction()" id="submit_value" type="button" 
    name="submit_value" value="">

<script type="text/javascript">
    function submitAction()
    {
        document.frmProduct.submit();
    }
</script>
Zurc Soirrab
fonte
Você pode explicar como isso resolve o problema do OP.
Kingsley
Com certeza, neste caso (somente neste caso), o problema é o escopo.
Zurc Soirrab
1

Você deve usar este código:

$(document).on("ready", function () {
       
        document.frmProduct.submit();
    });

AnilSengul
fonte
Embora esse trecho de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não saber os motivos da sua sugestão de código. Tente também não sobrecarregar seu código com comentários explicativos, pois isso reduz a legibilidade do código e das explicações!
Filnor
0

O que eu usei é

var enviar = document.getElementById("enviar");
enviar.type = "submit"; 

Só porque todo o resto não funcionou.

compraspro.com
fonte
0

A solução para mim foi definir o atributo "formulário" do botão

<form id="form_id_name"><button name="btnSubmit" form="form_id_name" /></form>

ou é js:

YOURFORMOBJ.getElementsByTagName("button")[0].setAttribute("form", "form_id_name");
YOURFORMOBJ.submit();
ProtonIonNeutron
fonte
0

Soluções possíveis -
1. Certifique-se de que você não tem nenhum outro elemento com nome / ID como enviar.
2.Tente chamar a função como onClick = "return submitAction();"
3.document.getElementById("form-name").submit();

Ram Thota
fonte
-1

Podes tentar

<form action="product.php" method="get" name="frmProduct" id="frmProduct" enctype="multipart/form-data">

<input onclick="submitAction(this)" id="submit_value" type="button" name="submit_value" value="">

</form>

<script type="text/javascript">
function submitAction(element)
{
    element.form.submit();
}
</script>

Você não tem mais de um formulário com o mesmo nome?

Fabien Ménager
fonte
-1

Use getElementById:

document.getElementById ('frmProduct').submit ()
Ilya Birman
fonte