javascript插入before(),after()新DOM方法


隨着web的技術突飛猛進的發展。HTML5 ES6等新技術的發展,與此同時DOM等標准也在悄悄的進步,各大瀏覽器也在悄悄的發展適配新的屬性和方法,今天我們來看看Javascript新的DOM的方法

二、before(),after(),prepend(),append()等新增DOM

before()

 

before()是個ChildNode方法,也就是節點方法。節點方法對應於元素方法。區別在於,節點可以直接是文本節點,甚至注釋等。但是,元素必須要有HTML標簽。

因此,before()的參數既可以是DOM元素,也可以是DOM節點,甚至可以直接字符內容;

 語法如下

  

void ChildNode.before((節點或字符串)... 其它更多節點);

DOM案例

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Document</title>
 6 </head>
 7 <body>
 8     <img  id="images" src="detail.jpg" alt="">
 9     <p><button id="beforeText">圖片前面插入文字“美女:”</button></p>
10 </body>
11 </html>
12 
13 <script>
14 //插入節點的方法
15 var eleImg = document.getElementById('images');
16 var eleBtnBeforeText = document.getElementById('beforeText');
17 eleBtnBeforeText.addEventListener('click', function () {
18     var eleTitle=document.createElement('h1');
19      eleTitle.innerHTML='美女';
20       eleImg.before(eleTitle);
21 });
22 
23 </script>

這是插入DOM節點,那可不可以指接拆入純文本呢O(∩_∩)  淡然可以,我們再看一下純文本代碼

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<img  id="images" src="detail.jpg" alt="">
	<p><button id="beforeText">圖片前面插入文字“美女:”</button></p>
</body>
</html>


<script>
//插入節點的方法
var eleImg = document.getElementById('images');
var eleBtnBeforeText = document.getElementById('beforeText');
eleBtnBeforeText.addEventListener('click', function () {
    eleImg.before("我是文字");
});

</script>

  

顯然是可以的,那插入HTML字符串呢

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <img  id="images" src="detail.jpg" alt="">
    <p><button id="beforeText">圖片前面插入文字“美女:”</button></p>
</body>
</html>
<script>
    //兼容處理源自 https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/before()/before().md
    (function (arr) {
  arr.forEach(function (item) {
    if (item.hasOwnProperty('before')) {
      return;
    }
    Object.defineProperty(item, 'before', {
      configurable: true,
      enumerable: true,
      writable: true,
      value: function before() {
        var argArr = Array.prototype.slice.call(arguments),
          docFrag = document.createDocumentFragment();
        
        argArr.forEach(function (argItem) {
          var isNode = argItem instanceof Node;
          docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem)));
        });
        
        this.parentNode.insertBefore(docFrag, this);
      }
    });
  });
})([Element.prototype, CharacterData.prototype, DocumentType.prototype]);
</script>

<script>
//插入節點的方法
var eleImg = document.getElementById('images');
var eleBtnBeforeText = document.getElementById('beforeText');
eleBtnBeforeText.addEventListener('click', function () {
    eleImg.before('<strong>美女:</strong>'); 
});

</script>

 

 

 

 可以看吃是不可以直接插入HTML字符串的,有人要疑問了,我非要在圖片前面插入HTML字符內容怎么辦

 

可以使用兼容性更好的insertAdjacentHTML() DOM方法,使用示意如下:

document.getElementById('img').insertAdjacentHTML('beforebegin', '<strong>美女:</strong>');

語法如下:

element.insertAdjacentHTML(position, html);

<html>  
     <head>  
     <mce:script language="javascript"><!--  
     function myfun(){  
         var obj = document.getElementById("btn1");  
         obj.insertAdjacentHTML("afterEnd","<br><input name="txt1">");  
     }  
       
// --></mce:script>  
     </head>  
     <body>  
         <input name="txt">  
         <input id="btn1" name="btn1" type="button" value="更多" onclick="myfun()">  
     </body>  
 </html>  
 

  更加詳細的關於點擊insertAdjacentHTML

 

after()

after跟before()語法特性兼容性都是一一對應的,差別就在於語義上,一個是在前面插入,一個是在后面插入。,這里就不更詳細的解釋了

重點


after()與before這些新的方法有兼容性,兼容版本如下圖所示

如果非要再舊版瀏覽器使用新的API屬性怎么辦呢,我們需要引入一段代碼來讓老式瀏覽器兼容

// 源自 https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/before()/before().md
(function (arr) {
  arr.forEach(function (item) {
    if (item.hasOwnProperty('before')) {
      return;
    }
    Object.defineProperty(item, 'before', {
      configurable: true,
      enumerable: true,
      writable: true,
      value: function before() {
        var argArr = Array.prototype.slice.call(arguments),
          docFrag = document.createDocumentFragment();
        
        argArr.forEach(function (argItem) {
          var isNode = argItem instanceof Node;
          docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem)));
        });
        
        this.parentNode.insertBefore(docFrag, this);
      }
    });
  });
})([Element.prototype, CharacterData.prototype, DocumentType.prototype]);

  注意,上面的polyfill 並不支持IE8及其以下瀏覽器。 API只能在至少兼容到IE9瀏覽器的項目使用。

結束

 

三、結束語

我們如今,原生的DOM API借鑒jQuery的優點,也整出了很多簡單遍歷的API方法;如果我們再粘貼一些polyfill JS搞定兼容性問題;再配合ES5很多數據處理方法;DOM leave 3的事件處理等。

基本上就沒有需要使用jQuery的理由了,省了資源加載,提高了代碼性能,

所以,基本上,已經不可逆地,在不久將來,不出幾年,行業會興起原生DOM API,原生JS開發前端應用的小風尚,jQuery會越來越不被人提起,完成其歷史使命,日后可以領取個終身成就獎。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM