Error "Enviar no es una función" en JavaScript

264

¿Alguien puede decirme qué está mal con este código? Intenté enviar un formulario con JavaScript, pero se muestra el error ".submit no es una función". Consulte a continuación para obtener más detalles del 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>

También probé esto:

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

Ambos me muestran el mismo error :(

Jin Yong
fuente
¿Qué navegador te da este mensaje? ¿Puedes publicar la fuente completa?
harto
Teniendo en cuenta que el código publicado funciona para mí tanto en IE7 como en Chrome2, ¿quizás hay algo mal en el código que no has publicado?
Lasse V. Karlsen
11
¿Quizás tiene un campo con el nombre o el id de envío y, por lo tanto, .submit () está sombreado por ese campo?
Lasse V. Karlsen
ese error ocurrió cuando tienes el mismo id = "frmProduct" en diferentes elementos.
Identificación de Optimaz

Respuestas:

736

enviar no es una función

significa que usted nombró su botón de envío o algún otro elemento submit. Cambie el nombre del botón a btnSubmity su llamada funcionará mágicamente.

Cuando nombra el botón enviar, anula la submit()función en el formulario.

epascarello
fuente
55
Aquí hay un truco útil. Si le pegan con tu ser botón de envío #submit, lo puede conseguir alrededor por el robo de otra instancia de formulario submit()método, por ejemplo: document.createElement('form').submit.call(document.frmProduct).
Neil E. Pearson el
35
Parece que todos tienen que aprender esto de la manera difícil. Haría una buena pregunta de entrevista de trabajo
SeanDowney
9
¡Simplemente eliminé el nombre = 'enviar' y Bob es tu tía, funcionó!
zzapper
2
Sorprendido, nunca me he encontrado con esto, pero ¡ay, ese era el problema!
natebeaty
3
Acabo de perder mis 2-3 horas para este problema, muchas gracias por la respuesta
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>

EDITAR: accidentalmente cambié la identificación alrededor

Chad Grant
fuente
document.getElementById ("frmProduct"). submit no es una función :(
Jin Yong
1
¿Tiene más de un elemento con el id 'frmProduct'?
tvanfosson
Agregar submitAction como un controlador para el envío y luego invocar el envío desde este puede crear un bucle infinito. El controlador debe estar asociado con el clic del botón.
tvanfosson
1
Votación negativa respuestas precisas ¿eh? chicos cojos, pisenos para obtener esos puntos por los que está vendiendo sus almas
Chad Grant
@Chad Grant - No podría estar más de acuerdo.
Fenton
10

Asegúrese de que no haya otro formulario con el mismo nombre y asegúrese de que no haya name = "submit" o id = "submit" en el formulario.

gopeca
fuente
9

Si no tiene la oportunidad de cambiar name="submit", también puede enviar el formulario de esta manera:

function submitForm(form) {
    var submitFormFunction = Object.getPrototypeOf(form).submit;
    submitFormFunction.call(form);
}
Terbiy
fuente
55
HTMLFormElement.prototype.submit.call(form)también funciona
musa
5

Tuve el mismo problema cuando estaba creando una aplicación MVC usando páginas maestras. Intenté buscar un elemento con 'enviar' como nombres como se mencionó anteriormente, pero no fue el caso.

Para mi caso, creó varias etiquetas en mi página, por lo que hubo algunos problemas con la forma correcta.

Para evitar esto, dejaré que el botón maneje qué objeto de formulario usar:

onclick="return SubmitForm(this.form)"

y con el js:

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

Este tema ya tiene muchas respuestas, pero la que mejor funcionó (¡y más simple - una línea!) Para mí fue una modificación del comentario hecho por Neil E. Pearson del 21 de abril de 2013:

Si está atascado con el botón de envío como #submit, puede evitarlo robando el método submit () de otra instancia de formulario.

Mi modificación a su método, y lo que funcionó para mí:

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

jlemley
fuente
2

dar a un elemento de formulario un nombre de envío simplemente sombreará la propiedad de envío. asegúrese de que no tiene un elemento de formulario con el nombre submit y que debería poder acceder a la función de envío muy bien.

Ahmed Eid
fuente
2

De hecho, la solución es muy 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>

Solución:

    <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
fuente
¿Puede explicar cómo esto resuelve el problema del OP?
Kingsley el
Por supuesto, en este caso (solo en este caso) el problema es el alcance.
Zurc Soirrab
1

Deberías usar este código:

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

AnilSengul
fuente
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no saber los motivos de su sugerencia de código. ¡Intente también no saturar su código con comentarios explicativos, esto reduce la legibilidad tanto del código como de las explicaciones!
Filnor
0

Lo que usé es

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

Solo porque todo lo demás no funcionó.

compraspro.com
fuente
0

La solución para mí fue establecer el atributo "formulario" del botón

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

o es js:

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

Posibles soluciones:
1.Asegúrese de no tener ningún otro elemento con nombre / id como envío.
Intenta llamar a la función como onClick = "return submitAction();"
3.document.getElementById("form-name").submit();

Ram Thota
fuente
-1

Puedes probar

<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>

¿No tienes más de una forma con el mismo nombre?

Fabien Ménager
fuente
-1

Use getElementById:

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