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

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

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

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

23

Il existe un moyen plus simple:

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

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

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

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

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.



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/


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

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"

1

Ma variante de la fonction:

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

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


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


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

-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" />'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.