JQuery - $ no está definido

486

Tengo un simple evento jquery click

<script type="text/javascript">
    $(function() {
        $('#post').click(function() {
            alert("test"); 
        });
    });
</script>

y una referencia jquery definida en el sitio.

<script src="<%=ResolveUrl("~/Scripts/jquery-1.3.2.js")%>" type="text/javascript"></script>

Verifiqué que el script se está resolviendo correctamente, puedo ver el marcado y ver el script directamente en firebug, así que me deben encontrar. Sin embargo, todavía estoy obteniendo:

$ no está definido

y ninguno de los jquery funciona. También probé las diversas variaciones de esto como $ (document) .ready y jQuery, etc.

Es una aplicación MVC 2 en .net 3.5, estoy seguro de que estoy siendo muy denso, en todas partes en google dice que verifique que el archivo esté referenciado correctamente, lo que he revisado y comprobado nuevamente, ¡por favor avise! : /

Paul Creasey
fuente
66
¿Realmente ve el jquery-1.3.2.js solicitado y cargado con el código de respuesta HTTP200, si inspecciona la carga de la página con la herramienta Fiddler?
naivistas
18
¿se está ejecutando tu script antes de jquery?
Surya
2
¿Puedes ver la fuente y hacer clic en el enlace js? Parece que su jquery no está cargado en la página. Pruebe la pantalla de la consola Firebug para ver los errores Pruebe también ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js en su etiqueta de script
nemke
2
¿Se está activando su script antes de cargar la fuente jquery?
Dave Bacher
1
@ Surya / Dave, me he ido a casa ahora, así que lo revisaré de nuevo mañana, y volveré y publicaré, pero creo que probablemente el problema sea: / ¡qué vergüenza!
Paul Creasey

Respuestas:

560

Ese error solo puede ser causado por una de tres cosas:

  1. Su archivo JavaScript no se carga correctamente en su página
  2. Tienes una versión fallida de jQuery. Esto podría suceder porque alguien editó el archivo principal o un complemento puede haber sobrescrito la variable $.
  3. Tiene JavaScript ejecutándose antes de que la página se cargue por completo y, como tal, antes de que jQuery se cargue por completo.

En primer lugar, asegúrese de qué script se llama correctamente, debería verse así

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

y no debería tener atributos asíncronos o diferidos .

Luego debe verificar el panel de red Firebug para ver si el archivo se está cargando correctamente. Si no, se resaltará en rojo y dirá "404" al lado. Si el archivo se carga correctamente, eso significa que el problema es el número 2.

Asegúrese de que todo el código jQuery javascript se esté ejecutando dentro de un bloque de código como:

$(document).ready(function () {
  //your code here
});

Esto asegurará que su código se cargue después de que jQuery se haya inicializado.

Una última cosa que debe verificar es asegurarse de que no está cargando ningún complemento antes de cargar jQuery. Los complementos extienden el objeto "$", por lo que si carga un complemento antes de cargar jQuery core, obtendrá el error que describió.

Nota: Si está cargando código que no requiere que jQuery se ejecute, no necesita colocarse dentro del controlador listo para jQuery. Ese código puede separarse usando document.readyState.

Mike Trpcic
fuente
182
Con respecto a su bloque de código, $(document)tampoco funcionará a menos que tenga una etiqueta de script incluyendo jQuery antes de que la declaración ...
PatrikAkerstrand
3
Me gustaría agregar que tuve el mismo problema que el OP y mi problema fue que usar https con la biblioteca de jquery no funciona tan bien.
Mike Cheel
20
(función ($) {}) (jQuery);
JackMahoney
2
@Patrik: Vea mi respuesta para una solución usando una sección de scripts en la vista. De esta forma, jquery se cargará primero y $ se definirá correctamente.
angularsen
1
Compruebe si también tiene una sincronización en el script, eso es lo que causó el problema en mi caso.
Anders
207

