jQuery DOM的操作


DOM操作的分類
DOM Core 並不專屬於javascript,任何一種支持DOM的程序設計語言都可以使用它。
它的用途並非僅限與處理網頁,也可以用來處理任何一種使用標記語言編寫出來的文檔。例如XML
javascript中的getElementById(),getElementByTagName(),getAttribute()和setAttribute()等方法,這些都是Dom Core的組成部分。
  
使用DOM Core來獲取表單對象的方法
  document.getElementByTagName( "from" );
使用DOM Core來獲取某元素的src屬性的方法:
  element.getAttribute( "src" );
  
構建DOM元素
<body>
   <p title= "選擇你最喜歡的水果" >你最喜歡的水果是?</p>
   <ul> 
     <li title= '蘋果' >蘋果</li>
     <li title= '橘子' >橘子</li>
     <li title= '菠蘿' >菠蘿</li>
   </ul>
</body>
使用jQeruy在文檔數上查找節點非常容易,可以通過在第2章介紹的jQuery選擇器來完成。
    1.查找元素節點
     獲取元素節點並打印出它的文本內容,jQuery代碼如下:
     var $li = $( "ul li:eq(1)" );   獲取<ul>里第2個<li> 節點
     var li_txt=$li.text();        //獲取第2個<li>元素節點的文本內容
     alert(li_txt);                //打印文本內容,這里會打印出橘子
      
     以上代碼獲取了<ul>元素里第2個<li>節點,並將它的文本內容 "橘子" 打印出來
  
    2.查找屬性節點
    利用jQuery 選擇器查找到需要的元素后,就可以使用attr()方法來獲取它的各種屬性的值.attr()方法得參數可以是一個,也可以是兩個。當參數是一個時,則是要查詢的屬性的名字。
    獲取屬性節點並打印出它的文本內容,jQuery代碼如下:
    var $para = $( "p" );    //獲取<p>節點
    var p_txt=$para.attr( "title" );  //獲取<p>元素節點屬性title
    alert(p_txt);    //打印title屬性值 
  
  
  創建節點
   在dom 操作中,常常需要動態創建HTML內容,是文檔在瀏覽器里面的呈現效果發生變法,並且達到各種各樣的人機交互的目的。
  
   1. 創建元素節點
   例如要創建兩個<li>元素節點,並且要把它們作為<ul>元素節點的子節點添加到DOM節點樹上。
   (1)創建兩個<li>新元素。
   (2)將這兩個新元素插入文檔中。
    第(1)個步驟可以使用jQuery的工廠函數$()來完成。
    $(html);
    $(html)方法會根據傳入的HTML標記字符串,創建一個DOM對象,並將這個DOM對象包裝成一個jQuery對象后返回。
    首先創建兩個<li>元素,jQuery代碼如下:   
    $( "ul" ).append($li_1);   //添加到<ul>節點中,使之能在網頁中顯示
    $( "ul" ).append($li_2);   //可以采取鏈式寫法:$("ul").append($li_1).append($li_2);
      注意事項:
        (1)動態創建的新元素節點不會被自動添加到文檔中,而是需要使用其他方法將其插入文檔中。
        (2)當創建單個元素時,要注意閉合標簽和使用標准的XHTML格式。
         例如創建一個<p> 元素,使用$( "<p/>" )或者( "<p></p>" ),但是不要使用$( "<p>" )或者大寫的$( "<P/>" );
  
    2.創建文檔節點
    var $li_1= $( "<li>香蕉</li>" );  //創建一個<li> 元素,包括元素節點和文本節點,香蕉就是創建的文本節點
    var $li_2 =$( "<li>雪梨</li>" );  //創建一個<li> 元素,包括元素節點和文本節點,雪梨就是創建的文本節點。
    $( "ul" ).append($li_1);          //添加到<ul>節點中,使之能在網頁中顯示
    $( "ul" ).append($li_2);          //添加到<ul>節點中,使之能在網頁中顯示
    以上代碼所示,創建文本節點就是在創建元素節點時直接把文本內容寫出來,然后使用append()等方法將他們添加到文檔中就可以了。
       注意事項:
        無論$(html)中的HTML代碼多么復雜,都要使用相同的方式來創建。
        例如$( "<li><em>這是</em><b>一個</b><a href='#'>復雜的組合</a></li>" );
  
  
    3.創建屬性節點
     創建屬性及節點與創建文本節點類似,也是直接在創建元素節點時一起創建。
     jQuery代碼如下:
     var $li_1=$( "<li title='香蕉'>香蕉</li>" ); //創建一個<li>元素,包含元素節點,文本節點和屬性節點 其中title='香蕉'就是創建的屬性節點
     var $li_2=$( "<li title='雪梨'>雪梨</li>" ); //創建一個<li>元素 包括元素節點,文本節點和屬性節點,其中title=‘雪梨’就是創建的屬性節點
     $( "ul" ).append($li_1);
     $( "ul" ).append($li_2); //添加到<ul> 節點中,使之能在網頁中顯示
      
     插入節點
     動態創建HTML元素並沒有世界用處,還需要將新創建的元素插入文檔中,將新創建的節點插入文檔最簡單的辦法是,讓它成為這個文檔的某個節點的子節點。
     使用append(),它會在元素內部追加新創建的內容。
      
     jQuery中還有提供了其他幾種插入節點的方法。
      
      方法                   描述                                   示例 
   append()         向每個匹配的元素內部追加內容                 HTML代碼  
                                                              <p>我想說:</p> 
                                                              jQuery代碼: $( "p" ).append( "<b>你好</b>" );  結果: <p>我想說:<b>你好</b></p>
   appendTo()       將所有匹配的元素追加到指定的元素中,
                    實際上,使用該方法是顛倒了常規的$(A).append(B)的操作,即不是將B追加到A中,而是將A追加到B中   HTML 代碼  <p>我想說:<p> jQuery代碼: $( "<b>你好</b>" ).appendTo( "p" );  結果: <p>我想說:<b>你好</b></p>    
    
   prepend()        向每個匹配的元素內部前置內容    HTML代碼: <p>我想說:</p > jQuery代碼: $( "p" ).prepend( "<b>你好</b>" );結果<p><b>你好</b>我想說:</p>
  
   prependTo()      將所有匹配的元素前置到指定的元素中,實際上,使用該方法是顛倒了常規的$(A).prepend(B)的操作,即不是將B前置到A中,而是將A前置到B中。HTML 代碼 <p>我想說:</p>  jQuery代碼: $( "<b>你好</b>" ).prependTo( "p" ); 結果<p><b>你好</b>我想說<p>
  
   after()          在每個匹配的元素之后插入內容     HTML代碼 <p>我想說:<p> jQuery代碼: $( "p" ).after( "<b>你好<b>" ); 結果: <p>我想說:</p><b>你好</b>
  
   insertAfter()    將所有匹配的元素插入到指定元素的后面,與after()顛倒了         HTML代碼<p> 我想說</p> jQuery代碼:$( "<b>你好</b>" ).insertAfter( "p" ); 結果<p>我想說:</p><b>你好</b>
    
   before()         將每個匹配的元素之前插入內容              HTML代碼 <p>我想說:</p>  jQuery 代碼:$( "p" ).before( "<b>你好</br>" );  結果<b>你好</b>我想說:</p>
  
   insertBefore()   將所有匹配的元素插入到指定的元素的前面,實際上,使用該方法是顛倒了常規的before的操作   $( "<b> 你好</b>" ).insertBefore( "p" ); 結果:<b>你好</b><p>我想說:</p>
  
   刪除節點
   如果文檔中某一個元素多余,那么應將其刪除,jQuery提供了兩種刪除節點的方法,即remove() 和empty()
   
   1.remove()方法
    作用是從DOM中刪除所有匹配的元素,傳入的參數用於根據jQuery表達式類篩選元素。
     
    例如刪除圖3-11中<ul>節點中的第2個<li>元素節點,jQuery代碼如下:
    $( "ul li:eq(1)" ).remove(); //獲取第2個<li>元素節后,將它從網頁中移除
    當某個節點用remove()方法刪除后,該節點所包含的所有后代節點將同時被刪除,這個方法得放回值是一個指向已被刪除的節點的引用,因此可以在以后再使用這些元素。
    下面的jQuery代碼說明元素用remove()方法刪除后,還是可以繼續使用的。
    var $li = $( "ul li:eq(1)" ).remove(); //獲取第2個<li>元素節點后,將它從網頁中刪除
    $li.appendTo( "ul" ); //把剛刪除的節點又重新添加到<ul>元素里
    可以直接使用appendTo()方法得特性來簡化以上代碼:
    $( "ul li:eq(1)" ).appendTo( "ul" );
    //appendTo()方法也可以用來移動元素
    //移動元素時首先從文檔上刪除此元素,然后將該元素插入得到文檔中的指定節點。
    另外remove()方法也可以通過傳遞參數來選擇性地刪除元素
    $( "ul li" ).remove( "li[title!='菠蘿']" ); //將<li>元素屬性title不等於"菠蘿" 的<li>元素刪除。
  
    
    2.empty()方法
    嚴格來講,empty()方法並不是刪除節點,而是清空節點,它能清空元素中的所有后台節點。
    $( "ul li:eq(1)" ).empty();  //獲取第2個<li>元素節點后,清空此元素里的內容,注意是元素里面。
    使用firebud查看橘子節點發生變化  <li title= '橘子' />
    
    3.復制節點
     復制節點也是常用的DOM操作之一,例如購入車,用戶不僅可以通過單擊商品下方的選擇按鈕購買相應的產品,也可以通過鼠標拖動商品
     並將其放到購物車中,這個商品拖動功能就是用的復制節點,將用戶選擇的商品所處的節點元素復制一次,並將其跟隨鼠標移動,從而達到以下購物車的效果
     $( "ul li" ).click(function(){
      $( this ).clone().appendTo( "ul" ); //復制當前單擊的節點,並將它追加到<ul>元素中
    });
    //在頁面中點擊"菠蘿"后,列表最下方出現新節點"菠蘿"。
    $( this ).clone( true ).appendTo( "body" ); //注意參數true
    在clone()方法傳遞了一個參數 true ,它的含義是復制元素的同時復制元素中所綁定的事件,因此該元素的副本也同樣具備復制功能。
  
    替換節點
    如果要替換某個節點,jQuery提供了相應的方法,即replaceWith和 replaceAll()
    replaceWith()方法得做喲偶那個是將所有匹配的元素都替換成指定的HTML或者DOM元素。
    例如要將網頁中<p title= "選擇你最喜歡的水果" >你最喜歡的水果是?</p> 替換成<strong> 你最不喜歡的水果是?</strong> 可以使用如下jQuery代碼:
      $( "p" ).replaceWith( "<strong>你最不喜歡的水果是?" );
      也可以使用jQuery中另一個方法repalceAll()來實現,該方法與replaceWith()方法得作用相同,只是顛倒了replaceWith的操作。
      $( "<strong>你最不喜歡的水果是?</strong>" ).replaceAll( "p" );
      注意:
        如果在替換之前,已經為元素綁定了事件,替換后原先綁定的事件將會與被替換的元素一起消失,需要在新元素上重新綁定事件。
  
   4. 包裹節點
      如果要將某個節點用其他標記包裹起來,jQuery提供了相應的方法,wrap(),該方法對於需要在文檔中插入額外的結構化標記非常有用,而且不會破壞原始文檔的語義。
      jQuery代碼如下:
      $( "strong" ).wrap( "<b></b>" ); //用<b>標簽把<strong> 元素包裹起來
      得到的結果如下:  
      <b><strong title= "選擇你最喜歡的水果" > 你最喜歡的水果是?</strong></b>
       
      1.wrapAll()方法
      該方法將會將所有匹配的元素用一個元素包裹。它不同於wrap()方法,wrap()方法將所有的元素進行單獨的包裹。 
      $( "strong" ).wrap( "<b></b>" );
       
      2.wrapinner()方法
      該方法將每一個匹配的元素的子內容(包括文本節點) 用其他結構化的標記包裹起來,例如可以使用它來包裹<strong> 標簽的子內容:jQuery代碼如下:
      $( "strong" ).wrapInner( "<b></b>" );
      運行代碼后,發現<strong>標簽內的內容被一對<b>標簽包裹了。
      <strong title= "選擇你最喜歡的水果" ><b>你最喜歡的水果是?</b></strong>
  
      屬性操作
      在jQuery 中,用attr() 方法來獲取和設置元素屬性,removeAtt() 方法來刪除元素屬性。
      1.獲取屬性和設置屬性
        如果要獲取<p>元素的屬性title,那么只需要給attr()方法傳遞一個參數,即屬性名稱。
      var $para=$( "p" );               //獲取<p>節點
      var p_txt=$para.attr( "title" );  //獲取<p>元素節點屬性title
      
      如果要設置<p>元素的屬性title的值,也可以使用同一個方法,不同的是,需要傳遞兩個參數即屬性名稱和對應的值。
      jQuery代碼如下:
      $( "p" ).attr( "title" , "your title" ); //設置單個的屬性值
      //為同一個元素設置多個屬性值
      $( "p" ).attr({ "title" : "your title" , "name" : "test" }); //將一個 "名值" 形式的對象設置為匹配元素的屬性。
      
       jQuery中的很多方法都是同一個函數實現獲取(getter)和設置(setter)的,例如上面的attr()方法,即能設置元素屬性的值,也能獲取元素屬性的值,類似的還有html(),text(),height(),width(),val(),css()等方法。
       
     2.刪除屬性
       有時候需要刪除文檔元素的特定屬性,可以使用removeAttr()方法
       刪除<p>元素的title屬性
       $( "p" ).removeAttr( "title" );
     
     操作樣式
     獲取樣式和設置樣式
     HTML代碼如下:
     <p class = "myclass" title= "選擇你最喜歡的水果" > 你最喜歡的水果是?</p>
     class 也是<p>元素的屬性,因此獲取 class 和設置 class 都可以使用attr()方法。
     var p_class = $( "p" ).attr( "class" ); //獲取<p>元素的class
  
     可以使用attr()方法來設置<p>元素的 class ,jquery代碼如下:
     $( "p" ).attr( "class" , "high" ); //設置<p>元素的class為high
     他是將原來的 class 替換為 class ,而不是在原來的基礎上追加新的 class
  
     追加樣式
     jQuery提供了專門的addClass()方法來追加樣式,為了使例子更為容易理解,首先在<style>標簽里添加另一組樣式
     <style>
     .high{ 
      font-weight:bold;
      color:red;
     }
       
     .another{
      font-style:italic;
      color:blue;
     }
    //在網頁中追加class類的按鈕.  
    $( "input:eq(2)" ).click(function(){ 
    $( "p" ).addClass( "another" ); //給<p>元素追加"another"類 
    })
  
    attr() 和addClass()的區別
    用途                       追加樣式                         設置樣式  
