除了判斷的過程,那么還涉及到節(jié)點的關(guān)系處理,如:
var selector = "div > div.Aaron [name=ttt]";
節(jié)點與節(jié)點之間是有層級關(guān)系的,這里就遇到了“>”與“空”。子元素組合器(E > F)和(E F)都作為后代組合,但是他們有所不同,更具體的是(E > F)它只會選擇第一級的后代,那么我們從右邊往左邊匹配就會遇到這樣的情況,[name=ttt]節(jié)點與div.Aaron中間的連接符“空”則為后代選擇器,那么意味著[name=ttt]元素的可能是div.Aaron元素的一個孩子,孫子,曾孫等。
同理div.Aaron與div的連接符是“>” 子元素選擇器,這個簡單只能是父子關(guān)系。除此之外,還有相鄰兄弟選擇器“+”與“~”,(prev + next) 和 (prev ~ siblings)之間最值得注意的不同點是他們各自的可及之范圍。前者只達(dá)到緊隨的同級元素,后者擴展了該達(dá)到跟隨其的所有同級元素。
針對選擇器的層級關(guān)系:
首先“>”與“空”是祖輩關(guān)系,這樣可以理解是線型的,那么我們只要遞歸檢測每次元素的 parentNode 屬性返回指定節(jié)點的父節(jié)點。
同理“+”與“~”也是類似的兄弟關(guān)系,無非就是擴展的范圍不同,所以針對層級的關(guān)系問題。
jQuery引入了詞素關(guān)系:
relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }
這里的dir可以認(rèn)為是查找的一個條件,就是查找父節(jié)點還是兄弟節(jié)點,那么first的意思就是一個快速條件,因為“>”選擇器是一個很明確的父子關(guān)系所以通過標(biāo)記first只需要查找一層即可。我們可以看代碼:
function addCombinator(elems) { var elem; while ((elem = elems['parentNode'])) { if (elem.nodeType === 1) { return elem } } };
請驗證,完成請求
由于請求次數(shù)過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報