ฉันกำลังทำงานกับ CMS ซึ่งป้องกันการแก้ไขซอร์ส HTML สำหรับ<head>
องค์ประกอบ
ตัวอย่างเช่นฉันต้องการเพิ่มสิ่งต่อไปนี้เหนือ<title>
แท็ก:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
ฉันกำลังทำงานกับ CMS ซึ่งป้องกันการแก้ไขซอร์ส HTML สำหรับ<head>
องค์ประกอบ
ตัวอย่างเช่นฉันต้องการเพิ่มสิ่งต่อไปนี้เหนือ<title>
แท็ก:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<meta>
แท็กแบบไดนามิกจะไม่มีผลใด ๆ ขึ้นอยู่กับสิ่งที่เป็นและเบราว์เซอร์ที่เกี่ยวข้อง
คำตอบ:
คุณสามารถเลือกและเพิ่มได้ตามปกติ:
$('head').append('<link />');
JavaScript:
document.getElementsByTagName('head')[0].appendChild( ... );
สร้างองค์ประกอบ DOM ดังนี้:
link=document.createElement('link');
link.href='href';
link.rel='rel';
document.getElementsByTagName('head')[0].appendChild(link);
jQuery
$('head').append( ... );
JavaScript:
document.getElementsByTagName('head')[0].appendChild( ... );
...
เพราะฉันไม่รู้สึกว่านั่นเป็นส่วนสำคัญของคำถามและในขณะที่เขียนก็ไม่มีตัวอย่างให้เห็นว่าเขาต้องการใส่อะไรในหัว แต่ใช่มันจำเป็นต้องเป็นองค์ประกอบ DOM
คุณสามารถใช้innerHTML
เพียงแค่ต่อสตริงเขตข้อมูลพิเศษ
document.head.innerHTML = document.head.innerHTML + '<link rel="stylesheet>...'
อย่างไรก็ตามคุณไม่สามารถรับประกันได้ว่าเบราว์เซอร์จะจดจำสิ่งพิเศษที่คุณเพิ่มลงในส่วนหัวหลังจากการโหลดครั้งแรกและเป็นไปได้ว่าคุณจะได้รับ FOUC (แฟลชของเนื้อหาที่ไม่มีการเรียงซ้อน) เมื่อโหลดสไตล์ชีตเพิ่มเติม
ฉันไม่ได้ดู API มาหลายปีแล้ว แต่คุณยังสามารถใช้ได้document.write
ซึ่งเป็นสิ่งที่ออกแบบมาสำหรับการกระทำประเภทนี้ อย่างไรก็ตามสิ่งนี้จะทำให้คุณต้องบล็อกหน้าไม่ให้แสดงผลจนกว่าคำขอ AJAX เริ่มต้นของคุณจะเสร็จสมบูรณ์
ในเบราว์เซอร์ล่าสุด (IE9 +) คุณยังสามารถใช้document.head :
ตัวอย่าง:
var favicon = document.createElement('link');
favicon.id = 'myFavicon';
favicon.rel = 'shortcut icon';
favicon.href = 'http://www.test.com/my-favicon.ico';
document.head.appendChild(favicon);
สร้างองค์ประกอบชั่วคราว (e. g. DIV
) กำหนดรหัส HTML ของคุณให้กับinnerHTML
คุณสมบัติจากนั้นต่อท้ายโหนดลูกเข้ากับHEAD
องค์ประกอบทีละรายการ ตัวอย่างเช่นนี้:
var temp = document.createElement('div');
temp.innerHTML = '<link rel="stylesheet" href="example.css" />'
+ '<script src="foobar.js"><\/script> ';
var head = document.head;
while (temp.firstChild) {
head.appendChild(temp.firstChild);
}
เมื่อเปรียบเทียบกับการเขียนHEAD
เนื้อหาทั้งหมดใหม่ผ่านทางเนื้อหาinnerHTML
นี้จะไม่ส่งผลกระทบต่อองค์ประกอบย่อยที่มีอยู่ของHEAD
องค์ประกอบ แต่อย่างใด
โปรดทราบว่าสคริปต์ที่แทรกด้วยวิธีนี้ดูเหมือนจะไม่ถูกดำเนินการโดยอัตโนมัติในขณะที่ใช้สไตล์สำเร็จ ดังนั้นหากคุณต้องการเรียกใช้สคริปต์คุณควรโหลดไฟล์ JS โดยใช้Ajaxจากนั้นเรียกใช้เนื้อหาโดยใช้ไฟล์eval()
.
body
ก แต่สามารถทำได้จริงในhead
-tag หรือไม่? ผมอยู่ภายใต้การแสดงผลที่แท็กได้รับอนุญาตเท่านั้นที่base
, link
, meta
, title
, style
และscript
?
DIV
องค์ประกอบเป็นเพียงภาชนะชั่วคราวสำหรับวัตถุประสงค์ของการแยกโค้ด HTML คุณไม่ควรแทรกDIV
ตัวเองลงในไฟล์HEAD
. คุณควรใส่ของโหนดลูก โปรดดูตัวอย่างที่ฉันได้เพิ่มไว้ในคำตอบ
temp
องค์ประกอบ” ดูเอกสารNode.firstChild ()
ลองใช้จาวาสคริปต์บริสุทธิ์:
ไลบรารี JS:
appendHtml = function(element, html) {
var div = document.createElement('div');
div.innerHTML = html;
while (div.children.length > 0) {
element.appendChild(div.children[0]);
}
}
ประเภท:
appendHtml(document.head, '<link rel="stylesheet" type="text/css" href="http://example.com/example.css"/>');
หรือ jQuery:
$('head').append($('<link rel="stylesheet" type="text/css" />').attr('href', 'http://example.com/example.css'));
ด้วย jquery คุณมีตัวเลือกอื่น:
$('head').html($('head').html() + '...');
อย่างไรก็ตามมันใช้งานได้ ตัวเลือก JavaScript ที่คนอื่นพูดก็ถูกต้องเช่นกัน
.html()
จะไม่สามารถกู้คืนทุกคุณสมบัติ DOM (กรณีที่พบบ่อยที่สุดของปัญหานี้และที่เห็นได้ชัดเจนที่สุดคือเมื่อใช้โค้ดที่คล้ายกันเพื่อเพิ่มฟิลด์ใหม่ลงในฟอร์มแอตทริบิวต์ค่าแสดงถึงค่าเริ่มต้นของฟิลด์ดังนั้นการรับhtml()
และตั้งค่ากลับจะรีเซ็ตที่มีอยู่ทั้งหมด ฟิลด์เป็นค่าเริ่มต้น)