對同一個網頁元素操作       <p>test</p>         
第一次使用方法             $( "p" ).addClass( "high" );             $( "p" ).attr( "class" , "high" );
第1次結果                  <p class = "high" >test</p>  
再次使用方法               $( "p" ).addClass( "another" );          $( "p" ).attr( "class" , "another" );
結果                       <p class = "high another" > test</p>    <p class = "another" > test</p>
  
3移除樣式
如果單擊某一個按鈕時,刪除 class 的某個值,那么可以使用addClass()方法相反的removeClass()方法來完成,它的作用是從匹配的元素中刪除全部或者指定的 class
如下jQuery代碼來刪除
  
  $( "p" ).removeClass( "high" ); //移除<p>元素中為"high"的class
  //如果要把<p>元素的兩個class都刪除,就要使用removeClass()
  $( "p" ).removeClass( "high" ).removeClass( "another" );
  //jquery提供了更簡單的方法
  $( "p" ).removeClass( "high another" );
  另外,還可以使用removeClass()方法得一個特性來完成同樣的效果,它不帶參數的時候會將 class 的值全部刪除.
  $( "p" ).removeClass();
  
  切換樣式
  $toggleBtn.toggle(function(){ 
    //3
  },function(){
    //4
  });
  
  toggle()方法此處的作用是交替執行代碼3和4兩個函數,如果元素原來是顯示的,則隱藏它,如果隱藏的,則顯示它,此時,toggle()方法主要是控制行為上的重復切換。
   
  判斷是否含有某個樣式
  hasClass可以用來判斷元素中是否有某個 class ,如果有,則返回 true ,否則返回 false
  $( "p" ).hasClass( "another" ); 
  //jQuery內部實際上是調用了is()方法來完成這個功能的,該方法等價於
  $( "p" ). is ( ".another" )
  1.設置和獲取HTML,文本和值 
  html()方法
  $( "P" ).html(); //獲取元素的html代碼
  
  2.text() 方法
  $( "p" ).text(); //獲取<p>元素的文本內容
  //text()可以對文本內容設置內容
  $( "p" ).text( "你最喜歡的水果是?" ); //設置<p>元素的文本內容
  
  3.val()方法
  val()方法取值
  通過上面的例子可以發現val()方法不僅能設置元素的值,同時也能獲取元素的值,另外val() 方法還有另外一個用處,就是它能select(下拉列表框),checkbox(多選框)和radio(單選框) 相應的選項被選中,在表單操作中會經常用到。
  //使用val設置選中項
  $( "#single" ).val( "選擇2號" );
  //如果要使下拉列表的第2項和第3項被選中
  $( "#multiple" ).val([ "選擇2號" "選擇3號" ]); //以數組的形式賦值
  使多個文本框被選中
  $( ":checkbox" ).val([ "check2" , "check3" ]);
  $( ":radio" ).val([ "radio2" ]);
  
  也可以使用attr()方法來實現同樣的功能
  $( "#single option:eq(1)" ).attr( "selected" , true );  //設置屬性selected 
  $( "[value=radio2]:radio" ).attr( "checked" , true );
  
