Làm cách nào để lấy thông tin từ thẻ meta bằng JavaScript?


135

Thông tin tôi cần là trong một thẻ meta. Làm thế nào tôi có thể truy cập "content"dữ liệu của thẻ meta khi property="video"nào?

HTML:

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

2
Lưu ý rằng <meta>được cho là có một namethuộc tính, không property. Các nhà phát triển sử dụng thuộc tính tiêu chuẩn sẽ cần điều chỉnh mã được đưa ra bởi hầu hết các câu trả lời.
Jens Bannmann

Câu trả lời:


128

Bạn có thể sử dụng điều này:

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
Điều bạn thực sự muốn là "hãy để chúng được xác định cục bộ;)
thiệu vào

22
Nếu bạn có thể sử dụng querySelector, bạn có thể làm một cái gì đó như thế này: document.querySelector("meta[property='og:url']").getAttribute('content')
Nishchal Gautam

3
Tôi nghĩ rằng câu trả lời này không phù hợp hơn và bạn thực sự nên sử dụng stackoverflow.com/questions/7524585/
mẹo

Bỏ qua câu trả lời này. Nó không hoạt động trong trường hợp [thừa nhận lẻ] của OP vì nó nhìn vào thuộc tính "tên" thay vì "thuộc tính". Và ở trạng thái hiện tại, nó quá phức tạp nhưng không có bất kỳ lợi thế tương thích ngược nào - bất kỳ trình duyệt nào hỗ trợ const/ letnên hỗ trợ .querySelector!
natevw

chỉ với một thuộc tính meta, tại sao phải lặp đi lặp lại nhiều lần? nó có thể có hàng trăm thẻ meta hoặc có thể cần lấy giá trị meta nhiều lần.
SKR

211

Các câu trả lời khác có lẽ nên thực hiện mẹo, nhưng câu trả lời này đơn giản hơn và không yêu cầu jQuery:

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

Câu hỏi ban đầu đã sử dụng thẻ RDFa với một property=""thuộc tính. Đối với các <meta name="" …>thẻ HTML thông thường, bạn có thể sử dụng một cái gì đó như:

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

16
Đơn giản, thanh lịch và không có sự phụ thuộc. Tốt hơn câu trả lời được chấp nhận imo
Raniz

6
Mặc dù meta của tôi nằm trong thẻ <head>, document.head.querySelectorđã cho tôi nullnhưng document.querySelectorhoạt động hoàn hảo
Robin van Baalen

10
Để làm cho nó hoạt động với các thẻ OG, hãy thêm dấu ngoặc kép vào nó như this_: var title = document.head.querySelector ('[property = "og: title"]');
arpo

1
Đẹp. Mục đích nào mà phần "[nội dung]" phục vụ? Không có nó, tôi cũng có được yếu tố meta.
citykid

1
@citykid Có vẻ hơi thừa. Đoạn mã sẽ luôn ném TypeError nếu thẻ không được tìm thấy bởi "thuộc tính" của nó. Việc bao gồm [content]trong bộ chọn sẽ mở rộng ngoại lệ đó cho trường hợp bất kỳ thẻ phù hợp nào thiếu thuộc tính nội dung. IMO nó có ý nghĩa hơn trong trường hợp đó để có được một kết quả null nhưng nó tùy thuộc vào sở thích của người thực hiện.
natevw

93

Rất nhiều câu trả lời khó đọc ở đây. Một lớp lót ở đây

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

23

Co một cach dê dang hơn:

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

Điều này hoạt động trở lại ít nhất là IE11, làm cho nó hữu ích hơn.
rprez

1
Các document.querySelectorphiên bản làm việc tất cả các cách để IE8, vì vậy nó rất nhiều
fregante

Đây là một cách khá tốt thông thường, nhưng lưu ý rằng OP đang sử dụng thuộc tính "thuộc tính" RDFa thay vì thuộc tính "tên" cơ bản hơn ( stackoverflow.com/questions/22350105/ .)
natevw

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

