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" />
Supercoolville
quelle
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'));
Saket
quelle
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
Joepio
quelle
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");
Ced
quelle
23

Es gibt einen einfacheren Weg:

document.getElementsByName('name of metatag')[0].getAttribute('content')
muchacho
quelle
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");
devMariusz
quelle
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');
Elise Chant
quelle
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');
Prameet Jain
quelle
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.

Юрий Светлов
quelle
4

Einfach, oder?

document.head.querySelector("meta[property=video]").content
Erik Campobadal
quelle
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/

muTheTechie
quelle
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;
}
Vanille
quelle
1

Meine Variante der Funktion:

const getMetaValue = (name) => {
  const element = document.querySelector(`meta[name="${name}"]`)
  return element?.getAttribute('content')
}
Aleh Atsman
quelle
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"
cssimsek
quelle
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;
})();
Wes Jones
quelle
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

Leandro Sciola
quelle
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());
Schabbi
quelle
-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" />'
SKR
quelle