Puede ser que tenga su etiqueta de script llamada antes de que se llame al script jquery.

<script type="text/javascript" src="js/script.js"></script>

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

Esto resulta como $ no está definido

Ponga el jquery.js antes de su etiqueta de script y funcionará;) así:

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

<script type="text/javascript" src="js/script.js"></script>
Hanky ​​Panky
fuente
1
Esta es una gran respuesta. Lo intenté y funcionó para mí. Estoy usando VS 2013 y ASP.net. ¿Sabes cómo puedo hacer que javascript se cargue antes de que la página se cargue automáticamente en asp.net o tengo que hacer referencia a javascript de esta manera en todos mis archivos?
Pat
Para agregar a su respuesta. En ASP.net puede ingresar a Shared_Layout.cshtml `<head> </head>`
Pat
@pat y asegúrese de escribir su código dentro de una @section Scriptsetiqueta
Marc
Actualice la
Josh Habdas
66

Primero debe asegurarse de que el script jQuery esté cargado. Esto podría ser de un CDN o local en su sitio web. Si no carga esto primero antes de intentar usar jQuery, le dirá que jQuery no está definido.

<script src="jquery.min.js"></script>

Esto podría estar en el encabezado o en el pie de página de la página, solo asegúrese de cargarlo antes de intentar llamar a cualquier otra cosa de jQuery.

Entonces necesita usar una de las dos soluciones a continuación

(function($){
// your standard jquery code goes here with $ prefix
// best used inside a page with inline code, 
// or outside the document ready, enter code here
 })(jQuery); 

o

jQuery(document).ready(function($){
// standard on load code goes here with $ prefix
// note: the $ is setup inside the anonymous function of the ready command
});

