Comment obtenir les informations d'une balise Meta avec JavaScript?

136

Les informations dont j'ai besoin se trouvent dans une balise meta. Comment puis-je accéder aux "content"données de la balise meta quand property="video"?

HTML:

<meta property="video" content="http://video.com/video33353.mp4" />
supercoolville
la source
2
Notez que <meta>c'est censé avoir un nameattribut, non property. Les développeurs utilisant l'attribut standard devront adapter le code donné par la plupart des réponses.
Jens Bannmann

Réponses:

128

Vous pouvez utiliser ceci:

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
la source
6
Ce que vous voulez vraiment, c'est 'laisser' pour les garder définis localement;)
tommed
22
Si vous pouvez utiliser querySelector, vous pouvez faire quelque chose comme ceci: document.querySelector("meta[property='og:url']").getAttribute('content')
Nishchal Gautam
3
Je pense que cette réponse n'est pas plus pertinente et vous devriez vraiment utiliser stackoverflow.com/questions/7524585/...
Sergei Basharov
Ignorez cette réponse. Cela ne fonctionne pas dans le cas [certes étrange] de l'OP car il regarde l'attribut "name" plutôt que "property". Et dans son état actuel, il est trop complexe mais sans aucun avantage de compatibilité ascendante - tous les navigateurs prenant en charge const/ letdevraient prendre en charge .querySelector!
natevw le
pour un seul méta attribut, pourquoi boucler plusieurs fois? il peut avoir des centaines de balises méta ou il peut avoir besoin d'obtenir la valeur méta plusieurs fois.
SKR
212

Les autres réponses devraient probablement faire l'affaire, mais celle-ci est plus simple et ne nécessite pas jQuery:

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

La question d'origine utilisait une balise RDFa avec un property=""attribut. Pour les <meta name="" …>balises HTML normales, vous pouvez utiliser quelque chose comme:

document.querySelector('meta[name="description"]').content
Joepio
la source
16
Simple, élégant et sans dépendances. Mieux que la réponse acceptée imo
Raniz
6
Même si ma méta est dans la balise <head>, cela document.head.querySelectorm'a donné nullmais document.querySelectora parfaitement fonctionné
Robin van Baalen
10
Pour le faire fonctionner avec les balises OG, ajoutez-y des guillemets comme ceci_: var title = document.head.querySelector ('[property = "og: title"]');
arpo
1
Agréable. À quoi sert la partie «[contenu]»? Sans cela, j'obtiens également l'élément méta.
citykid
1
@citykid Cela semble quelque peu superflu. L'extrait de code lèvera toujours une TypeError si la balise n'est pas trouvée par sa "propriété". L'inclusion [content]dans le sélecteur étend cette exception au cas où toute balise correspondante n'a pas d'attribut de contenu. IMO, il est plus logique dans ce cas d'obtenir un résultat nul, mais cela dépend de la préférence de l'implémenteur, je suppose.
natevw le
93

Beaucoup de réponses difficiles à lire ici. Une doublure ici

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

Il existe un moyen plus simple:

document.getElementsByName('name of metatag')[0].getAttribute('content')
muchacho
la source
Cela fonctionne au moins à IE11, ce qui le rend plus utile.
rprez le
1
La document.querySelectorversion fonctionne jusqu'à IE8, donc c'est beaucoup
fregante
C'est un assez bon moyen normalement, mais notez que l'OP utilise l'attribut RDFa "property" au lieu de l'attribut plus basique "name" ( stackoverflow.com/questions/22350105/… )
natevw
16
function getMetaContentByName(name,content){
   var content = (content==null)?'content':content;
   return document.querySelector("meta[name='"+name+"']").getAttribute(content);
}

Utilisé de cette manière:

getMetaContentByName("video");

L'exemple sur cette page:

getMetaContentByName("twitter:domain");
devMariusz
la source
J'ai utilisé cette friandise, mais sur une certaine page, j'obtenais un type erroras undefinedparce que la balise META elle-même manquait. J'ai résolu cela en attribuant une variable et en enveloppant le document.queryselectordans une instruction try afin que je puisse obtenir ""par défaut en cas d'erreur.
bgmCoder le
function getMetaContentByName (nom, contenu) {var content = (content == null)? 'content': content; try {return document.querySelector ("meta [nom = '" + nom + "']"). getAttribute (contenu); } catch {return null; }}
devMariusz
15

Si vous utilisez JQuery, vous pouvez utiliser:

$("meta[property='video']").attr('content');
Élise Chant
la source
9
En supposant jquery, ou une bibliothèque; pas javascript
ILMostro_7
12

Dans Jquery, vous pouvez y parvenir avec:

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

En JavaScript, vous pouvez y parvenir avec:

document.getElementsByTagName('meta').item(property='video');
Prameet Jain
la source
10
Cela semble fonctionner (au moins dans chrome): document.getElementsByTagName('meta')['video'].getAttribute('content');si le balisage est comme ci-dessous:<meta name="video" content="http://video.com/video33353.mp4" />
samdeV
1
@samdeV, c'est la plus propre de toutes les solutions ici. Soumettez-le comme votre propre réponse. :)
frandroid
1
@samdeV, vous n'avez pas non plus besoin de .getAttribute ('content'), vous pouvez simplement .content: document.getElementsByTagName ('meta') ['video']. content. Je viens de tester, cela fonctionne aussi bien dans Firefox.
frandroid
Je suis maintenant informé que cela ne fonctionne pas dans Safari. Bon sang.
frandroid
4

Chemin - [ 1 ]

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

Vous pouvez obtenir l'erreur: Uncaught TypeError: Impossible de lire la propriété 'getAttribute' de null


Chemin - [ 2 ]

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

Vous pouvez obtenir l'erreur: Uncaught TypeError: Impossible de lire la propriété 'getAttribute' de null


Voie - [ 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'));

Au lieu de recevoir une erreur, vous obtenez null, c'est bien.

Юрий Светлов
la source
4

Simple, non?

document.head.querySelector("meta[property=video]").content
Erik Campobadal
la source
2

Ce code fonctionne pour moi

<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);
         }

    }    

Exemple de violon: http://jsfiddle.net/muthupandiant/ogfLwdwt/

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

Version de mise à jour:

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

Voici une fonction qui renverra le contenu de n'importe quelle balise meta et mémorisera le résultat, évitant les requêtes inutiles du DOM.

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 */

Et voici une version étendue qui interroge également les balises graphiques ouvertes et utilise Array # some :

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
la source
1

Ma variante de la fonction:

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

Personnellement, je préfère les obtenir dans un hachage d'objet, puis je peux y accéder n'importe où. Cela pourrait facilement être défini sur une variable injectable, puis tout pourrait l'avoir et ne l'attraper qu'une seule fois.

En enveloppant la fonction, cela peut également être fait comme une seule doublure.

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
la source
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>

Démo

Leandro Sciola
la source
0

Si vous êtes intéressé par une solution plus poussée pour obtenir toutes les balises méta, vous pouvez utiliser ce morceau de code

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
la source
-2

si la balise meta est:

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

JQuery sera:

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

JavaScript sera: (Il renverra du HTML entier)

const metaHtml = document.getElementsByTagName('meta').url // metaHtml = '<meta name="url" content="www.google.com" />'
SKR
la source