日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dojo使用query dojo/query

發布時間:2024/1/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dojo使用query dojo/query 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

要使用query,就要引入dojo/query包。
query可以根據Dom里節點的標簽名、id名、class名來檢索一個或多個節點。
--------------------------------------------------------------------------------------------

<ul id="list">????<li class="odd">????????<div class="bold">????????????<a class="odd">Odd</a>????????</div>????</li>????<li class="even">????????<div class="italic">????????????<a class="even">Even</a>????????</div>????</li>????<li class="odd">????????<a class="odd">Odd</a>????</li>????<li class="even">????????<div class="bold">????????????<a class="even">Even</a>????????</div>????</li>????<li class="odd">????????<div class="italic">????????????<a class="odd">Odd</a>????????</div>????</li>????<li class="even">????????<a class="even">Even</a>????</li></ul><ul id="list2">????<li class="odd">Odd</li></ul>
--------------------------------------------------------
var uls = query("ul");//檢索到兩個ul節點
var list = query("#list")[0];//檢索到一個id為list的節點
var odds = query(".odd");//檢索到七個class為odd的節點

var oddLI = query("li.odd");//檢索到四個li的class為odd的節點
var allA = query("li a");//檢索到六個li子節點為a的節點
var someA = query("li > a");//檢索到兩個li第一個子節點為a的節點
query方法中的字符串叫選擇器,其規則同CSS相同,返回值為一個數組。

forEach方法用來遍歷數據元素。
query(".odd").forEach(function(node, index, nodelist){????????????//
????????});在forEach的callBack方法里有三個參數,
node指代當前元素,
index指代當前元素在數組中的序列號,
nodelist為query(".odd")返回的數據(可選),在某些情況下可能需要,如需要獲取當前元素前一個元素時
雖然通過id只會檢索到一個節點,但query只以數組的形式返回,所以通過query("#list")[0]即可直接獲取。

如果需要對檢索的全部元素做相同的處理,則不用通過forEach分別對每個元素進行操作,可直接對query(".odd")進行操作,如
query(".odd").addClass("red");//對所有class名為odd的元素添加class red
query(".odd").removeClass("red").addClass("blue");//對所有class名為odd的元素刪除class red并添加class blue
query(".even").style("color","white").addClass("italic");//對所有class名為even的元素修改color樣式為white,并添加class italic
query(".hookUp").on("click",function(){????????????alert("This button is hooked up!");????????});//對所有class名為hookUp的元素添加一個click響應事件


這個片段來自:https://www.ibm.com/developerworks/cn/web/1009_moying_dojoquery/

基于 Dojo Query 的查詢

當我們采用 Dojo Query 進行查詢時,通常使用最多的就是根據 HTML 元素的 tag 名稱,或是 class 以及 id 屬性來進行查詢。這也是我們在引用 CSS 元素進行選擇時常用的幾種方式。比如,假設我們想查詢頁面內所有的 <img> 標簽,那么不妨可以這么寫:

dojo.query("img");

此處,img 即為標簽名稱,由于 Dojo Query 并不對大小寫進行區分,故而形如 <IMG> 這樣的 HTML 元素也會被包含在查詢結果之中。上述語法的執行效果,等價于在 JavaScript 中調用 DOM API:document.getElementsByTagName("IMG")。

同樣,根據 class 和 id 屬性進行查詢的語法,也很簡單。例如,下面的例子實現的是在當前頁面中查詢 id 為 widget123 的元素:

dojo.query("#widget123");

其執行效果,等價于調用 document.getElementById("widget123");,或者,利用 Dojo 提供的 API,則相當于 dojo.byId("widget123")。

針對 class 屬性的查詢同樣的簡單直觀,例如,下面的例子是查找所有 class 名稱為“offToSeeTheWij”的 HTML 元素:

dojo.query(".offToSeeTheWij");

此處我們可以看到,同樣的功能,如果用 DOM API 來實現,則將會變得非常冗長乏味:

清單 1 DOM API 查詢

var list = []; var nodes = document.getElementsByTagName("*"); for(var x = 0; x < nodes.length; x++){ if(nodes[x].className == "progressIndicator"){ list.push(nodes[x]); } }