tenga en cuenta que muchas veces $ (document) .ready (function () {// code here}); no trabajará.

Andrew Killen
fuente
1
"jQuery no está definido". Sin embargo, existe después de la carga de la página.
Paul Totzke
No estoy seguro de si se trata de una pregunta o una declaración, pero comprobaría que llamaras al script jQuery antes de intentar usarlo. Parece que lo estás cargando en el pie de página y llamando cosas más arriba en la página.
Andrew Killen
Lo siento, pensé que esta era una técnica que podía usar los scripts en cualquier orden. Sí, estaba usando esto en la sección del cuerpo en el estilo MVC. mycode.js y luego jQuery.js son las 2 últimas cosas en la página.
Paul Totzke
No te preocupes Paul, he editado la solución para incluir 'debes ... cargar primero'. :)
Andrew Killen
¿Esto soluciona el problema de "Mis scripts están en el orden correcto pero los scripts se cargan en un orden diferente". Recuerdo haber hecho algo así hace 4 años, pero no recuerdo qué problema resolvió.
Paul Totzke
50

Si la llamada del complemento jQuery está al lado de </body>, y su script se carga antes de eso, debe hacer que su código se ejecute después del window.onloadevento, de esta manera:

window.onload = function() {
  //YOUR JQUERY CODE
}

``

por lo tanto, su código se ejecutará solo después de la carga de la ventana, cuando se hayan cargado todos los activos. En ese punto, $se definirá jQuery ( ).

Si usas eso:

$(document).ready(function () {
  //YOUR JQUERY CODE
});

``

la $aún no está definido en este momento, porque es llamado antes de cargar el jQuery, y la secuencia de comandos se producirá un error en esa primera línea en la consola.

dandapereira
fuente
Generalmente es una mala idea vincularlo a window.unload. ¡Efectivamente será el único evento que se ejecute!
Rudi Strydom
Nota: Recuerde que solo puede asignar una función window.onload, si le asigna otra función, la anterior no se ejecutará.
Bruno Peres
28

Simplemente hice lo mismo y descubrí que tenía un montón de

type="text/javacsript"

Entonces estaban cargando, pero no dieron más pistas de por qué no estaba funcionando. No hace falta decir que la ortografía correcta lo arregló.

George R
fuente
Nota para el moderador : el error tipográfico en esta publicación es deliberado , para ilustrar un punto. Por favor, no edite la publicación para "corregir" esto.
Martijn Pieters
23

Utilice una sección de secuencias de comandos en la vista y el diseño maestro.

Ponga todos sus scripts definidos en su vista dentro de una sección de Scripts de la vista. De esta manera, puede hacer que el diseño maestro cargue esto después de que se hayan cargado todos los demás scripts. Esta es la configuración predeterminada al iniciar un nuevo proyecto web MVC5. No estoy seguro acerca de las versiones anteriores.

Vistas / Foo / MyView.cshtml:

// The rest of your view code above here.

@section Scripts 
{ 
    // Either render the bundle defined with same name in BundleConfig.cs...
    @Scripts.Render("~/bundles/myCustomBundle")

    // ...or hard code the HTML.
    <script src="URL-TO-CUSTOM-JS-FILE"></script>

    <script type="text/javascript">
      $(document).ready(function () {

        // Do your custom javascript for this view here. Will be run after 
        // loading all the other scripts.            
      });
    </script>
}

Vistas / Compartido / _Layout.cshtml

<html>
<body>
    <!-- ... Rest of your layout file here ... -->

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>
</html>

Observe cómo la sección de secuencias de comandos se representa en último lugar en el archivo de diseño maestro.

angularsen
fuente
2
Nota: Las secciones de vista no se admiten en vistas parciales por diseño.
Adam Naylor
Esto es lo que tenía que hacer para mi solución ... y debería haber sabido mejor usar los @Scripts en primer lugar, pero lo olvidé hasta que busqué una solución.
Caverman
12

asegúrese de cargar realmente jquery, esto no es jquery, ¡es la interfaz de usuario!

  <script language="JavaScript" 
    src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js">
  </script>

Esta es una fuente de script correcta para jquery:

 <script language="JavaScript"  src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
Wolfgang Fahl
fuente
11

Como se indicó anteriormente, ocurre debido al conflicto de $ variable.

Resolví este problema reservando una variable secundaria para jQuery sin conflicto.

var $j = jQuery.noConflict();

y luego úsalo en cualquier lugar

$j( "div" ).hide();

más detalles se pueden encontrar aquí

Naveed Abbas
fuente
8

Significa que su biblioteca jQuery aún no se ha cargado.

Puede mover su código después de extraer la biblioteca jQuery.

o puedes usar algo como esto

window.onload = function(){
  // Your code here
};  
Nesar
fuente
Esto se activa después de que se haya cargado el DOM, pero no cuando los controles, javascript y otros programas que se ejecutan en segundo plano se han cargado. Se necesitaría un retraso de tiempo para que esto funcione.
Fandango68
5

Después de algunas pruebas encontré una solución rápida, puede agregar en la parte superior de su página de índice:

<script>
$=jQuery;
</script>

funciona muy bien :)

Mimouni
fuente
44
la pregunta era: $ no está definido, ¿no?
Mimouni
Error de referencia no capturado: jQuery no está definido
Simon Schnell
¿Lo colocó justo debajo de la importación de la biblioteca jQuery?
Mike Warren
4

Recibí el mismo mensaje de error cuando type="text/javascript"escribí mal la referencia jQuery y en lugar de escribir "... javascirpt". ;)

alan
fuente
Eureka! Yo tenía el mío como type="text/css". ¡Gracias por salvar mi cordura!
Jeriko
Me hice el tonto y lo hice type="javascript". Perdí 30 minutos para encontrarlo.
albañil
4

Parece que jQuery no se carga correctamente. ¿Qué fuente / versión estás usando?

Alternativamente, podría ser una colisión de espacio de nombres, así que intente usar jQuery explícitamente en lugar de usar $. Si eso funciona, puede usarlo noConflictpara asegurarse de que el otro código que está usando $no se rompa.

