Tengo un problema en el que la página se carga tan rápido que jquery no ha terminado de cargarse antes de que un script posterior lo llame. ¿Hay alguna manera de verificar la existencia de jquery y, si no existe, espere un momento y vuelva a intentarlo?
En respuesta a las respuestas / comentarios a continuación, estoy publicando algunas de las marcas.
La situación ... asp.net masterpage y childpage.
En la página maestra, tengo una referencia a jquery. Luego, en la página de contenido, tengo una referencia al script específico de la página. Cuando se carga el script específico de la página, se queja de que "$ no está definido".
Puse alertas en varios puntos del marcado para ver el orden en el que se disparaban las cosas y confirmé que se dispara en este orden:
- Encabezado de la página maestra.
- Bloque de contenido de la página secundaria 1 (ubicado dentro del encabezado de la página maestra, pero después de que se llaman los scripts de la página maestra).
- Bloque de contenido de la página secundaria 2.
Aquí está el marcado en la parte superior de la página maestra:
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="SiteMaster" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Reporting Portal</title>
<link href="~/Styles/site.css" rel="stylesheet" type="text/css" />
<link href="~/Styles/red/red.css" rel="stylesheet" type="text/css" />
<script type="text/Scripts" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/Scripts" language="javascript" src="../Scripts/jquery.dropdownPlain.js"></script>
<script type="text/Scripts" language="javascript" src="../Scripts/facebox.js"></script>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
Luego, en el cuerpo de la página maestra, hay un ContentPlaceHolder adicional:
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
En la página secundaria, se ve así:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Dashboard.aspx.cs" Inherits="Data.Dashboard" %>
<%@ Register src="../userControls/ucDropdownMenu.ascx" tagname="ucDropdownMenu" tagprefix="uc1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<link rel="stylesheet" type="text/css" href="../Styles/paserMap.css" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
***CONTENT HERE***
<script src="../Scripts/Dashboard.js" type="text/javascript"></script>
</asp:Content>
Aquí está el contenido del archivo "../Script/Dashboard.js":
$(document).ready(function () {
$('.tgl:first').show(); // Show the first div
//Description: East panel parent tab navigation
$('.tabNav label').click(function () {
$('.tabNav li').removeClass('active')
$(this).parent().addClass('active');
var index = $(this).parent('li').index();
var divToggle = $('.ui-layout-content').children('div.tgl');
//hide all subToggle divs
divToggle.hide();
divToggle.eq(index).show();
});
});
fuente
$(document).ready(function(){...});
?<script src="...">
etiquetas simples , eso no puede suceder. ¿Estás usando algo como RequireJS o LABjs?$(document).ready()
o$(window).load()
? ¿Podríamos ver un ejemplo?type="text/Scripts"
atype="text/javascript"
, o deshacerse de todo junto, ya no es necesario, también deshágase dellanguage="javascript
. Bien podría empezar a probar cosas.Respuestas:
editar
¿Podría probar el tipo correcto para sus etiquetas de script? Veo que usa
text/Scripts
, que no es el tipo MIME correcto para javascript.Utilizar este:
fin editar
o puede echar un vistazo a require.js, que es un cargador para su código javascript.
dependiendo de su proyecto, esto podría ser un poco exagerado
fuente
Tarde para la fiesta, y similar a la pregunta de Briguy37, pero para referencia futura utilizo el siguiente método y paso las funciones que quiero aplazar hasta que se cargue jQuery:
Llamará recursivamente al método deferir cada 50 ms hasta que
window.jQuery
exista, momento en el que sale y llamamethod()
Un ejemplo con una función anónima:
fuente
script
etiqueta que carga jQuery tenía undefer
atributo, causaría el problema al no cargarse hasta más tarde, a pesar del orden definido por el código de los scripts.puede utilizar el atributo defer para cargar el script al final.
pero normalmente cargar su script en el orden correcto debería funcionar, así que asegúrese de colocar la inclusión de jquery antes de su propio script
Si su código está en la página y no en un archivo js separado, entonces debe ejecutar su script solo después de que el documento esté listo y encapsular su código de esta manera también debería funcionar:
fuente
Otra forma más de hacer esto, aunque el método de aplazamiento de Darbio es más flexible.
fuente
la forma más fácil y segura es usar algo como esto:
fuente
Puedes probar el evento onload. Surgió cuando se cargaron todos los scripts:
Pero tenga en cuenta que puede anular otros scripts donde window.onload usando.
fuente
He descubierto que la solución sugerida solo funciona teniendo en cuenta el código asincrónico. Aquí está la versión que funcionaría en cualquier caso:
fuente
load
función, pero también se reutilizasetTimeout
.Es un problema común, imagina que usas un motor de plantillas PHP genial, por lo que tienes tu diseño base:
Y, por supuesto, si lee en algún lugar, es mejor cargar Javascript en la parte inferior de la página, para que su contenido dinámico no sepa quién es jQuery (o el $).
También leíste en alguna parte que es bueno insertar un pequeño Javascript, así que imagina que necesitas jQuery en una página, baboom, $ no está definido (.. todavía ^^).
Me encanta la solución que ofrece Facebook
Entonces, como programador vago (debería decir un buen programador ^^), puedes usar un equivalente (dentro de tu página):
Y agregue en la parte inferior de su diseño, después de que jQuery incluya
fuente
En lugar de "esperar" (que generalmente se hace usando
setTimeout
), también puede usar la definición del objeto jQuery en la propia ventana como un gancho para ejecutar su código que se basa en él. Esto se puede lograr mediante una definición de propiedad, definida medianteObject.defineProperty
.fuente
window.jQuery
un valor, definiendo lajQuery
variable en el alcance global (es decirwindow
). Esto activará la función de establecimiento de propiedades en el objeto de ventana definido en el código.</body>
lugar de antes</head>
Utilizar:
Mira esto para más información: http://www.learningjquery.com/2006/09/introducing-document-ready
Nota: Esto debería funcionar siempre que la importación del script para su biblioteca JQuery esté por encima de esta llamada.
Actualizar:
Si por alguna razón su código no se carga sincrónicamente (con lo
que nunca me he encontrado, pero aparentemente es posible que el comentario a continuaciónno suceda), puede codificarlo como semuestra acontinuación.fuente
No me gustan mucho las cositas de los intervalos. Cuando quiero aplazar jquery, o cualquier cosa en realidad, suele ser algo como esto.
Empezar con:
Luego:
Entonces finalmente:
O la versión menos alucinante:
Y en el caso de async, podría ejecutar las funciones empujadas en jquery onload.
Alternativamente:
fuente
No creo que ese sea tu problema. La carga de scripts es sincrónica de forma predeterminada, por lo que a menos que esté usando el
defer
atributo o cargando jQuery a través de otra solicitud AJAX, su problema probablemente sea algo más como un 404. ¿Puede mostrar su marcado y hacernos saber si ve algo sospechoso en ¿Firebug o inspector web?fuente
Vamos a expandirnos
defer()
de Dario para que sean más reutilizables.Que luego se ejecuta:
fuente
Mira esto:
https://jsfiddle.net/neohunter/ey2pqt5z/
Creará un objeto jQuery falso, que le permite usar los métodos onload de jquery, y se ejecutarán tan pronto como se cargue jquery.
No es perfecto
fuente
Una nota tangencial sobre los enfoques aquí que cargan use
setTimeout
osetInterval
. En esos casos, es posible que cuando su verificación se ejecute nuevamente, el DOM ya se haya cargado y elDOMContentLoaded
evento del navegador se haya activado, por lo que no puede detectar ese evento de manera confiable utilizando estos enfoques. Lo que encontré es que jQueryready
todavía funciona, por lo que puede incrustar su habitualjQuery(document).ready(function ($) { ... }
dentro de tu
setTimeout
osetInterval
y todo debería funcionar normalmente.fuente