在上述代碼中,我們需要對頁面中的所有節點進行遍歷,逐一判斷其 className 屬性是否滿足匹配條件才行。通過這個典型的例子,我們可以清楚地看到,使用 Dojo Query 在 DOM 節點查詢方面具有非常顯著的優勢。

事實上,使用 Dojo Query 不僅在表達查詢條件的簡潔性上會更具優勢,相比于直接利用 DOM API 進行處理的方式,其執行速度也通常會更加的快。接下來讀者便會看到,這一點尤其在我們需要查詢相對復雜的頁面節點關系時,會變得更為突出。

除了上述我們看到的,Dojo Query 提供了基本的依據 tag、class、id 進行查詢的方式以外,它還提供了許多更為復雜的查詢語法,而所有這些語法則都遵循于 CSS 規范。Dojo Query 的這一做法十分的明智,因為 CSS 是已經被大家所廣泛使用和接受了的一種 Web 技術,其對 HTML 頁面元素進行選擇性修飾的方式,兼具語法簡潔和功能強大的特點,目前所有的主流瀏覽器都對 CSS 有很好的支持。Dojo Query 沿用了 CSS 的語法,使得使用者無需學習一整套新的查詢語法,便可以很好的掌握 Dojo Query 的使用,以完成各種復雜的查詢功能。

目前,Dojo Query 支持許多常見的 CSS 選擇器語法。例如,我們可以利用較為復雜的類選擇器語法,實現對符合指定 class 屬性的指定元素進行查詢:

dojo.query("div.someClassName");

又比如,我們可以將對各 tag 名稱結合起來實現組合查詢,下面完成的即是查詢出所有的 h1,h2,h3 節點:

dojo.query("h1,h2,h3");

除此以外,Dojo Query 還支持某些特殊的在 CSS 3 中定義的選擇器。我們可以在查詢條件中引用某些特殊的偽類選擇符,比如可以利用 nth-child 來查詢 tbody 節點下所有奇數序號的子元素:

dojo.query("tbody tr:nth-child(odd)");

利用 first-child 來查詢任意節點下的首個 p 子元素:

dojo.query("p:first-child");

還可以利用諸如“^=”、“$=”、“*=”這樣的屬性選擇器,實現匹配特定字符串條件的查詢。例如,下列代碼就是分別用來查詢 name 屬性的取值以“item”打頭,以“item”結尾,和包含“item”字樣的元素的:

清單 2 使用屬性選擇器

dojo.query("[name^=item]"); dojo.query("[name$=item]"); dojo.query("[name*=item]");

上面我們看到的有關于 Dojo Query 的例子都只接受一個參數,它們實現的是在全局范圍內,即整個頁面范圍內,對節點進行查詢。Dojo Query 還支持局部范圍內的相對查詢。此時,除了查詢表達式外,我們需要傳入另一個參數,用以指示查詢起始的根節點。該參數可以是一個字符串,Dojo Query 會將其視作元素的 id 值;或者我們也可以傳入一個 DOM 節點。在下面的例子里,我們實現了在 thisForm 這個節點下進行查詢的功能:

清單 3 局部范圍內的相對查詢

