Як отримати інформацію з метатега за допомогою JavaScript?


136

Мені потрібна інформація знаходиться у метатезі. Як я можу отримати доступ до "content"даних метатега, коли property="video"?

HTML:

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

2
Зауважте, що <meta>повинен мати nameатрибут, а не property. Розробникам, які використовують стандартний атрибут, потрібно буде адаптувати код, наданий більшістю відповідей.
Йенс Банманн

Відповіді:


128

Ви можете скористатися цим:

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
Те, що ви насправді хочете, - це "нехай", щоб вони були локально визначеними;)
приурочено

22
Якщо ви можете використовувати querySelector, ви можете зробити щось подібне: document.querySelector("meta[property='og:url']").getAttribute('content')
Nishchal Gautam

3
Я думаю, що ця відповідь не є більш актуальною, і ви дійсно повинні використовувати stackoverflow.com/questions/7524585/…
Сергій Башаров

Пропустіть цю відповідь. Він не працює у [неправдоподібному] випадку ОП, оскільки дивиться на атрибут "name", а не на "властивість". І в його нинішньому стані надмірно складний, але без зворотної переваги сумісності - будь-які браузери, які підтримують const/ letповинні підтримувати .querySelector!
natevw

лише для одного мета-атрибута, навіщо робити циклічні дії на кілька разів? він може мати сотні метатегів або може знадобитися отримувати мета-значення кілька разів.
SKR

212

Інші відповіді, ймовірно, повинні зробити трюк, але цей простіший і не вимагає jQuery:

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

В оригінальному запитанні використовувався тег RDFa з property=""атрибутом. Для звичайних <meta name="" …>тегів HTML ви можете використовувати щось на кшталт:

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

16
Простий, елегантний і не має залежностей. Краще, ніж прийнята відповідь imo
Раніз

6
Навіть незважаючи на те, що моя мета знаходиться в тезі <head>, document.head.querySelectorдав мені, nullале document.querySelectorпрацював чудово
Робін ван Бален

10
Щоб змусити його працювати з тегами OG, додайте до неї цитати так: this_: var title = document.head.querySelector ('[властивість = "og: title"]');
арпо

1
NIce. Якій меті служить частина "[зміст]"? Без нього я також отримую мета-елемент.
citykid

1
@citykid Це здається дещо зайвим. Фрагмент завжди буде кидати TypeError, якщо тег не знайдений його "властивістю". Включення [content]до селектора розширює цей виняток на випадок, коли в будь-якому відповідному тезі відсутній атрибут вмісту. IMO в цьому випадку має більше сенсу отримати нульовий результат, але, мабуть, це залежить від переваг реалізатора.
natevw

93

Тут дуже важко читати відповідь. Один лайнер тут

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

23

Є простіший спосіб:

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

Це працює як мінімум до IE11, що робить його більш корисним.
rprez

1
document.querySelectorВерсія працює весь шлях до IE8, так що це багато
fregante

Це дуже хороший спосіб , як правило, але зауважте , що OP використовує «властивість» атрибут RDFa замість більш основного «імені» атрибут ( stackoverflow.com/questions/22350105 / ... )
natevw

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

Використовується таким чином:

getMetaContentByName("video");

Приклад на цій сторінці:

getMetaContentByName("twitter:domain");

Я використовував цей пришвидшений фрагмент, але на певній сторінці отримував таке type error, undefinedщо не було, оскільки сам метатег відсутній. Я вирішив це, призначивши змінну і загорнувши тест document.queryselectorу оператор спробу, щоб я міг отримати ""за замовчуванням у випадку помилки.
bgmCoder

функція getMetaContentByName (ім'я, контент) {var content = (content == null)? 'content': content; спробуйте {return document.querySelector ("meta [name = '" + name + "']"). getAttribute (content); } catch {return null; }}
devMariusz

15

Якщо ви використовуєте JQuery, ви можете використовувати:

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

9
Припускаючи jquery або якусь бібліотеку; не javascript
ILMostro_7

12

У Jquery ви можете досягти цього за допомогою:

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

У JavaScript ви можете досягти цього за допомогою:

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

10
Це, здається, працює (принаймні, в хромі): document.getElementsByTagName('meta')['video'].getAttribute('content');якщо розмітка така, як нижче:<meta name="video" content="http://video.com/video33353.mp4" />
samdeV

1
@samdeV, це найчистіший з усіх рішень тут. Надішліть це як власну відповідь. :)
frandroid

1
@samdeV, також вам не потрібно .getAttribute ('content'), ви можете просто .content: document.getElementsByTagName ('meta') ['video'] .вміст. Я щойно тестував, це добре працює і в Firefox.
frandroid

Мені зараз відомо, що це не працює в Safari. Блін.
frandroid

4

Шлях - [ 1 ]

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

Ви можете отримати помилку: Uncaught TypeError: Неможливо прочитати властивість 'getAttribute' з null


Шлях - [ 2 ]

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

Ви можете отримати помилку: Uncaught TypeError: Неможливо прочитати властивість 'getAttribute' з null


Шлях - [ 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'));

Замість помилки ви отримуєте null, це добре.



2

Цей код працює для мене

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

    }    

Приклад скрипки: 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;
}

оновлення версії:

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

1

Ось функція, яка повертає вміст будь-якого метатегу та запам'ятовує результат, уникаючи зайвих запитів 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 */

Ось розширена версія, яка також запитує відкриті теги графіків і використовує 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

Мій варіант функції:

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

0

Я особисто вважаю за краще просто їх розмістити в одному хеш-об'єкті, тоді я можу отримати доступ до них де завгодно. Це можна було легко встановити на змінну, яка ін'єктується, і тоді все могло б мати її, і вона схопилася лише один раз.

Увімкнувши цю функцію, це також можна зробити як один вкладиш.

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>

Демо


0

Якщо ви зацікавлені в більш далекосяжному рішенні, щоб отримати всі метатеги, ви можете використовувати цей фрагмент коду

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

якщо метатег:

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

JQuery буде:

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

JavaScript буде: (Поверне весь HTML)

const metaHtml = document.getElementsByTagName('meta').url // metaHtml = '<meta name="url" content="www.google.com" />'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.