Wie erhalte ich die Informationen von einem Meta-Tag mit JavaScript?


135

Die Informationen, die ich benötige, befinden sich in einem Meta-Tag. Wie kann ich "content"wann auf die Daten des Meta-Tags zugreifen property="video"?

HTML:

<meta property="video" content="http://video.com/video33353.mp4" />

2
Beachten Sie, dass <meta>ein nameAttribut haben soll, nicht property. Entwickler, die das Standardattribut verwenden, müssen den Code der meisten Antworten anpassen.
Jens Bannmann

Antworten:


128

Sie können dies verwenden:

function getMeta(metaName) {
  const metas = document.getElementsByTagName('meta');

  for (let i = 0; i < metas.length; i++) {
    if (metas[i].getAttribute('name') === metaName) {
      return metas[i].getAttribute('content');
    }
  }

  return '';
}

console.log(getMeta('video'));

6
Was Sie wirklich wollen, ist 'lassen', um sie lokal definiert zu halten;)
am

22
Wenn Sie querySelector verwenden können, können Sie Folgendes tun: document.querySelector("meta[property='og:url']").getAttribute('content')
Nishchal Gautam

3
Ich denke, diese Antwort ist nicht relevanter und Sie sollten wirklich stackoverflow.com/questions/7524585/…
Sergei Basharov

Überspringen Sie diese Antwort. Es funktioniert im [zugegebenermaßen merkwürdigen] Fall des OP nicht, da es sich eher um das Attribut "name" als um das Attribut "property" handelt. Und in seinem aktuellen Zustand ist es zu komplex, aber ohne Abwärtskompatibilitätsvorteil - alle Browser, die unterstützen const/ unterstützen letsollten .querySelector!
Natevw

Warum sollte man für nur ein Metaattribut mehrere Schleifen durchführen? Es kann Hunderte von Meta-Tags haben oder es muss den Meta-Wert mehrmals abrufen.
SKR

211

Die anderen Antworten sollten wahrscheinlich den Trick machen, aber diese ist einfacher und erfordert keine jQuery:

document.head.querySelector("[property~=video][content]").content;

In der ursprünglichen Frage wurde ein RDFa- Tag mit einem property=""Attribut verwendet. Für die normalen HTML- <meta name="" …>Tags können Sie Folgendes verwenden:

document.querySelector('meta[name="description"]').content

16
Einfach, elegant und ohne Abhängigkeiten. Besser als die akzeptierte Antwort imo
Raniz

6
Obwohl mein Meta im <head> -Tag ist, document.head.querySelectorhat es mir nullaber document.querySelectorperfekt funktioniert
Robin van Baalen

10
Um es mit OG-Tags zum Laufen zu bringen, fügen Sie Anführungszeichen wie folgt hinzu: var title = document.head.querySelector ('[property = "og: title"]');
Arpo

1
Nett. Welchem ​​Zweck dient der Teil "[Inhalt]"? Ohne es bekomme ich auch das Meta-Element.
Citykid

1
@citykid Es scheint etwas überflüssig. Das Snippet löst immer einen TypeError aus, wenn das Tag nicht anhand seiner "Eigenschaft" gefunden wird. Durch die Aufnahme [content]in die Auswahl wird diese Ausnahme auf den Fall erweitert, in dem einem übereinstimmenden Tag ein Inhaltsattribut fehlt. IMO ist es in diesem Fall sinnvoller, ein Null-Ergebnis zu erhalten, aber es liegt wohl an den Vorlieben des Implementierers.
Natevw

93

Viele schwer zu lesende Antworten hier. Ein Liner hier

document.querySelector("meta[property='og:image']").getAttribute("content");

23

Es gibt einen einfacheren Weg:

document.getElementsByName('name of metatag')[0].getAttribute('content')

Dies funktioniert mindestens auf IE11 zurück, was es nützlicher macht.
Rprez

1
Die document.querySelectorVersion funktioniert bis zum IE8, es ist also genug
fregante

Dies ist normalerweise ein ziemlich guter Weg, aber beachten Sie, dass das OP das RDFa-Attribut "property" anstelle des grundlegenderen Attributs "name" ( stackoverflow.com/questions/22350105/… )
natevw verwendet