<html> <head> <script type="text/javascript" src="../js/dojo/dojo.js"></script> <script type="text/javascript"> dojo.addOnLoad(function() { console.debug(dojo.query("button").length); // 輸出"3"console.debug(dojo.query("button", "thisForm").length); // 輸出”1”}); </script> </head> <body> <button id="b1" /> <button id="b2" /> <form id="thisForm" > <button id="formB" /> </form> </body> </html>

對查詢結果進行后續操作

通過以上章節的介紹,我們知道,Dojo Query 返回的結果是 NodeList 對象。NodeList 是一個擴展的 Array 對象,它提供了豐富的操作接口方法。基本而言,NodeList 提供了幾乎所有操作 DOM 的方法,且簡單易用;因為它本身是 Array 對象,所以它支持所有的 Dojo 對數組的操作方法;同時,它也提供了很多直接處理事件的方法。而且,NodeList 還有一個顯著的優點,就是很多方法支持鏈式調用。所謂鏈式調用,是指 NodeList 的方法調用之后仍會返回當前的對象,可以通過“.”級聯繼續應用其他的操作,例如 :

清單 4 鏈式調用

dojo.query(".thinger ").style {border :"1px" }).removeClass("thinger").addClass("thinger2");

我們先來看一下 NodeList 的基本操作。

作為 Array 對象,NodeList 具有長度屬性,而且可以通過 at,forEache,push,pop 這些方法來操縱它。需要注意的是 at,map,forEach,slice,splice,contact 等都可以進行鏈式調用,但是 push,pop,shift 和 unshift 則是不可以的。請參看以下代碼片段:

清單 5 NodeList 基本操作

var l = dojo.query(".thinger"); console.log("Size of items with class thinger:"+l.length); //NodeList 中加入對象l.push(dojo.create('div', { innerHTML:'hi' })); console.log("Size of items with class thinger:" + l.length); l.push(dojo.byId("foo")); console.log("Size of items with class thinger:" + l.length); // 查詢 id 為 foo 的元素在 NodeList 中的位置console.log( l.indexOf(dojo.byId("foo")) ); // 獲取第四個元素var node = l[3]; // 通過 at 方法,一次找出第二和第四個元素,返回結果也是一個 NodeList。var newList = l.at(1, 3);

在使用 NodeList 的過程中,如果大家細心的話,也許會注意到,NodeList 在封裝 dojo.* 方法的同時,通過自描述(self-descriptive)方式省略掉了第一個參數,這也是符合我們使用習慣的。例如 NodeList 的 forEach 方法,其用法看起來很像 dojo.forEach(Array,Function)。不過第一個參數被隱式提供了,即將 NodeList 對象本身作為 Array 參數的值。

下面這個例子說明如何在 <div> 內添加內容。

清單 6 NodeList.forEach 方法

dojo.query("div").forEach(function(node, index, array){ node.innerHTML = "new version content!"; });

注意,通過自描述省略第一個參數的概念貫穿所有 NodeList 的 API。下面介紹的 NodeList 的常用方法,也適用上面的概念。

dojo.style 是一個應用于單個 node 的 API,這個 API 對應到 NodeList API,等價于隱式省去 node 參數,然后將其應用于 NodeList 中的每一個元素。

清單 7 NodeList.style 方法

// 執行查詢

var borders = dojo.query(".thinger").style("border"); // 設置新值dojo.query(".thinger").style("border", "1px solid black"); // 刪除,添加 class dojo.query(".thinger").style({border :" 3px solid red" }).removeClass("thinger"). addClass("thinger2");

上面的代碼段是一個 NodeList API 進行級聯調用的例子。大部分 DOM 相關的對象都如上述例子一樣,返回 NodeList,然后我們可以對其進行鏈式調用。但并非所有的 API 都可以級聯,NodeList.coords 就是一個例外,它返回的是一組符合條件的坐標值,因此是不可以級聯的。

var nl = dojo.query(".foo");

var coords = nl.coords(); // 例如返回對象 { x,y,z}

所以我們在使用 NodeList API 時,要注意并不是所有的 API 都可以級聯調用。這個基本上可以通過是否返回 NodeList 對象進行判斷。

現在,我們簡單介紹一下,如何在 NodeList 中使用事件。

以 NodeList.connect() 為例,它提供了一種方法,可以向所有的 DOM Node 中添加事件。對應于 dojo.connect API,同樣,node 參數對應于 NodeList 中當前的 Node。

清單 8 NodeList.connect 方法

dojo.query("input").connect("onclick", function(e){ alert("new event!"); });

我們可以像使用 dojo.connect 一樣,向 NodeList.connect 添加任何事件。為了方便起見,NodeList 提供了很多 DOM 的直接操縱對應事件的方法,所以上面的例子也可以寫成:

清單 9 NodeList.onclick 方法

dojo.query("input").onclick(function(e){ alert("new event!"); });

直接支持的事件還包括 onclick, onmouseenter, onmouseleave, onmouseover, omouseout, ondblclick 等。例如:

清單 10 NodeList 的鼠標事件

dojo.query("p").onmouseenter(function(e){ dojo.style(e.target, "color", "red"); }).onmouseleave(function(e){ dojo.style(e.target, "color", "blue"); });

有時,為了自己使用的方便或者出于興趣,也許你想在 NodeList 中增加一些方法,以便可以在 dojo.query 的調用中使用這些方法。為此我們可以通過 dojo.extend 擴展 NodeList 向 NodeList 中添加自定義的新方法。如:

清單 11 擴展 NodeList 方法

dojo.extend(dojo.NodeList, { setColor: function(newColor){ this.style({ color: newColor }); return this; } }); dojo.query("p").setColor ("yellow");

注意,此處的關鍵是“return this”,它保證了后續鏈式調用的成功執行。

另外,為了保持 NodeList 基本操作函數的緊湊性,一些擴展方法是以外部包的形式提供的。例如,dojo.NodeList-fx 為 NodeList 引入了 FX/Animation,dojox.fx.ext-dojo.NodeList 提供 dojox.fx 里關于動畫的功能,dojo.NodeList-html 提供了高級的 HTML 操縱功能,等等。

通過以上的介紹我們可以看出,通過 NodeList,我們可以更加簡單地操縱 DOM 對象,更加方便地添加事件,更重要的是,我們還可以進行鏈式操作,以減少代碼復雜度,加快開發速度。




總結

以上是生活随笔為你收集整理的dojo使用query dojo/query的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费看一级黄色片 | 日韩中文字幕免费在线观看 | 岛国大片在线观看 | 国产毛片久久 | 日韩亚洲精品视频 | 一区二区三区偷拍 | 婷婷激情五月网 | av日韩在线免费观看 | 国产人妖视频 | 91啪在线观看 | 性欧美13一14内谢 | 97干视频| 亚洲一区视频在线播放 | 少妇视频一区 | 欧洲成人一区二区三区 | www.波多野结衣.com | 欧美日韩高清在线 | a级免费观看 | 亚洲精品中文无码AV在线播放 | 成人一区二区免费视频 | 国产一区二区在线播放视频 | 亚洲美女视频在线 | 久久久不卡国产精品一区二区 | 中文字幕在线观看免费 | 日韩高清一区二区 | 天天色棕合合合合合合合 | 人妻av一区二区 | 爱情岛论坛永久入址测速 | 精品久久一二三区 | www.亚洲天堂| 亚洲成人精品av | 伊人久久五月 | 学生孕妇videosex性欧美 | 日韩精品免费在线视频 | 91九色在线 | 亚洲va久久久噜噜噜无码久久 | 日韩美女激情视频 | 91福利在线观看视频 | 中文字幕在线观看不卡 | 青青五月天| 国产无码精品视频 | 日韩午夜激情电影 | 4438全国最大成人网 | 会喷水的亲姐姐 | 波多野结衣免费在线视频 | 野花视频免费在线观看 | 日韩在线一 | 国产福利视频在线观看 | 韩国三级做爰视频 | 欧美一级片 | 亚洲蜜桃精久久久久久久久久久久 | 国产日产精品一区二区三区 | 日韩一区二区免费视频 | 伊人av在线播放 | 色狠狠久久av大岛优香 | 人人爱超碰 | 亚洲青青草原 | 日韩在线视频网 | 精品一区二区视频在线观看 | 污污网站免费在线观看 | 中文字幕一区二区三区精品 | 国产伦精品一区二区三区精品 | 色中色av | 521av在线 | 国产日韩二区 | 国产成人精品aa毛片 | 打屁屁日本xxxxx变态 | 欧美精品在欧美一区二区少妇 | 欧美在线不卡视频 | 国产精品毛片视频 | 午夜日韩在线观看 | 尤物视频官网 | 国产美女菊爆在线播放APP | 欧美一区二区三区粗大 | 日本一区二区在线 | 亚洲一区二区麻豆 | 亚洲乱码国产一区三区 | 国产欧美123 | 97伊人网 | 碰超在线| 天天干干干干干 | 国产精品一区一区三区 | 毛片无码免费无码播放 | 国产黄a | 免费在线欧美 | 日本不卡中文字幕 | 少妇高潮迭起 | 五月天激情视频在线观看 | 国产网站免费观看 | hd性videos意大利精品 | 中文日韩在线观看 | av片网址| 鲁大师私人影院在线观看 | 天天色影| 欧美日韩成人一区二区三区 | 日本三级韩国三级三级a级中文 | 国产网站免费看 | 国产免费无码一区二区 | 日韩成人在线视频 |