Được sử dụng theo cách này:

getMetaContentByName("video");

Ví dụ trên trang này:

getMetaContentByName("twitter:domain");

Tôi đã từng miếng ngon này, nhưng trên một trang nhất định đã nhận được một type errornhư undefinedvì thẻ meta riêng của mình đã mất tích. Tôi đã giải quyết điều đó bằng cách chỉ định một biến và gói document.queryselectortrong câu lệnh thử để tôi có thể nhận được ""theo mặc định trong trường hợp có lỗi.
bgmCoder

hàm getMetaContentByName (tên, nội dung) {var content = (content == null)? 'content': content; thử {return document.querySelector ("meta [name = '" + name + "']"). getAttribution (nội dung); } bắt {trả về null; }}
devMariusz

15

Nếu bạn sử dụng JQuery, bạn có thể sử dụng:

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

9
Giả sử jquery, hoặc một số thư viện; không phải javascript
ILMostro_7

12

Trong Jquery bạn có thể đạt được điều này với:

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

Trong JavaScript, bạn có thể đạt được điều này với:

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

10
Điều này dường như hoạt động (ít nhất là trong chrome): document.getElementsByTagName('meta')['video'].getAttribute('content');nếu đánh dấu như sau:<meta name="video" content="http://video.com/video33353.mp4" />
samdeV

1
@samdeV, đây là giải pháp sạch nhất trong tất cả các giải pháp ở đây. Gửi nó như câu trả lời của riêng bạn. :)
frandroid

1
@samdeV, bạn cũng không cần .getAttribution ('content'), bạn chỉ có thể .content: document.getElementsByTagName ('meta') ['video']. content. Tôi vừa thử nghiệm, điều này cũng hoạt động tốt trong Firefox.
frandroid

Bây giờ tôi được thông báo rằng nó không hoạt động trong Safari. Chết tiệt.
frandroid

4

Cách - [ 1 ]

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

Bạn có thể gặp lỗi: Uncaught TypeError: Không thể đọc thuộc tính 'getAttribution' của null


Cách - [ 2 ]

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

Bạn có thể gặp lỗi: Uncaught TypeError: Không thể đọc thuộc tính 'getAttribution' của null


Cách - [ 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'));

Thay vì nhận được lỗi, bạn nhận được null, đó là tốt.



2

Mã này làm việc cho tôi

<meta name="text" property="text" content="This is text" />
<meta name="video" property="text" content="http://video.com/video33353.mp4" />

Mã não

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

    }    

Ví dụ fiddle: 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;
}

Bản nâng cấp:

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

1

Biến thể của tôi của chức năng:

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

0

Đây là một hàm sẽ trả về nội dung của bất kỳ thẻ meta nào và sẽ ghi nhớ kết quả, tránh việc truy vấn DOM không cần thiết.

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

Và đây là phiên bản mở rộng cũng truy vấn các thẻ biểu đồ mở và sử dụng 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

Cá nhân tôi thích chỉ cần lấy chúng trong một hàm băm đối tượng, sau đó tôi có thể truy cập chúng ở bất cứ đâu. Điều này có thể dễ dàng được đặt thành một biến có thể tiêm và sau đó mọi thứ có thể có nó và nó chỉ được lấy một lần.

Bằng cách gói chức năng này cũng có thể được thực hiện như một lớp lót.

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>

Bản giới thiệu


0

Nếu bạn đang xen vào một giải pháp sâu rộng hơn để có được tất cả các thẻ meta, bạn có thể sử dụng đoạn mã này

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

nếu thẻ meta là:

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

JQuery sẽ là:

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

JavaScript sẽ là: (Nó sẽ trả về toàn bộ HTML)

const metaHtml = document.getElementsByTagName('meta').url // metaHtml = '<meta name="url" content="www.google.com" />'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.