Error de tipo no detectado: undefined no es una función al cargar jquery-min.js

104

Estoy creando una página web normal que requiere que cargue unos cinco archivos CSS y diez archivos Javascript.

  • Al cargarlos por separado en la página HTML, mi página web se carga bien.
  • Ahora para la producción, concatené todo el Javascript en un solo archivo, en el orden necesario, y todo el CSS en otro archivo. Pero cuando intento ejecutar la página web con los archivos concatenados, arroja un error que dice:

    Uncaught TypeError: undefined is not a function

En la línea donde se carga jquery.min.js en el archivo Javascript concatenado.

¿Qué puedo hacer para mitigar esto? Quiero concatenar todos los archivos y minimizarlos para la producción. Por favor ayuda.


EDITAR: Fusioné Javascript y CSS en el orden en que estaban cuando se cargaban individualmente y funcionaban bien.

ghostCoder
fuente
5
¿Cómo podemos saber qué es undefinedsi no tienes un código para mostrar?
Joseph
el indefinido viene en el jquery-1.6.1.min.js que estoy cargando. tal vez jquery no se está cargando correctamente o algo así?
ghostCoder
aceptar la respuesta de alto rango tal vez?
Allisone

Respuestas:

179

Suponiendo que este problema aún no se ha resuelto, muchos archivos individuales no terminan su código con un punto y coma. La mayoría de los scripts de jQuery terminan con (jQuery)y debe tener (jQuery);.

Como archivos separados, la secuencia de comandos se cargará bien, pero como un archivo individual, necesita el punto y coma.

Dustin
fuente
18
+1. Al concatenar código JavaScript, siempre debe unirlos con punto y coma. Demasiados de ellos siguen siendo válidos, mientras que menos dan lugar a errores.
Bergi
9
Eso es increíblemente complicado de depurar. ¡Gracias por una respuesta realmente eficaz!
ghayes
5
Js de Bootstrap es uno de esos ejemplos, aparentemente. ¡Gracias por esto! Eso fue un verdadero raspador de fideos.
Kevin Beal
Estoy intentando importar la API de iframe de youtube, y no termina en punto y coma, y ​​recibo este error. No lo estoy concatenando con nada ... lo estoy cargando con jQuery.getScript (). Entonces ... ¿Podría ser esto lo que está causando mi error? ¿O eso no tiene sentido?
Daniel
1
¿Cómo resolvemos esto si vemos este error mientras trabajamos con una biblioteca? Estoy tratando de usar 2.3.2 / js / bootstrap.min.js y /1.4.6/bootstrap-editable/js/bootstrap-editable.min.js
codeObserver
28

Es posible que deba volver a verificar el orden en el que está fusionando los archivos, debería ser algo como:

  1. jquery.min.js
  2. jquery-ui.js
  3. cualquier complemento de terceros que esté cargando
  4. tu JS personalizado
Bilal Murtaza
fuente
es así solo json2.js, jquery-1.6.1.min.js, complementos de jquery, mi código. está en este orden.
ghostCoder
si json2.js está usando cualquier función jquery, entonces jquery.min.js debería ser el primero. Yo sugeriría. jquery.min.js, jqueryPlugins, json2.js, mi código.
Bilal Murtaza
16

Obtuve el mismo error al tener dos referencias a diferentes versiones de jQuery.

En mi página maestra:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

Y también en la página:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"> </script>
scw
fuente
7

Tuve este problema recientemente con el complemento jQuery Validation , usando Squishit , también obteniendo el error js:

"indefinido no es una función"

Lo arreglé cambiando la referencia al archivo jquery.validate.js no minificado, en lugar de jquery.validate.min.js.