Alexender Dumma
fuente
3

Ese error significa que jQuery aún no se ha cargado en la página. Usar $(document).ready(...)o cualquier variante del mismo no servirá, como $es la función jQuery.

Usar window.onloaddebería funcionar aquí. Tenga en cuenta que solo se puede asignar una función window.onload. Para evitar perder la lógica de carga original, puede decorar la función original de esta manera:

originalOnload = window.onload;
window.onload = function() {
  if (originalOnload) {
    originalOnload();
  }
  // YOUR JQUERY
};

Esto ejecutará la función que se asignó originalmente window.onloady luego se ejecutará // YOUR JQUERY.

Consulte https://en.wikipedia.org/wiki/Decorator_pattern para obtener más detalles sobre el patrón decorador.

Kyle McVay
fuente
2

Yo uso Url.Content y nunca tengo un problema.

<script src="<%= Url.Content ("~/Scripts/jquery-1.4.1.min.js") %>" type="text/javascript"></script>
mdm20
fuente
2

En la solución se menciona: "Una última cosa que debe verificar es asegurarse de que no está cargando ningún complemento antes de cargar jQuery. Los complementos amplían el objeto" $ ", por lo que si carga un complemento antes de cargar jQuery core, entonces obtendré el error que describiste ".

Por evitar esto ...

Muchas bibliotecas de JavaScript usan $ como función o nombre de variable, tal como lo hace jQuery. En el caso de jQuery, $ es solo un alias para jQuery, por lo que toda la funcionalidad está disponible sin usar $. Si necesitamos usar otra biblioteca de JavaScript junto con jQuery, podemos devolver el control de $ a la otra biblioteca con una llamada a $ .noConflict ():


fuente
1

Tuve este problema una vez sin razón aparente. Estaba sucediendo localmente mientras estaba corriendo a través del servidor de desarrollo aspnet. Había estado funcionando y volví todo a un estado en el que anteriormente había estado funcionando y todavía no funcionaba. Miré en el depurador de cromo y el jquery-1.7.1.min.js se había cargado sin ningún problema. Todo fue muy confuso. Todavía no sé cuál fue el problema, pero cerré el navegador, cerré el servidor de desarrollo y luego volví a solucionarlo.

cedd
fuente
1

Simplemente coloque la url de jquery en la parte superior de su código de jquery

Me gusta esto--

<script src="<%=ResolveUrl("~/Scripts/jquery-1.3.2.js")%>" type="text/javascript"></script>

<script type="text/javascript">
    $(function() {
        $('#post').click(function() {
            alert("test"); 
        });
    });
</script>
vikrantx
fuente
1

Tuve el mismo problema y fue porque mi referencia a jQuery.js no estaba en la etiqueta. Una vez que cambié eso, todo comenzó a funcionar.

Antonio

Antonio
fuente
1
  1. Verifique que la ruta exacta de su archivo jquery esté incluida.

    <script src="assets/plugins/jquery/jquery.min.js"></script>

si agrega esto en la parte inferior de su página, llame a la función JS debajo de esta declaración.

  1. Verifique usando esta prueba de código,

    <script type="text/javascript">
    /***
     * Created by dadenew
     * Submit email subscription using ajax
     * Send email address
     * Send controller
     * Recive response
     */
    $(document).ready(function() { //you can replace $ with Jquery
    
      alert( 'jquery working~!' );
    });

¡Paz!

Daniel Adenew
fuente
0

Tenemos el mismo problema ... pero accidentalmente verifiqué las propiedades de la carpeta y configuré algo ...

Debe verificar las propiedades de cada carpeta a la que está accediendo.

  1. carpeta de clic derecho
  2. pestaña 'permisos'
  3. configurar el acceso a la carpeta: PROPIETARIO: crear y eliminar archivos GRUPO: acceder a los archivos OTROS: acceder a los archivos

