2010-12-01 5 views
2

J'essaie d'utiliser JQuery avec certaines pages asp.net, qui utilisent des pages maîtres, et j'ai des problèmes avec le chargement du fichier javascript JQuery.JQuery avec MasterPage dans ASP.NET

Quand j'inclure le fichier dans le balisage de la page principale, il fonctionne très bien sur les pages qui sont dans le même répertoire que la page principale:

<script src="jquery/jquery-1.4.2.min.js" type="text/javascript"></script> 

mais qui casse pour les pages qui ne sont pas dans le même répertoire que la page maître. Les pages maîtres héritent du chemin de la page qui les inclut. Par conséquent, le chemin d'accès relatif au fichier jquery .js est différent pour différentes pages. Et, bien sûr, je ne peux pas avoir des chemins relatifs différents dans le fichier principal, car il n'y en a qu'un seul.

je pourrais utiliser un chemin absolu:

<script src="/jquery/jquery-1.4.2.min.js" type="text/javascript"></script> 

mais qui brise si le site est installé en tant que répertoire virtuel.

Mon prochain essai était d'utiliser le « ~ » pour indiquer la racine du site:.

<script src="~/jquery/jquery-1.4.2.min.js" type="text/javascript"></script> 

Mais la balise de script ne comprend pas le ~ »

J'ai donc essayé de le faire . dans le code-behind de OnInit(), j'ai essayé:

string url = "~/jquery/jquery-1.4.2.min.js"; 
url = this.ResolveUrl(url); 
Page.ClientScript.RegisterClientScriptInclude("jquery_js", url); 

Et cela me donne des erreurs lorsque le javascript JQuery fonctionne j'ai javascript dans le balisage de la page:.

$(document).ready(function() 
{ 
    ... 
} 

et je reçois "$" est indéfini. J'ai ajouté une alerte au début jquery-1.4.2.min.js, et il se charge OK, mais après ce bit de javascript dans le fichier .aspx a été exécuté.

J'ai essayé ScriptManager.RegisterClientScriptInclude(), à la place, avec le même résultat.

+0

Quel est le code HTML généré par votre dernier exemple? Est-il inclus après le tag de script qui inclut votre gestionnaire $ (document) .ready? – Goyuix

+0

Non. Et c'est le problème. (Ou le dernier problème, s'il n'y avait pas eu la page maîtresse, j'aurais pu mettre les liens avant le script, en ajoutant les liens du code-behind, je ne me laissais pas contrôler où ils étaient placés –

Répondre

0

Le cœur du problème était que les liens vers les fichiers JavaScript qui étaient injectés dans la page avec RegisterClientScriptInclude étaient placé sur la page ci-dessous le code JavaScript dans le balisage qui en dépendait.

Ce qui est dans $(document).ready() peut ne pas s'exécuter tant que la page n'est pas chargée, mais $() est exécuté immédiatement, car il est lu par le navigateur.

La solution est de déplacer le JavaScript pour qu'il apparaisse plus tard dans le fichier. Ce qui n'est pas toujours aussi simple qu'il n'y paraît, quand il s'agit de pages maîtres et de nombreux contrôles utilisateur.

Pour moi, le moyen le plus simple de le gérer était d'injecter le code JavaScript à partir du code-behind, en utilisant RegisterStartupScript. Les blocs de script injectés avec ceci sont ajoutés à la fin du formulaire. Les instructions exécutables ne s'exécuteront qu'après l'insertion de tous les fichiers JavaScript.

1

utilisation Page.ResolveUrl() il est donc par rapport à la page, et non la MasterPage (et le répertoire de contrôle, il est dans), comme ceci:

string url = Page.ResolveUrl("~/jquery/jquery-1.4.2.min.js"); 
5

Vous pouvez soit utiliser:

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

Ou éventuellement construire un contrôle qui fait essentiellement le remappage pour vous:

<my:Script src="~/jquery/jquery-1.4.2.min.js" /> 

Ou même l'enregistrer avec ClientScriptManager, mais il est préférable de le mettre dans la page.

0

Essayez de faire comme ci-dessous

StringBuilder sb = new StringBuilder(); 
      sb.Append("<script type=\"text/javascript\" src=\""); 
      sb.Append("http://yourwebsitename" + "/" + "directory"); 
      sb.Append("/"); 
      sb.Append("jquery.js"); 
      sb.Append("\"></script>"); 
     Header.Controls.Add(new LiteralControl(sb.toString())); 
5

Utilisez Google pour servir votre jquery:

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

Notez l'absence de http dans l'attribut src, cela résoudra tous les problèmes qui pourraient arrise avec http vs https

Voici pourquoi: http://encosia.com/2008/12/10/3-reasons-why-you-should-let-google-host-jquery-for-you/

Ode To code a un article fantastique sur les pages Maître, vous devriez jeter un oeil à ainsi:

http://odetocode.com/Articles/450.aspx

1

ResolveUrl est le chemin à parcourir.

<script src="<%= ResolveUrl("~/scripts/jquery-1.4.4.min.js") %>" type="text/javascript"></script> 
0

l'aide de Google est un bon choix ofcourse mais vous pouvez aussi vous ajouter un lien dans chacune de vos pages que vous avez un problème (thoes qui ne peut pas trouver le chemin du jquery) Par exemple, si vous avez une page appelé "MyPage.aspx" dans l'autre répertoire suffit d'ajouter le script sur le html de la page "MyPage.aspx" relativement de cette façon cette page ne peut pas trouver votre adresse jquery fonctionnera bien avec le nouveau de manière réciproque J'espère que cela fonctionne pour

+2

Le point derrière le fait de placer le lien vers jquery.js dans la page maître est que je n'ai pas à le mettre, séparément, dans chaque page.Le DRY est un principe de conception fondamental qui est violé à vos risques et périls. –

0

à ne pas répéter votre auto

faire une fonction d'extension pour vos pages

public static class yourclass 
{ 
    public static string ConvertRelativePathToRootPath(this Page p, string pathfromroot) 
    { 


     string newUrl = ""; 
     Uri originalUri = HttpContext.Current.Request.Url; 
     newUrl = (originalUri.Scheme) + "://" + originalUri.Authority + pathfromroot; 
     return newUrl; 


    } 
} 

ajoutez simplement le code suivant à vos événements de chargement de page

string ss = Page.ConvertRelativePathToRootPath("~/script/jquery-1.4.1.min.js"); 
ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "Jquery", ss); 

vous pouvez également utiliser la au-dessus de la fonction d'extension pour tous les autres besoin d'un chemin absolu comme des balises d'image ou d'ancrage sur votre fichier avec un chemin autre que votre racine de la page maître de l'application :)

+0

J'utilisais RegisterClientScriptInclude(), pour gérer les chemins relatifs, et cela conduisait à un autre problème, le fichier étant inclus plus tard dans le fichier que le javascript qui en dépendait. –

1

Vous pouvez essayer src="<%= Page.ResolveClientUrl("~/jquery.js") %> dans la tête de page maître.

$<script type="text/javascript" src="<% = Page.ResolveClientUrl("~/scripts/jquery-1.4.1.min.js") %>"></script> 
Questions connexes