@MvcHtmlString.Create(
    @SquishIt.Framework.Bundle.JavaScript()
        .Add("~/Scripts/Libraries/jquery-1.8.2.min.js")
        .Add("~/Scripts/Libraries/jquery-ui-1.9.1.custom.min.js")
        .Add("~/Scripts/Libraries/jquery.unobtrusive-ajax.min.js")
        .Add("~/Scripts/Libraries/jquery.validate.js")
        .Add("~/Scripts/Libraries/jquery.validate.unobtrusive.js")
         ... more files

Creo que la versión minimizada de ciertos archivos, cuando se comprime aún más usando Squishit, por ejemplo, en algunos casos podría no lidiar con los puntos y coma que faltan y cosas por el estilo, como sugiere @Dustin, por lo que es posible que tenga que experimentar con qué archivos puede comprimir doblemente, y dejarlo en Squishit o lo que sea que esté comprando.

Ralph Lavelle
fuente
Usar la versión no minificada fue solo el boleto para mí, gracias.
Paul Deen
Para mí, era el archivo json2.min.js de la versión 1.0.2 de un paquete NuGet el que estaba causando el problema. Lo cambié al archivo non-min y el archivo combinado Squishit funciona bien ahora.
billoreid
6

Para aquellos que todavía no pudieron solucionar esto, lo hice cambiando mi 'this' a '$ (this)' cuando usaba jQuery.

P.EJ:

$('.icon').click(function() {
    this.fadeOut();
});

Fijo:

$('.icon').click(function() {
    $(this).fadeOut();
});
Jack
fuente
5

Me encontré con el mismo problema, cuando se nombró por error variable con el mismo nombre, como función.

Así que esto:

isLive = isLive(data);

falló, generando el mensaje de error mencionado de OP.

Arreglar esto fue tan simple como cambiar la línea anterior a:

isItALive = isLive(data);

No sé, cuánto ayuda en esta situación, pero decidí poner esta respuesta para otros que buscan una solución para problemas similares.

trejder
fuente
5

Sí, también lo arreglé cambiando en las bibliotecas js a unminified.

Por ejemplo, en la etiqueta, cambie:

<script type="text/javascript" src="js/jquery.ui.core.min.js"></script>
<script type="text/javascript" src="js/jquery.ui.widget.min.js"></script>
<script type="text/javascript" src="js/jquery.ui.rcarousel.min.js"></script>

Por:

<script type="text/javascript" src="js/jquery.ui.core.js"></script>
<script type="text/javascript" src="js/jquery.ui.widget.js"></script>
<script type="text/javascript" src="js/jquery.ui.rcarousel.js"></script>

Salir del 'min' como no minificado.

Gracias por la idea.

Francisco Alonso
fuente
3

Recuerde: las funciones de Javascript son SENSIBLES A CASOS.

Tuve un caso en el que estoy bastante seguro de que mi código se ejecutará sin problemas. Pero aún así, recibí un error y verifiqué la consola Javascript de Google Chrome para verificar qué es.

Mi línea de error es

opt.SetAttribute("value",values[a]);

Y recibí el mismo mensaje de error:

Uncaught TypeError: undefined is not a function

Nada parece estar mal con el código anterior, pero no se estaba ejecutando. Soluciono problemas durante casi una hora y luego lo comparo con mi otro código en ejecución. Mi error es que se configuró en SetAttribute, que debería ser setAttribute.

Logan Wayne
fuente
2

En caso de que haya algún idiota como yo, tuve este problema frustrante porque olvidé un simple

new

palabra clave antes de crear una instancia de un nuevo objeto.

CodyBugstein
fuente
1

Acabo de recibir el mismo mensaje con el siguiente código (en IcedCoffeeScript):

f = (err,cb) ->
  cb null, true

await f defer err, res
console.log err if err  

Esto me pareció un código ICS normal. Desplegué la construcción await-defer en CoffeeScript normal:

f (err,res) ->
  console.log err if err

Lo que realmente sucedió fue que traté de pasar 1 función de devolución de llamada (con 2 parámetros) a la función fesperando dos parámetros, efectivamente sin configurar cbadentro f, que el compilador informó correctamente comoundefined is not a function .

El error ocurrió porque pegué ciegamente el código repetitivo de estilo de devolución de llamada. fno necesita errque se le pase un parámetro, por lo que simplemente debería ser:

f = (cb) ->
  cb null, true
f (err,res) ->
  console.log err if err

En el caso general, recomendaría volver a verificar las firmas e invocaciones de funciones para detectar aridades coincidentes. La pila de llamadas en el mensaje de error debería poder proporcionar sugerencias útiles.

En su caso especial, recomiendo buscar definiciones de funciones que aparezcan dos veces en el archivo combinado, con diferentes firmas, o asignaciones a variables globales que contengan funciones.

Jens Jensen
fuente
1

Asegúrate de haber comentado cualquier comentario. A veces, al copiar y pegar, omitirá el "/ *!"

Además, cuando ingrese a la consola, ellos enumerarán sus errores y debe tomarlos uno por uno. Si ve "Uncaught SyntaxError: Unexpected token *", eso podría significar que está leyendo su archivo js y no pasa de la primera línea.

/ *! * jquery.tools 1.1.2: la biblioteca de IU que falta para la Web * * [tools.tabs-1.0.4, tools.tooltip-1.1.2, tools.scrollable-1.1.2, tools.overlay-1.1.2, tools.expose-1.0.5] * * Copyright (c) 2009 Tero Piirainen * http://flowplayer.org/tools/ * Archivo generado: miércoles 07 de octubre 09:40:16 GMT 2009 * /

Tasha
fuente
0

Obtuve esto cuando pasé accidentalmente demasiados parámetros a una función jquery que solo esperaba un parámetro de devolución de llamada.

Para la resolución de problemas de otros: asegúrese de verificar todas las llamadas a la función jquery para ver si hay parámetros adicionales.

JSideris
fuente