2009-08-12 8 views
2

Ich muss das "description" -Meta-Tag des Dokuments extrahieren.JavaScript - schnellste Möglichkeit zum Extrahieren von Dokument-Meta-Feldern

Die Standardmethode wäre document.getElementsByTagName (‚META‘) zu verwenden, und dann durch das Array iterieren - wie gefunden: http://www.rgagnon.com/jsdetails/js-0070.html

Aber ich frage mich, wenn es keine andere schneller ist „, eine Zeile Code "Ansatz. Ich kenne xPath nicht - aber vielleicht könnte das funktionieren? Irgendwelche Ideen?

Antwort

6

sicher ...

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

Dies setzt voraus, dass es ein Meta-Tag Beschreibung natürlich gestattet.

Um vollständiger zu sein, würde dies die Beschreibung unabhängig von Fall erfassen.

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

Danke für die Anregung, aber (a), wird dies andere benannte Entitäten zurückgeben, nicht nur Meta-Tags, und (b) ich es ursprünglich nicht erwähnen, aber ich versuche, eine Groß- und Kleinschreibung Situation zu finden, da einige Seiten den Namen "Description" verwenden, manche "DESCRIPTION" und so weiter ... –

+0

@CamelHive - die [0] -Syntax sollte Ihnen das allererste Element mit einem Namensattribut liefern ... 99,999% der Zeit wird das Meta-Tag sein. Für Groß- und Kleinschreibung ... ja, das würde scheitern. Ich werde eine nicht ganz 1-Zeilen-Version hinzufügen. – scunliffe

1

Sie können es mit XPath tun (in Kunden unterstützen document.evaluate), aber das wäre wohl zuviel des Guten sein:

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

Das ist süß, ich sollte mich wirklich um XPath kümmern - danke. Das Problem mit der Groß-/Kleinschreibung kann gelöst werden (so erfuhr ich), indem XPath erheblich erweitert wird. Auf jeden Fall, danke! –

+0

Um dieses 'namedItem' zu ersetzen, können Sie versuchen, das Element direkt von einer' NodeList' zu erreichen. IIRC, die meisten modernen Browser (?) Unterstützen immer noch eine solche Elementauflösung (von den DOM0-Tagen) - 'document.getElementsByTagName ('meta') ['description'] '. Ich würde nicht empfehlen, diese Kurzschrift jedoch zu verwenden.Es ist einfacher, über Elemente zu suchen, die nach 'name'-Eigenschaft suchen, oder eine Art von Abstraktion zu verwenden (z. B. Selektor-Hilfsprogramme, die von den meisten JS-Bibliotheken oder Ihrer eigenen, vielleicht vereinfachten Implementierung bereitgestellt werden) – kangax

0

Scunliffe, denke ich Ihren Vorschlag wird der Trick auf jeden Fall tun, zumindest die Mehr -line-Funktion wird.

Ich kam mit einer Lösung, die nicht auf Webkit (Chrom + Safari) läuft, aber das ist sehr kompakt:

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

Dies wird die namedItem() Funktion über das NodeList Objekt nutzen, suchen wahrscheinlich würde ein anderer Programmierer "Beschreibung" schreiben. Beachten Sie, dass dies die Werte von Tag-Attribute abrufen, während Fall für Namen Attribut ignoriert:

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

Aber leider (Oy Vey) die nameItem() funktioniert nicht auf Safari & Chrome :-(Vielleicht gibt es eine Alternative Ansatz für diesen Browser ...

0

Es hängt auch davon ab, was Sie unter ‚quickest'- meinen Sie den kürzesten Code, den Sie können, oder die schnellste Antwort vom Browser?

für die schnellste Antwort schreiben, schau dir einfach die Meta-Elemente im head-Element und pi an nimm irgendeinen mit dem Namen '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(','); 
}