Come posso ottenere le informazioni da un meta tag con JavaScript?


136

Le informazioni di cui ho bisogno sono in un meta tag. Come posso accedere ai "content"dati del meta tag quando property="video"?

HTML:

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

2
Si noti che <meta>dovrebbe avere un nameattributo, non property. Gli sviluppatori che utilizzano l'attributo standard dovranno adattare il codice fornito dalla maggior parte delle risposte.
Jens Bannmann,

Risposte:


128

Puoi usare questo:

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
Quello che vuoi veramente è 'lascia' che siano mantenuti localmente definiti;)
tommed

22
Se puoi usare querySelector, puoi fare qualcosa del genere: document.querySelector("meta[property='og:url']").getAttribute('content')
Nishchal Gautam il

3
Penso che questa risposta non è più rilevante e si dovrebbe davvero usare stackoverflow.com/questions/7524585/...
Sergei Basharov

Salta questa risposta. Non funziona nel caso [certo dispari] dell'OP poiché esamina l'attributo "nome" anziché "proprietà". E allo stato attuale è eccessivamente complesso ma senza alcun vantaggio di compatibilità con le versioni precedenti: tutti i browser che supportano const/ letdovrebbero supportare .querySelector!
natevw,

per un solo meta attributo, perché ripetere più volte? potrebbe avere centinaia di meta tag o potrebbe essere necessario ottenere il valore meta più volte.
SKR

212

Le altre risposte dovrebbero probabilmente fare il trucco, ma questa è più semplice e non richiede jQuery:

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

La domanda originale utilizzava un tag RDFa con un property=""attributo. Per i normali <meta name="" …>tag HTML puoi usare qualcosa come:

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

16
Semplice, elegante e non ha dipendenze. Meglio della risposta accettata imo
Raniz,

6
Anche se la mia meta è nel tag <head>, document.head.querySelectormi ha dato nullma ha document.querySelectorfunzionato perfettamente
Robin van Baalen,

10
Per farlo funzionare con i tag OG aggiungere virgolette come questo_: var title = document.head.querySelector ('[property = "og: title"]');
Arpo,

1
Simpatico. A quale scopo serve la parte "[contenuto]"? Senza di essa, ottengo anche il meta elemento.
citykid,

1
@citykid Sembra in qualche modo superfluo. Lo snippet genererà sempre un TypeError se il tag non viene trovato dalla sua "proprietà". L'inclusione [content]nel selettore estende tale eccezione al caso in cui un tag corrispondente sia privo di un attributo di contenuto. In questo caso, IMO ha più senso ottenere un risultato nullo, ma credo dipenda dalle preferenze dell'attuatore.
natevw,

93

Molte risposte difficili da leggere qui. Una fodera qui

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

23

C'è un modo più semplice:

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

Questo funziona almeno su IE11, il che lo rende più utile.
rprez,

1
La document.querySelectorversione funziona fino a IE8, quindi è abbondante
fregante

Questo è un buon modo abbastanza normalmente, ma è da notare che il PO sta usando l'attributo RDFa "proprietà" invece del più fondamentale attributo "nome" ( stackoverflow.com/questions/22350105/... )
natevw

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

Usato in questo modo:

getMetaContentByName("video");

L'esempio in questa pagina:

getMetaContentByName("twitter:domain");

Ho usato questo bocconcino, ma su una certa pagina stava ottenendo un type errorcome undefinedperché mancava il meta tag stesso. L'ho risolto assegnando una variabile e racchiudendo l' document.queryselectoristruzione in un'istruzione try in modo da poter ottenere ""per impostazione predefinita in caso di errore.
bgmCoder

funzione getMetaContentByName (nome, contenuto) {var content = (content == null)? 'content': content; provare {return document.querySelector ("meta [name = '" + name + "']"). getAttribute (contenuto); } catch {return null; }}
devMariusz,

15

Se si utilizza JQuery, è possibile utilizzare:

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

9
Supponendo jquery o qualche libreria; non javascript
ILMostro_7 il

12

In Jquery puoi farlo con:

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

In JavaScript puoi farlo con:

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

10
Questo sembra funzionare (almeno in chrome): document.getElementsByTagName('meta')['video'].getAttribute('content');se il markup è il seguente:<meta name="video" content="http://video.com/video33353.mp4" />
samdeV

1
@samdeV, questa è la più pulita di tutte le soluzioni qui. Invialo come risposta personale. :)
frandroid

1
@samdeV, inoltre non è necessario .getAttribute ('content'), puoi semplicemente .content: document.getElementsByTagName ('meta') ['video']. content. Ho appena testato, funziona bene anche in Firefox.
frandroid

Ora sono informato che non funziona in Safari. Accidenti.
Frandroid,

4

Way - [ 1 ]

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

È possibile che venga visualizzato l'errore: TypeError non rilevato: impossibile leggere la proprietà 'getAttribute' di null


Way - [ 2 ]

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

È possibile che venga visualizzato l'errore: TypeError non rilevato: impossibile leggere la proprietà 'getAttribute' di null


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

Invece ottenere l'errore, ottieni null, va bene.



2

Questo codice funziona per me

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

    }    

Esempio di violino: 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;
}

versione aggiornata:

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

1

Ecco una funzione che restituirà il contenuto di qualsiasi meta tag e memorizzerà il risultato, evitando inutili interrogazioni del 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 */

Ed ecco una versione estesa che richiede anche tag per grafici aperti e usa 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

La mia variante della funzione:

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

0

Personalmente preferisco semplicemente ottenerli in un hash oggetto, quindi posso accedervi ovunque. Questo potrebbe essere facilmente impostato su una variabile iniettabile e quindi tutto potrebbe averlo e si afferrò solo una volta.

Avvolgendo la funzione questo può anche essere fatto come una fodera.

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>

dimostrazione


0

Se sei interessato a una soluzione di più ampia portata per ottenere tutti i meta tag, puoi utilizzare questo pezzo di codice

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

se il meta tag è:

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

JQuery sarà:

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

JavaScript sarà: (Restituirà l'intero HTML)

const metaHtml = document.getElementsByTagName('meta').url // metaHtml = '<meta name="url" content="www.google.com" />'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.