1  children()方法 
  該方法用於取得匹配元素的子元素集合
  var $body = $( "body" ) .children();
  var $p=$( "p" ).children();
  var $ul = $( "ul" ).children();
  alert($body.length);
  alert($p.length);
  alert($ul.length);
  
2.next方法
  該方法用於取得匹配元素后面緊鄰的同輩元素。
  從dom樹的結構可以知道<p>元素的下一個同輩節點時<ul>,因此可以通過next() 方法來獲取<ul> 元素
  var $p1 = $( "p" ).next(); //取得緊鄰<p>元素后的同輩元素
  <ul> 
    <li title= '蘋果' >蘋果</li>
    <li title= '橘子' >橘子</li>
    <li title= '菠蘿' >菠蘿</li>
  </ul>
  
  prev()方法
  該方法用於取得匹配元素前面緊鄰的同輩元素。
  從DOM樹的結構中可以知道<ul>元素的上一個同輩節點時<p>,因此可以通過prev()方法類獲取<p>元素
  var $ul = $( "ul" ).prev();  //取得緊鄰<ul>元素前得同輩元素
  得到的結果將是:
  <p title= "選擇你最喜歡的水果" >你最喜歡的水果是?</p>
  
  4.siblings()方法
  該方法用於取得匹配元素前后所有的同輩元素。
  在第1章導航欄的例子中有段代碼如下: 
   $( ".has_children" ).click(function() { 
    $( this ).addClass( "highlight" );  //為當前元素增加highlight類 
    .children( "a" ).show().end()
    .siblings().removeClass( "highlight" )
    .children( "a" ).hide();
})


免責聲明!

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



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