Jak uzyskać informacje z metatagu z JavaScriptem?


145

Informacje, których potrzebuję, znajdują się w metatagu. Jak mogę uzyskać dostęp do "content"danych metatagu, kiedy property="video"?

HTML:

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

2
Zauważ, że <meta>ma mieć nameatrybut, a nie property. Programiści używający standardowego atrybutu będą musieli dostosować kod podany w większości odpowiedzi.
— Jens Bannmann

Odpowiedzi:


132

Możesz użyć tego:

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
To, czego naprawdę chcesz, to „pozwól”, aby były zdefiniowane lokalnie;)
— jutro

27
Jeśli możesz użyć querySelector, możesz zrobić coś takiego: document.querySelector("meta[property='og:url']").getAttribute('content')
— Nishchal Gautam

3
Myślę, że ta odpowiedź nie jest bardziej odpowiednia i naprawdę powinieneś użyć stackoverflow.com/questions/7524585/ ...
— Siergiej Baszarow

Pomiń tę odpowiedź. Nie działa w przypadku OP [co prawda dziwnego], ponieważ patrzy na atrybut „nazwa” zamiast atrybutu „właściwość”. W obecnym stanie jest zbyt skomplikowany, ale bez żadnej przewagi w zakresie kompatybilności wstecznej - wszystkie przeglądarki, które obsługują const/ letpowinny obsługiwać .querySelector!
— natevw

tylko dla jednego atrybutu meta, po co powtarzać pętlę wiele razy? może mieć setki metatagów lub może wymagać wielokrotnego pobrania wartości meta.
— SKR

232

Inne odpowiedzi prawdopodobnie powinny załatwić sprawę, ale ta jest prostsza i nie wymaga jQuery:

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

Oryginalne pytanie zawierało tag RDFa z property=""atrybutem. W przypadku normalnych <meta name="" …>tagów HTML możesz użyć czegoś takiego:

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

17
Prosty, elegancki i nie ma żadnych zależności. Lepsza niż zaakceptowana odpowiedź imo
— Raniz

6
Mimo że moja meta jest w tagu <head>, document.head.querySelectordała mi, nullale document.querySelectordziałała idealnie
— Robin van Baalen

10
Aby działał z tagami OG, dodaj do niego cudzysłowy w ten sposób :_: var tytuł = document.head.querySelector ('[property = "og: title"]');
— arpo

1
Ładny. Jakiemu celowi służy część „[treść]”? Bez tego otrzymuję również element meta.
— citykid

1
@citykid Wydaje się to trochę zbyteczne. Fragment zawsze wyrzuci TypeError, jeśli znacznik nie zostanie znaleziony przez jego „właściwość”. Uwzględnienie [content]w selektorze rozszerza ten wyjątek na przypadek, w którym dowolny pasujący znacznik nie ma atrybutu treści. IMO w takim przypadku bardziej sensowne jest uzyskanie wyniku zerowego, ale myślę, że zależy to od preferencji implementującego.
— natevw

95

Tutaj jedna wkładka

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

23

Jest łatwiejszy sposób:

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

Działa to przynajmniej do IE11, co czyni go bardziej użytecznym.
— rprez

1
document.querySelectorWersja działa przez całą drogę do IE8, więc jest mnóstwo
— fregante

Zwykle jest to całkiem niezły sposób, ale zauważ, że OP używa atrybutu RDFa „property” zamiast bardziej podstawowego atrybutu „name” ( stackoverflow.com/questions/22350105/… )
— natevw

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

Używane w ten sposób:

getMetaContentByName("video");

Przykład na tej stronie:

getMetaContentByName("twitter:domain");

Użyłem tej ciekawostki, ale na pewnej stronie otrzymywałem type erroras, undefinedponieważ brakowało samego metatagu. Rozwiązałem to, przypisując zmienną i zawijając document.queryselectorinstrukcję try, dzięki czemu mogłem ""domyślnie uzyskać w przypadku błędu.
— bgmCoder

function getMetaContentByName (name, content) {var content = (content == null)? 'content': content; try {return document.querySelector ("meta [name = '" + name + "']"). getAttribute (treść); } catch {return null; }}
— devMariusz

15

Jeśli używasz JQuery, możesz użyć:

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

9
Zakładając jquery lub jakąś bibliotekę; not javascript
— ILMostro_7

12

W Jquery możesz to osiągnąć poprzez:

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

W JavaScript możesz to osiągnąć poprzez:

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

10
Wydaje się, że to działa (przynajmniej w Chrome): document.getElementsByTagName('meta')['video'].getAttribute('content');jeśli znaczniki są takie jak poniżej:<meta name="video" content="http://video.com/video33353.mp4" />
— samdeV

1
@samdeV, to najczystsze ze wszystkich rozwiązań tutaj. Prześlij to jako własną odpowiedź. :)
— frandroid

1
@samdeV, również nie musisz .getAttribute ('content'), możesz po prostu .content: document.getElementsByTagName ('meta') ['video']. content. Właśnie przetestowałem, to działa również dobrze w Firefoksie.
— frandroid

Zostałem poinformowany, że nie działa w Safari. Cholera.
— frandroid

4

Droga - [ 1 ]

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

Może pojawić się błąd: Uncaught TypeError: Cannot read property „getAttribute” of null


Droga - [ 2 ]

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

Może pojawić się błąd: Uncaught TypeError: Cannot read property „getAttribute” of null


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

Zamiast otrzymywać błąd, nullto dobrze.



2

Ten kod działa dla mnie

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

    }    

Przykładowe skrzypce: 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;
}

wersja aktualizacji:

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

2

Mój wariant funkcji:

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

1

Oto funkcja, która zwróci zawartość dowolnego metatagu i zapamięta wynik, unikając niepotrzebnego odpytywania 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 */

A oto wersja rozszerzona, która również pyta o tagi otwartego grafu i używa 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"

0

Osobiście wolę uzyskać je w jednym skrócie obiektu, wtedy mam do nich dostęp w dowolnym miejscu. Można to łatwo ustawić na zmienną do wstrzykiwania, a potem wszystko może to mieć i tylko raz.

Dzięki owinięciu funkcji można to również zrobić jako jedną wkładkę.

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>

Próbny


0

Jeśli jesteś zainteresowany bardziej dalekosiężnym rozwiązaniem do pobierania wszystkich metatagów, możesz użyć tego fragmentu kodu

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

-3

jeśli metatag to:

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

JQuery będzie:

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

JavaScript będzie: (Zwróci cały HTML)

const metaHtml = document.getElementsByTagName('meta').url // metaHtml = '<meta name="url" content="www.google.com" />'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.