jQuery的DOM操作

一、創建節點

以HTML創建新元素

var txt1="<p>Text.</p>";                                                    

以jQuery創建新元素

var txt2=$('<p></p>').text('text.');

以DOM創建新元素

var txt3=document.createElement("p");       
txt3.innerHTML="Text.";

二、插入節點

通過js的DOM操作只能插入插入jsDOM創建出來的標簽,不能插入字符串類型和jq創建出來的標簽。
操作函數有:append(),appendTo(),prepend(),after(),before():

//A.append(B):把B標簽拼接在A標簽內部結尾的位置。
                //參數可以傳遞任意多個標簽參數,會按照參數的傳遞順序把標簽拼接進文檔流中。
                //jq中的標簽拼接方法,可以把字符串類型、jq對象類型、DOM節點類型的標簽拼接進文檔流中。
//              $(document.body).append(pTag1);
            
                //A.appendTo(B):把A標簽添加到B標簽中(把A拼接進B的內部結尾位置);
                //A必須是jq對象類型,B可以是DOM節點,JQ對象,標簽字符串類型,但是避免
                //標簽字符串參數,因為向字符串中拼接標簽,標簽會拼接失敗。
                
                //A.prepend(B):在A標簽內部的開始位置拼接B標簽
                $(document.body).prepend(pTag1);
//              $(document.body).prepend(pTag2);
//              $(document.body).prepend(pTag3);
                
                //A.after(B):在A標簽之后拼接B標簽(AB是兄弟標簽)
                $('p').after(pTag2);
                //A.before(B):在A標簽之前拼接B標簽(AB是兄弟標簽)
                $('p').before(pTag3);
                
                $('p').each(function(index,elem){
                    console.log(index);
                    console.log(elem);
                });

三、包裹節點操作

//A.wrap(B):讓B標簽當做A標簽的父級;如果A標簽有多個,則每一個A標簽都會有一個獨立的父級B
//              $('li').wrap('<ul></ul>');
                
                //A.wrapAll(B):讓B標簽當做A標簽的父級;如果A標簽有多個,則每一個A標簽都會有一個公用的
                //父級B;如果A的DOM結構中混入了其他標簽,會先把其他標簽移在所有的A標簽之后,然后再用B包裹。
                $('li').wrapAll('<ul></ul>');
                
                //A.wrapInner(B):在A標簽內部,添加B標簽,讓B標簽當做A標簽原來子標簽的父級;A是爺爺級、
                //B是父級、原來A的子級變成孫子級。

四、其他類型節點操作

刪除節點(remove()和detach()):

//remove():刪除調用該方法的標簽,并且會把該標簽保存下來,以備后期拼接使用
                var tag=$('p').remove();
                console.log(tag);               
                $('button').click(function(){
                    alert('hehhehehe');
                });
                //var btn=$('button').remove();
                //刪除有事件函數的標簽
                var btn=$('button').detach();
                //把刪除的增加回來
                $(document.body).append(btn);               
                //remove()和detach()刪除標簽的區別:
                //remove()如果刪除具備事件函數的標簽,則標簽額事件函數會一同解除綁定,
把標簽添加回來時,就沒有對應的事件函數了
                //detach()如果刪除具備事件函數的標簽,則只是在DOM結構中把標簽移除,
該標簽綁定的事件函數不會移除,把標簽添加回來
                //事件函數照樣觸發。

復制節點(clone()):

//復制DOM樹中的標簽,然后在添加在DOM樹中
//A.clone():拷貝DOM樹中的A節點,如果A節點有事件函數,而且需要一起拷貝,則需要傳參:true
                var btns=$('button').clone();

清空節點(empty()):

//清空節點操作
                $('div').empty();

替換節點(replaceWith()和repalceAll()):

//替換節點
                $('a').replaceWith('<a>三生三世</a>');
                //A.repalceWith(B):用B標簽替換A標簽(頁面上顯示的是B標簽)
                //A.repalceAll(B):用A標簽替換B標簽(頁面上顯示的是A標簽)

五、屬性操作

用attr()獲取和設置元素屬性 ,removeAttr()來刪除元素屬性。
1、獲取屬性和設置屬性

var $para=$("p");
var para_txt=$para.attr("title");//獲取屬性title的值
$("p").attr("title","your title");//設置屬性title的值為your title
$("p").attr({"title":"your title","name":"your name"});//為一個元素設置多個屬性