16
function getMetaContentByName(name,content){
   var content = (content==null)?'content':content;
   return document.querySelector("meta[name='"+name+"']").getAttribute(content);
}

Auf diese Weise verwendet:

getMetaContentByName("video");

Das Beispiel auf dieser Seite:

getMetaContentByName("twitter:domain");

Ich verwendet , um dieses tidbit, aber auf einer bestimmten Seite wurde ein immer type errorals undefinedweil das Meta - Tag selbst fehlte. Ich habe das behoben, indem ich eine Variable zugewiesen und die document.queryselectorAnweisung in eine try-Anweisung eingeschlossen habe, damit ich sie ""im Fehlerfall standardmäßig erhalten kann.
BGMCoder

Funktion getMetaContentByName (Name, Inhalt) {var content = (content == null)? 'content': content; try {return document.querySelector ("meta [name = '" + name + "']"). getAttribute (content); } catch {return null; }}
devMariusz

15

Wenn Sie JQuery verwenden, können Sie Folgendes verwenden:

$("meta[property='video']").attr('content');

9
Angenommen, jquery oder eine Bibliothek; nicht Javascript
ILMostro_7

12

In Jquery können Sie dies erreichen mit:

$("meta[property='video']");

In JavaScript können Sie dies erreichen mit:

document.getElementsByTagName('meta').item(property='video');

10
Dies scheint zu funktionieren (zumindest in Chrom): document.getElementsByTagName('meta')['video'].getAttribute('content');Wenn das Markup wie <meta name="video" content="http://video.com/video33353.mp4" />
folgt

1
@samdeV, dies ist die sauberste aller Lösungen hier. Senden Sie es als Ihre eigene Antwort. :)
frandroid

1
@samdeV, auch Sie müssen nicht .getAttribute ('content'), Sie können nur .content: document.getElementsByTagName ('meta') ['video']. content. Ich habe gerade getestet, das funktioniert auch in Firefox.
frandroid

Ich bin jetzt informiert, dass es in Safari nicht funktioniert. Verdammt.
frandroid

4

Weg - [ 1 ]

function getMetaContent(property, name){
    return document.head.querySelector("["+property+"="+name+"]").content;
}
console.log(getMetaContent('name', 'csrf-token'));

Möglicherweise wird folgende Fehlermeldung angezeigt: Nicht erfasster Typfehler: Die Eigenschaft 'getAttribute' von null kann nicht gelesen werden


Weg - [ 2 ]

function getMetaContent(name){
    return document.getElementsByTagName('meta')[name].getAttribute("content");
}
console.log(getMetaContent('csrf-token'));

Möglicherweise wird folgende Fehlermeldung angezeigt: Nicht erfasster Typfehler: Die Eigenschaft 'getAttribute' von null kann nicht gelesen werden


Weg - [ 3 ]

function getMetaContent(name){
    name = document.getElementsByTagName('meta')[name];
    if(name != undefined){
        name = name.getAttribute("content");
        if(name != undefined){
            return name;
        }
    }
    return null;
}
console.log(getMetaContent('csrf-token'));

Anstatt Fehler zu bekommen null, bekommen Sie , das ist gut.



2

Dieser Code funktioniert für mich

<meta name="text" property="text" content="This is text" />
<meta name="video" property="text" content="http://video.com/video33353.mp4" />

JS

var x = document.getElementsByTagName("META");
    var txt = "";
    var i;
    for (i = 0; i < x.length; i++) {
        if (x[i].name=="video")
        {
             alert(x[i].content);
         }

    }    

Beispiel Geige: http://jsfiddle.net/muthupandiant/ogfLwdwt/


2
function getDescription() {
    var info = document.getElementsByTagName('meta');
    return [].filter.call(info, function (val) {
        if(val.name === 'description') return val;
    })[0].content;
}

Update-Version:

function getDesc() {
    var desc = document.head.querySelector('meta[name=description]');
    return desc ? desc.content : undefined;
}

1

Meine Variante der Funktion:

const getMetaValue = (name) => {
  const element = document.querySelector(`meta[name="${name}"]`)
  return element?.getAttribute('content')
}

0

Hier ist eine Funktion, die den Inhalt eines Meta-Tags zurückgibt und das Ergebnis speichert, um unnötige Abfragen des DOM zu vermeiden.

var getMetaContent = (function(){
        var metas = {};
        var metaGetter = function(metaName){
            var theMetaContent, wasDOMQueried = true;;
            if (metas[metaName]) {
                theMetaContent = metas[metaName];
                wasDOMQueried = false;
            }
            else {
                 Array.prototype.forEach.call(document.getElementsByTagName("meta"), function(el) {
                    if (el.name === metaName) theMetaContent = el.content;
                    metas[metaName] = theMetaContent;
                });
            }
            console.log("Q:wasDOMQueried? A:" + wasDOMQueried);
            return theMetaContent;
        }
        return metaGetter;
    })();

getMetaContent("description"); /* getMetaContent console.logs the content of the description metatag. If invoked a second time it confirms that the DOM  was only queried once */

Und hier ist eine erweiterte Version, die auch nach offenen Diagramm-Tags fragt und Array # some verwendet :

var getMetaContent = (function(){
        var metas = {};
        var metaGetter = function(metaName){
            wasDOMQueried = true;
            if (metas[metaName]) {
                wasDOMQueried = false;
            }
            else {
                 Array.prototype.some.call(document.getElementsByTagName("meta"), function(el) {
                        if(el.name === metaName){
                           metas[metaName] = el.content;
                           return true;
                        }
                        if(el.getAttribute("property") === metaName){
                           metas[metaName] = el.content;
                           return true;
                        }
                        else{
                          metas[metaName] = "meta tag not found";
                        }  
                    });
            }
            console.info("Q:wasDOMQueried? A:" + wasDOMQueried);
            console.info(metas);
            return metas[metaName];
        }
        return metaGetter;
    })();

getMetaContent("video"); // "http://video.com/video33353.mp4"

0

Ich persönlich bevorzuge es, sie nur in einem Objekt-Hash abzurufen, dann kann ich überall darauf zugreifen. Dies könnte leicht auf eine injizierbare Variable gesetzt werden und dann könnte alles es haben und es würde nur einmal greifen.

Durch Umschließen der Funktion kann dies auch als Einzeiler erfolgen.

var meta = (function () {
    var m = document.querySelectorAll("meta"), r = {};
    for (var i = 0; i < m.length; i += 1) {
        r[m[i].getAttribute("name")] = m[i].getAttribute("content")
    }
    return r;
})();


0
<html>
<head>
<meta property="video" content="http://video.com/video33353.mp4" />
<meta name="video" content="http://video.com/video33353.mp4" />
</head>
<body>

<script>
var meta = document.getElementsByTagName("meta");
    size = meta.length;

for(var i=0; i<size; i++) {
    if (meta[i].getAttribute("property") === "video") {
        alert(meta[i].getAttribute("content"));
    }
}
meta = document.getElementsByTagName("meta")["video"].getAttribute("content");
alert(meta);
</script>
</body>
</html>

Demo


0

Wenn Sie an einer weitreichenderen Lösung interessiert sind, um alle Meta-Tags zu erhalten, können Sie diesen Code verwenden

function getAllMetas() {
    var metas = document.getElementsByTagName('meta');
    var summary = [];
    Array.from(metas)
        .forEach((meta) => {
            var tempsum = {};
            var attributes = meta.getAttributeNames();
            attributes.forEach(function(attribute) {
                tempsum[attribute] = meta.getAttribute(attribute);
            });
            summary.push(tempsum);
        });
    return summary;
}

// usage
console.log(getAllMetas());

-2

Wenn das Meta-Tag lautet:

<meta name="url" content="www.google.com" />

JQuery wird sein:

const url = $('meta[name="url"]').attr('content'); // url = 'www.google.com'

JavaScript wird sein: (Es wird ganzes HTML zurückgeben)

const metaHtml = document.getElementsByTagName('meta').url // metaHtml = '<meta name="url" content="www.google.com" />'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.