2009-03-06 20 views
15
<noscript><div id="example">I want to get this innerHTML</div></noscript> 

<script type="text/javascript"> alert($('example').innerHTML);</script> 

Cet extrait de Javascript renvoie simplement une chaîne vide. Existe-t-il un moyen d'obtenir le contenu d'un noeud noscript?Accéder au contenu de <noscript> avec Javascript

p.s. J'utilise un prototype sur ce projet particulier.

+1

Essayez $ ($ ("noscript"). Text()) avec jQuery. – sibidiba

+0

Cela^fonctionne. Au moins dans Chrome 32. – Jazzy

Répondre

12

Si le script est activé, the noscript element is defined as containing only text - bien qu'il doit être parsable texte, avec certaines restrictions sur le contenu. En gardant cela à l'esprit, vous devriez être capable d'extraire le texte, de l'analyser, puis de trouver l'élément que vous souhaitez. Un exemple rudimentaire de ceci suit:

var nos = document.getElementsByTagName("noscript")[0]; 
// in some browsers, contents of noscript hang around in one form or another 
var nosHtml = nos.textContent||nos.innerHTML; 

if (nosHtml) 
{ 
    var temp = document.createElement("div"); 
    temp.innerHTML = nosHtml; 

    // lazy man's query library: add it, find it, remove it 
    document.body.appendChild(temp); 
    var ex = document.getElementById("example"); 
    document.body.removeChild(temp); 

    alert(ex.innerHTML); 
} 

Notez que lorsque j'ai écrit cette réponse, ce qui précède a échoué dans Google Chrome; l'accès au contenu de noscript semble être un peu mieux supporté ces jours-ci, mais il me semble encore un peu plus probable que d'autres éléments d'afficher des bugs - je l'éviterais si vous avez d'autres options.

+0

Cela ne semble pas fonctionner sur IE7 (XP). Je travaille sur IE6, cependant. – pixelastic

+1

Essayez $ ($ ("noscript"). Text()) avec jQuery. – sibidiba

+0

@ Shog9 Tout ce temps plus tard, pourriez-vous clarifier quelque chose à propos de cette réponse? 'Dans Chrome de Google, l'élément noscript n'a pas d'enfants dans le DOM' - si je comprends bien, dites-vous que la version de Chrome que vous étiez en train de tester vidait complètement le contenu des balises' noscript' quand Javascript était activé, rendant ainsi son contenu intérieur vide? Si c'est vrai, cela semble un peu étrange.J'essaie d'implémenter quelque chose de similaire aujourd'hui, mais je me demande si la spécification 'noscript' ne précise pas ce qu'il faut faire de son contenu. –

3

Test avec Firefox 3.0.7, Safari 3.2.2 et MSIE 7.0.5730.13 (tous sur WinXP SP3), il semble que tout ce qui est dans les balises <noscript> soit complètement omis de l'arborescence DOM.

Cependant, il est possible d'accéder à l'élément <noscript> lui-même, puis d'utiliser les méthodes DOM pour modifier ses éléments enfants.

+0

N'a pas essayé les deux autres, mais FF3.0.7 expose le contenu via textContent. – Shog9

3

De l'HTML 4.0 spec:

L'élément NOSCRIPT permet aux auteurs de fournir un contenu alternatif lorsqu'un script est pas exécuté. Le contenu d'un élément NOSCRIPT ne doit être rendu que par un agent utilisateur prenant en charge les scripts dans les cas suivants:

  • L'agent utilisateur est configuré pour ne pas évaluer les scripts.
  • L'agent utilisateur ne prend pas en charge un langage de script invoqué par un élément SCRIPT plus tôt dans le document.

Il me semble que cela implique que tout le contenu de la balise NOSCRIPT (dans ce cas, votre div) sont ignorées tout à fait si le script est activé dans le navigateur. Avez-vous vérifié que le div "example" est accessible via le DOM dans votre cas?

+0

Je l'ai effectivement testé (voir ma réponse) - le div n'est pas dans le DOM. – Alnitak

3

Je ne suis pas sûr de prototype, mais cela fonctionne dans Chrome avec jQuery:

$('noscript').before($('noscript').text()); 
+1

Je l'ai utilisé avec succès avec IE9, FF9 et Chrome 16.0.912.77. Je dois utiliser une solution de contournement pour IE8 (et peut-être plus tôt), dans mon cas, pour extraire le contenu de l'URL actuelle via AJAX pour l'insérer dans un onglet jQuery UI comme le contenu tabulé réel d'une URL non racine est servi dans une balise noscript par défaut pour une requête complète, uniquement le contenu de l'onglet sur une requête AJAX. – tvanfosson

2

Essayez $ (("noscript") texte().) Avec jQuery.

+0

C'est intéressant, et utile pour récupérer du texte brut. mais Sizzle (1.9.1) renvoie une erreur "expression non reconnue" si vous essayez d'extraire un balisage avec des balises. – Ben

Questions connexes