2010-08-19 11 views
1

Donc je travaille sur un site, et nous devons vérifier si jQuery est défini avant de l'écrire sur la page. Je veux le convertir pour employer le raccourci conditionnel de JS, mais pour une raison quelconque quand je fais cela l'instruction n'exécute pas. Voici mon code:Inclure jQuery utilisant JS Shorthand

Original (this works, tested): 

if (typeof jQuery == 'undefined') { 
    document.write('<script type="text/javascript" src="', JSPATH_REL_symc + 'jquery-1.4.2.min.js','"><\/script>'); 
} 

Cette version fonctionne parfaitement. Maintenant je l'ai remplacé avec ceci, et pour quelque raison je rencontre des problèmes:

New w/Shorthand: 

(typeof jQuery == 'undefined') ? document.write('<script type="text/javascript" src="', JSPATH_REL_symc + 'jquery-1.4.2.min.js','"><\/script>') : ''; 

Une idée de ce qui ne va pas avec cette syntaxe?

Merci.

+0

Dans quel navigateur rencontrez-vous des problèmes? –

+0

Parfois, la sténographie n'est pas toujours la meilleure. Vous devriez également avoir des appels d'ouverture et de fermeture de documents. – balupton

Répondre

3

Rien ne semble être faux à première vue. (La var JSPATH_REL_symc est définie ailleurs, oui?). Le code est un peu funky (mélange de concaténation de chaînes et plusieurs arguments à document.write - document.write(str, str2 + str3, str4)), mais cela est facilement corrigé. Aussi, vous devriez être en mesure de simplifier (et raccourcir) le code encore plus loin:

this.jQuery || document.write('<script src="' 
           + JSPATH_REL_symc 
           + 'jquery-1.4.2.min.js"><\/script>'); 

L'attribut type de la balise script est pas obligatoire, tous les navigateurs évalueront implicitement son contenu ou le fichier lié en JavaScript.

Un test rapide montre ce code en action: http://jsfiddle.net/ZWQqM/ (moins l'argument JSPATH, et en ajoutant un attribut d'événement « onload » à la balise de script pour démontrer qu'il est réussi.)

+1

Bien que l'attribut 'type' ne soit pas obligatoire, il est nécessaire de transmettre la compatibilité HTML4/5. –

+1

@Topher: Droit sur l'homme. @Ryan: Ce code fonctionne très bien, bien sûr je vais inclure le type attr encore :) Voir ma réponse ci-dessous re: params multiples. –

1

Votre code ressemble un peu Faux parce que vous ne faites rien dans la seconde partie du conditionnel et que cela provoque probablement une erreur de syntaxe.

Fondamentalement, quand la condition est fausse, je pense qu'il est l'évaluation à:

''; 

qui n'est pas valide. , Vous habituellement l'utiliser comme ceci:

var someString = (someTest == true) ? "Great" : "Bad"; 
document.write(someString); 

Puisque vous utilisez document.write l'intérieur du conditionnel; Je pense que vous avez deux options:

  1. Déplacez le l'intérieur conditionnel du document.write ou
  2. Supprimer les citations des marques de la deuxième partie de la

conditionnelle Essayez ceci:

// Option 1 
document.write((typeof jQuery == 'undefined') ? '<script type="text/javascript" src="', JSPATH_REL_symc + 'jquery-1.4.2.min.js','"><\/script>' : ''); 


// Option 2 -- EDIT: This apparently isn't valid syntax due to the : ; at the end. Thanks @LarsH 
(typeof jQuery == 'undefined') ? document.write('<script type="text/javascript" src="', JSPATH_REL_symc + 'jquery-1.4.2.min.js','"><\/script>') : ; 

Personnellement, je pense que la déclaration if est plus claire.

EDIT: Comme l'a déclaré Ryan dans le commentaire ci-dessous, ''; est valide, donc je ne suis pas tout à fait sûr pourquoi ce code particulier est de lancer une erreur. Pouvez-vous donner une capture d'écran ou une description de l'erreur?

+2

En fait, ''';' est une instruction valide. http://jsfiddle.net/RGPyr/ JavaScript Strict mode est activé par l'instruction suivante: '" use strict ";' –

+3

+1: Utiliser un ternaire pour enregistrer quelques octets sur if/else est généralement considéré comme moche et pas le plus facile à suivre. Nos normes d'entreprise l'interdisent. Cela ne veut pas dire que nous ne l'utilisons pas, nous le faisons quand le résultat de l'expression va être utilisé (il est ignoré dans l'exemple du demandeur). La suggestion de Topher utilise un ternaire plus correctement, bien qu'il puisse finir avec un appel pas très élégant à document.write (""); BTW, je ne savais pas que vous pourriez passer plusieurs paramètres à document.write et ils seraient concaténés. Cependant, vous ne devez pas mélanger la concaténation avec plusieurs paramètres. –

+0

+1 @Ryan Tenney - Merci pour le lien. Je n'avais pas réalisé que c'était valide. Mise à jour de ma réponse en conséquence. –

Questions connexes