2009-05-25 5 views
12

J'ai un contrôle utilisateur (ascx), dans ce contrôle utilisateur je veux utiliser un fichier .js.Comment puis-je savoir si un fichier javascript a déjà été inclus dans une page de niveau supérieur?

Donc, je l'ai ajouté. D'autre part, parfois j'utilise ce contrôle utilisateur dans une page Web que ce script a déjà été chargé dessus.

Comment puis-je faire une déclaration et la rendre réelle seulement si la page ne contient pas d'autre étiquette pour ce script?

+0

y at-il une raison pour laquelle vous ne pouvez pas inclure la bibliothèque javascript dans toutes les pages – jfar

+4

jfar, j'ai des sites qui ne jamais besoin d'un fichier javascript sur? une page particulière quand je montre un contrôle particulier, la plupart du temps ce contrôle ne sera pas utilisé du tout sur cette page.Il serait inutile d'inclure javascript pour être servi à chaque utilisateur qui est allé à chaque page sur le site, surtout si leur frère wser a insisté pour demander le fichier sur chaque requête. –

+1

La raison pour laquelle je ne veux pas l'inclure dans toutes les pages est la performance: je n'en ai pas besoin dans chacun d'entre eux. Neil, merci d'avoir expliqué. – Shimmy

Répondre

11

Comme vous utilisez asp.net, il est logique de faire le côté serveur de contrôle que ce sera où vous choisissez d'ajouter la référence au fichier javascript. À partir de votre fichier .ascx, vous pouvez enregistrer ce qui suit:

this.Page.ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile); 

... à partir de votre page que vous appelez simplement l'objet ClientScript directement:

ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile); 

Le 'GlobalUniqueKey' peut être une chaîne (I utilisez l'url du fichier javascript pour cela aussi)

Si vous essayez d'enregistrer un script avec la même chaîne de clé, cela ne fait rien. Donc, si vous appelez ceci dans votre page, votre contrôle ou n'importe où ailleurs, vous finirez avec une seule référence dans votre page. L'avantage de ceci est que vous pouvez avoir plusieurs instances d'un contrôle sur une page et même si elles essaient toutes d'enregistrer le même script, cela ne se fait jamais qu'une fois au maximum. Et aucun d'eux ne doit s'inquiéter du fait que le script soit déjà enregistré. Il existe une méthode 'IsClientScriptIncludeRegistered (stringkey)' que vous pouvez utiliser pour voir si un script a déjà été inclus sous cette clé mais il semble assez redondant de faire cette vérification avant de vous inscrire car plusieurs tentatives d'enregistrement ne lancent pas d'exceptions ou provoquer d'autres erreurs. Faire le contrôle côté client signifie que, en supposant que les multiples références javascript sont mises en cache par le navigateur (elles ne le sont peut-être pas), vous avez toujours plusieurs balises et l'en-tête de chacune provoquant l'exécution de javascript. Si vous aviez 20 instances de votre contrôle sur une page, vous pourriez avoir des problèmes sérieux.

+0

ne sais pas ASP, mais cela semble une solution beaucoup plus agréable que de le faire côté client comme je l'ai fait. – mysomic

+2

Basé sur votre réponse, j'ai construit sur ma page de base les propriétés booléennes "AttachJqery", "AttachEngine" etc et cela contrôle l'attatchement afin que je ne devrais pas se salir avec du code. J'ai également la possibilité de définir les valeurs par défaut. Si un autre exemple de besoin se fera un plaisir de poster, veuillez commenter ici. – Shimmy

0

utiliser quelque chose comme ce qui suit:

if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') { 
    // code goes here 
    var myObjectOrFunctionDecalredInThisScript = { }; 
} 

Ce test si votre objet ou la fonction existe déjà et empêche ainsi redéclaration.

6

Vous pouvez faire une des deux choses côté client ...

  1. Vérifiez le Royaume pour la balise de script correspondant au fichier javascript votre voulez vérifier
  2. test d'une variable ou une fonction que vous connaissez a/sera défini dans le fichier javascript pour undefined.

est ici une fonction JS rapide qui utilise JQuery pour faire ce que vous avez besoin:

function requireOnce(url) {  
    if (!$("script[src='" + url + "']").length) { 
     $('head').append("<script type='text/javascript' src='" + url + "'></script>"); 
    } 
} 
+0

Merci. J'utilise jQuery, ce serait génial. Merci pour tous les répondeurs, je vais sûrement les utiliser sur le futur. – Shimmy

+3

Un problème est, si le jQuery lui-même est le script que je veux vérifier :) – Shimmy

0
var storePath = []; 
function include(path){ 
if(!storePath[path]){ 
    storePath[path]= true; 
    var e = document.createElement("script"); 
    e.src = path; 
    e.type = "text/javascript"; 
    document.getElementsByTagName("head")[0].appendChild(e); 
    return false; 
} } 

utiliser dans votre page principale et fonction d'appel comprennent avec l'argument javascript nom de fichier

0

Comme vous voulez inclure javascript sur une page de votre site uniquement.
Si vous utilisez Asp.net (4.0) alors c'est très facile.
comprennent simplement le code suivant

<script type="text/javascript" scr="filepath and name here"></script> 

dans ContentPlaceHolder de contenu de la page.

0

@Shimmy Je rencontre cela après un long moment, mais peut-être que cela pourrait être utile ou au moins aider les autres à venir par derrière. Pour vérifier si jquery est déjà chargé le faire

<script>window.jQuery || document.write('<script src="js/libs/jquery-1.x.x.min.js"><\/script>')</script> 

Ne manquez pas le caractère d'échappement dans la balise script de fermeture dans l'instruction document.write.

@mysomic, pourquoi n'ai-je pas pensé à ça. PS: J'aurais aimé écrire ceci sous la ligne où @Shimmy a écrit que jQuery est lui-même le script qu'il veut charger. Mais ne sais pas comment l'écrire là. Je ne peux pas voir une réponse ou un lien similaire. Cela peut sembler stupide mais peut-être qu'il me manque quelque chose. Pls le signaler, quelqu'un?

-1

Si vous en avez besoin du côté serveur, et Page.ClientScript.RegisterClientScriptInclude ne fonctionnera pas pour vous dans le cas où le script a été inclus d'une autre manière que Page.ClientScript.RegisterClientScript (par exemple page.Header.Controls.Add (..), vous pouvez utiliser quelque chose comme ceci:

static public void AddJsFileToHeadIfNotExists(Page page, string jsRelativePath) 
{ 
     foreach (Control ctrl in page.Header.Controls) 
     { 
      if (ctrl is HtmlLink) 
      { 
       if ((ctrl as HtmlLink).Href.ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
      if (ctrl is LiteralControl || ctrl is Literal) 
      { 
       if ((ctrl as ITextControl).Text.ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
      if (ctrl is HtmlControl) 
      { 
       if ((ctrl as HtmlControl).Attributes["src"] != null) 
        if ((ctrl as HtmlControl).Attributes["src"].ToLower().Contains(jsRelativePath.ToLower())) return; 
      } 
     } 

     HtmlGenericControl Include = new HtmlGenericControl("script"); 
     Include.Attributes.Add("type", "text/javascript"); 
     Include.Attributes.Add("src", page.ResolveUrl(jsRelativePath)); 
     page.Header.Controls.Add(Include); 
    } 
+0

Trop de coulée ctrl est HtmlLink, puis ctrl comme lien Html. Considérez: var lnk = ctrl comme HtmlLink; si ctrl! = null. Enregistre une distribution. – Roland

Questions connexes