Espero que esta sea la solución ......

RoyS_philippines
fuente
0

Cuando use jQuery en asp.net, si está utilizando una página maestra y está cargando el archivo fuente jquery allí, asegúrese de tener el marcador de contenido de encabezado después de todas las referencias de script jquery.

Tuve un problema en el que las páginas que usaban esa página maestra devolverían '$ no está definido' simplemente porque el orden incorrecto estaba haciendo que el código del lado del cliente se ejecutara antes de que se creara el objeto jquery. Así que asegúrese de tener:

<head runat="server">
    <script type="text/javascript" src="Scripts/jquery-VERSION#.js"></script>
    <asp:ContentPlaceHolder id="Header" runat="server"></asp:ContentPlaceHolder>
</head>

De esa manera, el código se ejecutará en orden y podrá ejecutar el código jQuery en las páginas secundarias.

Francis Musignac
fuente
0

En mi caso, estaba apuntando a JQuery alojado en Google. Se incluyó correctamente, pero estaba en una página HTTPS y llamé a través de HTTP. Una vez que solucioné el problema (o permití contenido inseguro), se activó de inmediato.

Antonio
fuente
0

Estaba teniendo este mismo problema y no podía entender qué lo estaba causando. Recientemente convertí mis archivos HTML del japonés a UTF-8, pero no hice nada con los archivos de script. De alguna manera, jquery-1.10.2.min.js se corrompió en este proceso (todavía no tengo idea de cómo). Reemplazando jquery-1.10.2.min.js con el original lo arregló.

Gavin
fuente
0

parece que si ubica sus archivos jquery.js en la misma carpeta o en algunas subcarpetas donde está su archivo html, el problema de Firebug está resuelto. por ejemplo, si su html está en C: / folder1 /, sus archivos js también deberían estar en algún lugar debajo de C: / folder1 / (o C: / folder1 / folder2, etc.) y se abordarán en consecuencia en el documento html. espero que esto ayude.

sc123
fuente
0

Tengo el mismo problema y ningún caso me resuelve el problema. Lo único que funciona para mí, se coloca en el archivo Site.master, el siguiente:

<script src="<%= ResolveUrl("~/Scripts/jquery-1.7.1.min.js") %>" type="text/javascript"></script>
<script src="<%= ResolveUrl("~/Scripts/bootstrap/js/bootstrap.min.js") %>" type="text/javascript"></script>

Con src = "<% = ResolveUrl (" ") ... la carga de jQuery en las páginas de contenido es correcta.

amelian
fuente
0

Tuve un problema muy similar. En mi aplicación C # MVC, JQuery no estaba siendo reconocido. Necesitaba mover el @ Scripts.Render ("~ / bundles / jquery") desde la parte inferior de mi archivo _Layout.cshtml al encabezado de la sección. ¡También asegúrese de tener Jquery como un paquete Nuget si está usando Visual Studio!

<head>
    @Scripts.Render("~/bundles/jquery")
</head>
Como
fuente
0

Hay una manera de hacer que cargue automáticamente JavaScript antes de que se ejecute el resto del código.

Vaya a Vistas \ Shared_Layout.html y agregue lo siguiente

<head>
  <*@ Omitted code*@>
  <script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript"></script>
</head>
Palmadita
fuente
0

si la scriptetiqueta tiene deferatributo, muestra el error

Error de referencia no capturado: $ no está definido

y debe eliminar el atributo deferde la scriptetiqueta

Abdul Ahmad Matin
fuente
0

Este es el problema común para resolver esto, debe verificar algún punto

  1. Incluir biblioteca principal de Jquery
  2. Verifique el problema del navegador cruzado
  3. Agregar biblioteca en la parte SUPERIOR del código jquery
  4. Verifique que las CDN estén bloqueadas.

Los detalles completos se dan en este blog, haga clic aquí

Anju Batta
fuente