2009-08-12 4 views
2

Je dois extraire la méta-balise «description» du document.JavaScript - le moyen le plus rapide d'extraire les méta-champs de document

La voie par défaut serait d'utiliser document.getElementsByTagName (« métacompétences »), puis itérer à travers le réseau - que l'on trouve dans: http://www.rgagnon.com/jsdetails/js-0070.html

Mais je me demande s'il n'y a pas d'autre plus rapide, « une ligne de approche "code". Je ne suis pas familier avec xPath - mais peut-être que cela pourrait fonctionner? Des idées?

Répondre

6

sûr ...

var desc = document.getElementsByName('description')[0].getAttribute('content'); 

Cela suppose qu'il ya une balise Meta nommée description de cours. Pour être plus complet, ceci permettrait d'attraper la description quel que soit le cas.

function getDesc(){ 
    var metas = document.getElementsByTagName('meta'); 
    for(var i=0;mLen=metas.length;i<mLen;i++){ 
    if(metas[i].getAttribute('name').toLowerCase() == 'description'){ 
     return metas[i].getAttribute('content'); 
    } 
    } 
    return null;//or empty string if you prefer 
} 
var desc = getDesc(); 
+0

Merci pour la suggestion, mais (a) ce sera de retour d'autres entités nommées, non seulement les balises Meta, et (b) Je ne le mentionne pas l'origine, mais je tente de trouver une situation insensible à la casse, Comme certains sites utilisent le nom "Description", d'autres utilisent "DESCRIPTION", et ainsi de suite ... –

+0

@CamelHive - la syntaxe [0] devrait vous donner le tout premier élément avec un attribut de nom ... 99.999% du temps sera la balise meta. Pour la sensibilité à la casse ... oui, cela échouerait. Je vais ajouter une version pas tout à fait 1 ligne. – scunliffe

1

Vous pouvez le faire avec XPath (chez les clients de soutien document.evaluate), mais ce serait probablement un surpuissant:

document.evaluate('//*[@name="description"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0); 
+0

C'est gentil, je devrais vraiment comprendre XPath - merci. Le problème avec la sensibilité à la casse peut être résolu (donc j'ai appris) en prolongeant la XPath considérablement. En tout cas, merci! –

+0

Pour remplacer ce 'namedItem', vous pouvez essayer d'accéder à l'élément juste à côté d'un' NodeList'. IIRC, les navigateurs les plus modernes (?) Supportent toujours cette résolution d'élément (à partir des DOM0 jours) - 'document.getElementsByTagName ('meta') ['description']'. Je ne recommanderais pas d'utiliser cette abréviation si.Plus sûr de simplement énumérer les éléments vérifiant la propriété 'name' ou d'utiliser une sorte d'abstraction (comme les utilitaires de sélection fournis par la plupart des bibliothèques JS ou votre propre implémentation, peut-être simplifiée) – kangax

0

Scunliffe, je pense que votre suggestion va certainement faire l'affaire, au moins multi ligne-fonction sera.

je suis venu avec une solution qui ne fonctionne pas sur, mais qui est très compact Webkit (Chrome + Safari):

var metas = document.getElementsByTagName('META'); 
var value = (metas.namedItem ("description") || metas.namedItem ("Description") || metas.namedItem ("DESCRIPTION") || {}).content; 

Cela utilisera la fonction namedItem() sur l'objet NodeList, recherche les manières les plus probables qu'un autre programmeur pourrait écrire "description". Notez que cela récupère les valeurs de l'attribut de la balise, tout en ignorant la casse pour les noms d'attributs:

<meta name="description" content="my description" /> 
<meta NAME="Description" CoNtEnT="my description" /> 

Mais hélas (Oy Vey) le nameItem() ne fonctionne pas sur Safari & Chrome :-(Peut-être il y a une alternative approche pour les navigateurs ...

0

Cela dépend aussi de ce que vous entendez par « quickest'- voulez-vous dire le code le plus court, vous pouvez écrire ou

la réponse la plus rapide du navigateur? pour la plus rapide réponse , il suffit de regarder les éléments meta dans l'élément tête, et pi ck out avec le nom 'description'.

{ 
    var s=[], metas=document.getElementsByTagName('head')[0].getElementsByTagName('meta'); 
    for(var i=0,L=metas.length;i<L;i++){ 
    if(metas[i].name=='description')s[s.length]=metas[i].content; 
    } 
    s= s.join(','); 
} 
Questions connexes