注意: jQuery中很多方法都是同一個函數實現獲取和設置的,例如 attr() 技能獲取屬性的值,也能設置屬性的值。類似的還有html()、text()、height()、width()、val()、css()等方法。
2、刪除屬性

$("p").removeAttr("title");

removeProp()函數用于移除在當前jQuery對象所匹配的每一個元素上指定的屬性。
window對象或DOM元素的一些內置屬性是不允許刪除的,如果試圖刪除這些屬性,將會導致瀏覽器產生一個錯誤。jQuery首先會將該屬性的值賦為undefined,并忽略掉瀏覽器生成的任何錯誤信息。

一般情況下,你最好使用該函數來刪除一些自定義的屬性,而不是內置屬性。

請不要使用本函數來刪除DOM元素的本地屬性checked、selected和disabled。這將徹底刪除對應的屬性,并且,一旦刪除之后,你無法再向該DOM元素重新添加對應的屬性。請使用prop()函數將其設為false即可,例如:jQueryObject.prop(“checked”, false)。

jQuery中attr和pop的區別:

在jQuery中,attr()函數和prop()函數都用于設置或獲取指定的屬性,它們的參數和用法也幾乎完全相同。

但不得不說的是,這兩個函數的用處卻并不相同。下面我們來詳細介紹這兩個函數之間的區別。
[解析來自網絡,點擊查看](http://www.365mini.com/page/jquery-attr-vs-prop.htm)

1、操作對象不同

很明顯,attr和prop分別是單詞attribute和property的縮寫,并且它們均表示"屬性"的意思。

不過,在jQuery中,attribute和property卻是兩個不同的概念。attribute表示HTML文檔節點的屬性,property表示JS對象的屬性。

<!-- 這里的id、class、data_id均是該元素文檔節點的attribute -->
<div id="message" class="test" data_id="123"></div>

<script type="text/javascript">
// 這里的name、age、url均是obj的property
var obj = { name: "CodePlayer", age: 18, url: "http://www.365mini.com/" };
</script>
在jQuery中,prop()函數的設計目標是用于設置或獲取指定DOM元素(指的是JS對象,Element類型)上的屬性(property);attr()函數的設計目標是用于設置或獲取指定DOM元素所對應的文檔節點上的屬性(attribute)。

<!-- attr()函數針對的是該文檔節點的attribute -->
<div id="message" class="test" data_id="123"></div>

<script type="text/javascript">
// prop()函數針對的是該DOM元素(msg)自身的property
var msg = document.getElementById("message");
var $msg = $(msg);
</script>
當然,在jQuery的底層實現中,函數attr()和prop()的功能都是通過JS原生的Element對象(如上述代碼中的msg)實現的。attr()函數主要依賴的是Element對象的getAttribute()和setAttribute()兩個方法。prop()函數主要依賴的則是JS中原生的對象屬性獲取和設置方式。

<div id="message" class="test" data_id="123"></div>
<script type="text/javascript">
var msg = document.getElementById("message");
var $msg = $(msg);

/* *** attr()依賴的是Element對象的element.getAttribute( attribute ) 和 element.setAttribute( attribute, value ) *** */

// 相當于 msg.setAttribute("data_id", 145);
$msg.attr("data_id", 145);

// 相當于 msg.getAttribute("data_id");
var dataId = $msg.attr("data_id"); // 145



/* *** prop()依賴的是JS原生的 element[property] 和 element[property] = value; *** */

// 相當于 msg["pid"] = "pid值";
$msg.prop("pid", "pid值");

// 相當于 msg["pid"];
var testProp = $msg.prop("pid"); // pid值
</script>
當然,jQuery對這些操作方式進行了封裝,使我們操作起來更加方便(比如以對象形式同時設置多個屬性),并且實現了跨瀏覽器兼容。

此外,雖然prop()針對的是DOM元素的property,而不是元素節點的attribute。不過DOM元素某些屬性的更改也會影響到元素節點上對應的屬性。例如,property的id對應attribute的id,property的className對應attribute的class。

<div id="message" class="test" data_id="123"></div>
<script type="text/javascript">
var msg = document.getElementById("message");
var $msg = $(msg);

document.writeln( $msg.attr("class") ); // test
$msg.prop("className", "newTest");
// 修改className(property)導致class(attitude)也隨之更改
document.writeln( $msg.attr("class") ); // newTest
</script>
2、應用版本不同

attr()是jQuery 1.0版本就有的函數,prop()是jQuery 1.6版本新增的函數。毫無疑問,在1.6之前,你只能使用attr()函數;1.6及以后版本,你可以根據實際需要選擇對應的函數。

3、用于設置的屬性值類型不同

由于attr()函數操作的是文檔節點的屬性,因此設置的屬性值只能是字符串類型,如果不是字符串類型,也會調用其toString()方法,將其轉為字符串類型。

prop()函數操作的是JS對象的屬性,因此設置的屬性值可以為包括數組和對象在內的任意類型。

4、其他細節問題

在jQuery 1.6之前,只有attr()函數可用,該函數不僅承擔了attribute的設置和獲取工作,還同時承擔了property的設置和獲取工作。例如:在jQuery 1.6之前,attr()也可以設置或獲取tagName、className、nodeName、nodeType等DOM元素的property。

直到jQuery 1.6新增prop()函數,并用來承擔property的設置或獲取工作之后,attr()才只用來負責attribute的設置和獲取工作。

此外,對于表單元素的checked、selected、disabled等屬性,在jQuery 1.6之前,attr()獲取這些屬性的返回值為Boolean類型:如果被選中(或禁用)就返回true,否則返回false。

但是從1.6開始,使用attr()獲取這些屬性的返回值為String類型,如果被選中(或禁用)就返回checked、selected或disabled,否則(即元素節點沒有該屬性)返回undefined。并且,在某些版本中,這些屬性值表示文檔加載時的初始狀態值,即使之后更改了這些元素的選中(或禁用)狀態,對應的屬性值也不會發生改變。

因為jQuery認為:attribute的checked、selected、disabled就是表示該屬性初始狀態的值,property的checked、selected、disabled才表示該屬性實時狀態的值(值為true或false)。

因此,在jQuery 1.6及以后版本中,請使用prop()函數來設置或獲取checked、selected、disabled等屬性。對于其它能夠用prop()實現的操作,也盡量使用prop()函數。

<input id="uid" type="checkbox" checked="checked" value="1">

<script type="text/javascript">
// 當前jQuery版本為1.11.1
var uid = document.getElementById("uid");
var $uid = $(uid);

document.writeln( $uid.attr("checked") ); // checked
document.writeln( $uid.prop("checked") ); // true

// 取消復選框uid的選中(將其設為false即可)
// 相當于 uid.checked = false;
$uid.prop("checked", false);

// attr()獲取的是初始狀態的值,即使取消了選中,也不會改變
document.writeln( $uid.attr("checked") ); // checked
// prop()獲取的值已經發生變化
document.writeln( $uid.prop("checked") ); // false
</script>

六、樣式操作

1、追加樣式
addClass()
首先在<style>標簽里添加另一組樣式:

<style>
.high{
    font-weight:bold;
    color:red;
    }
.another{
        font-style:italic;/*斜體*/
        color:blue;
        }
</style>

原本代碼:<p class="high" title="">abc</p>
執行:$("p").addClass("another");
此時 p的class為“high  another”
如果給一個元素添加了多個class值,那么就相當于合并了他們的樣式;如果有不同的class設定了同一個樣式屬性,則后者覆蓋前者。

2、移除樣式

$("p").removeClass("high");

或者兩個都刪除:

`$("p").removeClass("high").removeClass("another");`
$("p").removeClass("high  another");

移除所有class:$("p").removeClass();

3、切換樣式
toggleClass()控制樣式的重復切換,如果類名存在就刪除,類名不在就添加
若本來<p class="myclass"></p>,
jQuery語句為:$("p").toggleClass("another");
點擊切換樣式按鈕,則變成<p class="myclass another"></p>,
再點擊一次切換按鈕 ,則又變成<p class="myclass"></p>
不斷點擊他就會在這兩種情況中來回切換。

4.判斷是否含有某個樣式
hasClass()判斷是否含有某個class 有返回true 沒有返回false
$("p").hasClass("another");

七、設置和獲取HTML、文本和值

1.html() 用來讀取或設置 某個元素中的HTML內容,可用于XHTML文檔,不能用于XML文檔
示例:<p><strong>q</strong></p>
jQuery:$("p").html()
獲得的結果是:<strong>q</strong>
設置p元素的html代碼:$("p").html("<strong>p</strong>")

2.text() 用來讀取或設置某個元素的文本內容

獲取內容:$("p").text()
設置內容:$("p").text("你最喜歡的水果是?")

3.val()方法 用來獲取或設置元素的值

$("p").val();
$("p").val("aaa");
另外,如果this是當前的文本框,則this.defaltValue是當前選中文本框的默認值
$("p").value(this.defaultValue);

另外,val()能使select(下拉列表框)、checkbox(多選框)和radio(單選框)相應的選項被選中,這在表單操作中經常會用到。

HTML代碼:
 <select id="multiple" multiple="multiple" style="height:120px">
  <option selected="selected">選擇1號</option>
  <option >選擇2號</option>
  <option >選擇3號</option>
  <option >選擇4號</option>
  <option selected="selected">選擇5號</option>
  </select>

八、遍歷節點

1.children() 取得匹配元素的子元素集合,此方法只考慮子元素,不考慮其他后代元素。
示例HTML代碼:

<body>
  <p></p>
  <ul>
    <li></li>
    <li></li>
  </ul>
</body>

jQuery求子元素個數:

var $body=$("body").children;
alert($body.length);//得到2

2.next() 取得匹配元素后緊鄰的同輩元素
根據上個html例子

$("p").next()得到的結果是:
<ul>
  <li></li>
  <li></li>
</ul>

3.prev() 得到匹配元素前面緊鄰的同輩元素

$("ul").prev()//得到結果為<p></p>

4.siblings() 取得匹配元素前后所有同輩元素

$("p").siblings()
//得到結果為:
<ul>
 <li></li>
 <li></li>
</ul>

6.closest() 取得最近的匹配元素

首先檢查當前元素是否匹配,如果匹配則直接返回元素本身 ,如果不匹配則向上查找父元素,逐級向上查找匹配選擇器的元素,如果什么都沒有則返回一個空的jQuery對象(只返回匹配的第一個元素節點,從自身的節點找起)

給點擊目標最近的li元素添加紅色:

$(document).bind("click",function(e){
$(e.target).closest("li").css("color","red");
})

7.parent() 獲得每個匹配元素的父級元素,從指定類型的直接父節點開始查找,返回一個元素節點

8.parents() 獲得每個匹配元素的祖先元素 返回多個父節點

九、css操作

讀取和設置style對象的各種屬性
css()獲取元素的樣式屬性:$("p").css("color");
css()設置元素的單個樣式:$("p").css("color","red")
css(0設置元素多個樣式:
$("p").css({"fontsize":"30px","backgroundColor":"red"})
透明度設置為半透明$("p").css("opacity","0.5")
獲取元素高度:$("p").css("height")或者$("p").height()
設置元素高度:$("p").height(100)//如果是數字會自動轉化為px
注意:css()獲取的高度值與樣式的設置有關,可能得到“auto”,也可能得到“10px”之類,但是height獲取的高度值是元素在頁面中的實際高度,而且不帶單位,與樣式的設置無關。
類似的還有width()

十、元素定位

1.offset()  獲取元素在當前視窗的相對偏移,其中返回的對象包含top和left兩個屬性,向右為正,向下為正,只對可見元素有效,返回值 為object類型。

var offset=$("p").offset();
var left=offset.left;
var top=offset.top;

2.position() 獲取元素相對于最近的一個position樣式屬性設置為relative或者absolute的祖父節點的相對偏移,返回對象有兩個屬性 top與left。

var position =$("p").position();
var left=position.left;
var top=position.top;

3.scrollTop()和scrollLeft()
獲取滾動條距離左端的距離和頂端的距離

var scrollTop=$("p").scrollTop();
var scrollLeft=$("p").scrollLeft();

也可以指定參數

$("textarea").scrollTop(300);
$("textarea").scrollLeft(300);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容

  • title: 《鋒利的jQuery》三、jQuery的DOM操作date: 2017-07-03 09:23:54...
    Gary23閱讀 396評論 0 1
  • 一、樣式篇 第1章 初識jQuery (1)環境搭建 進入官方網站獲取最新的版本 http://jquery.co...
    凜0_0閱讀 3,432評論 0 44
  • 第一章 jQuery簡介 1-1 jQuery簡介 1.簡介 2.優勢 3.特性與工具方法 1-2 環境搭建 進入...
    mo默22閱讀 1,599評論 0 11
  • jQuery基礎(一)——樣式篇 1-2環境搭建 1-3 jQuery HelloWorld體驗 $(docume...
    croyance0601閱讀 1,096評論 0 8
  • 1. 阿澤是我的一個學弟,很喜歡跳舞的一個男生。長得很瘦是我對他的第一印象,而且說實話他挺有喜感的,是那種說話聲音...
    蔣十二呀閱讀 519評論 4 2