ฉันจะรับข้อมูลจากเมตาแท็กด้วย JavaScript ได้อย่างไร


145

ข้อมูลที่ฉันต้องการอยู่ในเมตาแท็ก ฉันจะเข้าถึง"content"ข้อมูลของเมตาแท็กได้property="video"อย่างไร?

HTML:

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

2
โปรดทราบว่า<meta>ควรจะมีคุณลักษณะไม่name propertyนักพัฒนาที่ใช้แอตทริบิวต์มาตรฐานจะต้องปรับรหัสที่ได้รับจากคำตอบส่วนใหญ่
Jens Bannmann

คำตอบ:


132

คุณสามารถใช้สิ่งนี้:

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
สิ่งที่คุณต้องการจริงๆคือ 'ให้' กำหนดไว้ในเครื่อง;)
tommed

27
หากคุณสามารถใช้ querySelector คุณสามารถทำสิ่งนี้: document.querySelector("meta[property='og:url']").getAttribute('content')
Nishchal Gautam

3
ฉันคิดว่าคำตอบนี้ไม่เกี่ยวข้องมากขึ้นและคุณควรใช้stackoverflow.com/questions/7524585/…
Sergei Basharov

ข้ามคำตอบนี้ ไม่สามารถใช้งานได้ในกรณี [เป็นที่ยอมรับแปลก] ของ OP เนื่องจากดูที่แอตทริบิวต์ "name" มากกว่า "property" และในสถานะปัจจุบันมันซับซ้อนเกินไป แต่ไม่มีข้อได้เปรียบด้านความเข้ากันได้ย้อนหลัง - เบราว์เซอร์ใด ๆ ที่รองรับconst/ letควรรองรับ.querySelector!
natevw

สำหรับ meta แอตทริบิวต์เดียวทำไมต้องวนซ้ำหลายครั้ง อาจมีเมตาแท็กหลายร้อยรายการหรืออาจต้องได้รับค่าเมตาหลายครั้ง
SKR

232

คำตอบอื่น ๆ น่าจะเป็นเคล็ดลับ แต่คำตอบนี้ง่ายกว่าและไม่ต้องใช้ jQuery:

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

คำถามเดิมใช้แท็กRDFaพร้อมproperty=""แอตทริบิวต์ สำหรับ<meta name="" …>แท็กHTML ปกติคุณสามารถใช้สิ่งต่างๆเช่น:

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

17
เรียบง่ายสง่างามและไม่มีการพึ่งพา ดีกว่าคำตอบที่ยอมรับ
Raniz

6
แม้ว่าเมตาของฉันอยู่ใน <head> แท็กdocument.head.querySelectorให้ผมnullแต่document.querySelectorทำงานอย่างสมบูรณ์
โรบินฟาน Baalen

10
เพื่อให้มันทำงานร่วมกับแท็ก OG ให้เพิ่มเครื่องหมายคำพูดเช่นนี้ _: var title = document.head.querySelector ('[property = "og: title"]');
arpo

1
NIce. ส่วน "[เนื้อหา]" ทำหน้าที่ใด หากไม่มีมันฉันจะได้รับองค์ประกอบเมตาด้วย
citykid

1
@citykid ดูเหมือนจะไม่จำเป็นเลย ข้อมูลโค้ดจะโยน TypeError เสมอหาก "คุณสมบัติ" ไม่พบแท็ก การรวม[content]ไว้ในตัวเลือกจะขยายข้อยกเว้นนั้นไปยังกรณีที่แท็กที่ตรงกันไม่มีแอตทริบิวต์เนื้อหา IMO มันสมเหตุสมผลกว่าในกรณีนั้นที่จะได้ผลลัพธ์ที่เป็นโมฆะ แต่ฉันเดาว่ามันขึ้นอยู่กับความชอบของผู้ใช้งาน
natevw


23

มีวิธีที่ง่ายกว่า:

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

การทำงานนี้กลับไปเป็นอย่างน้อย IE11 ซึ่งทำให้มีประโยชน์มากขึ้น
rprez

1
document.querySelectorเวอร์ชันนี้ใช้งานได้กับ IE8 ดังนั้นจึงมีมากมาย
อิสระ

นี่เป็นวิธีที่ดีทีเดียว แต่โปรดทราบว่า OP ใช้แอตทริบิวต์ "property" ของ RDFa แทนแอตทริบิวต์ "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);
}

ใช้ในลักษณะนี้:

getMetaContentByName("video");

ตัวอย่างในหน้านี้:

getMetaContentByName("twitter:domain");

ผมใช้อาหารอันโอชะนี้ แต่ในบางหน้าถูกรับtype errorเป็นundefinedเพราะเมตาแท็กเองก็หายไป ฉันแก้ไขโดยการกำหนดตัวแปรและตัดdocument.queryselectorคำสั่ง in a try เพื่อให้ฉันได้รับ""โดยค่าเริ่มต้นในกรณีที่มีข้อผิดพลาด
bgmCoder

ฟังก์ชัน getMetaContentByName (ชื่อเนื้อหา) {var content = (content == null)? 'content': content; ลองใช้ {return document.querySelector ("meta [name = '" + name + "']") getAttribute (content); } จับ {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
ดูเหมือนว่าจะใช้งานได้ (อย่างน้อยที่สุดใน chrome): 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;
}

2

ฟังก์ชันที่แตกต่างกันของฉัน:

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

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"

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

-3

ถ้าเมตาแท็กคือ:

<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" />'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.