jQueryメソッド原生js実装---siblings兄弟ノード
3204 ワード
今日の作業ミスで、モバイルブラウザが動作しなくなり、es 6がコンパイルされずにプロジェクトに入ったと推定されています.経験が足りないから,失敗して知恵をつけよう.
仕事で兄弟ノードを使う場所はあまり多くありませんが、タブ、輪番図が使われるかもしれません.jQueryをさらに深化させるために,わざわざsiblings()法を研究してみた.
上のコードは主にpreviousSiblingとnextSiblingの2つのhtml属性を使用し、それぞれ同胞ノードを取得するために使用されます.しかし、以上のコードには深刻な欠点があります.彼の同胞要素は実験を経て同じレベルの要素を指しています.上のdiv兄弟要素のように、同級のpラベルを11の値のpラベルに含め、ulが包まれていなければ、scriptも含められます.同じレベルだからです.
これは私たちが望んでいるものではないので、部分的に要素に合わないものをフィルタします.フィルタリングの根拠は現在のラベル名です.例えばdivラベル兄弟を探すには、同胞要素ラベルを比較します.コードは次のとおりです.
タグ名はtagName属性で取得し、比較判断でフィルタリングすればよい.古いルールで、jQueryチェーン呼び出しを真似します.
手間を省くために、直接es 6のクラスclass構造を使いますが、newなし構造は実現していませんので、次回暇があれば追加します
参照リンク:http://www.zhufengpeixun.cn/jishuziliao/javaScriptzhuanti/2011-07-21/130.html
仕事で兄弟ノードを使う場所はあまり多くありませんが、タブ、輪番図が使われるかもしれません.jQueryをさらに深化させるために,わざわざsiblings()法を研究してみた.
1
2
3
4
5
11
siblings = (o)=>{
let arr = [] ; //
let prev = o.previousSibling; //o
//
while(prev){
if(prev.nodeType == 1){
arr.unshift(prev);// ,
}
prev = prev.previousSibling;// prev
}
//
let next = o.nextSibling;//o
while(next){
if(next.nodeType == 1){
arr.push(next);// ,
}
next = next.nextSibling;// next,
}
return arr;
}
let odiv = document.getElementById('sibling1');
console.log(siblings(odiv));
上のコードは主にpreviousSiblingとnextSiblingの2つのhtml属性を使用し、それぞれ同胞ノードを取得するために使用されます.しかし、以上のコードには深刻な欠点があります.彼の同胞要素は実験を経て同じレベルの要素を指しています.上のdiv兄弟要素のように、同級のpラベルを11の値のpラベルに含め、ulが包まれていなければ、scriptも含められます.同じレベルだからです.
これは私たちが望んでいるものではないので、部分的に要素に合わないものをフィルタします.フィルタリングの根拠は現在のラベル名です.例えばdivラベル兄弟を探すには、同胞要素ラベルを比較します.コードは次のとおりです.
//js jQuery siblings()
siblings = (o)=>{
let arr = [] ; //
let prev = o.previousSibling; //o
//
while(prev){
if(prev.nodeType == 1&&prev.tagName == o.tagName){
arr.unshift(prev);// ,
}
prev = prev.previousSibling;// prev
}
//
let next = o.nextSibling;//o
while(next){
if(next.nodeType == 1 &&next.tagName == o.tagName){
arr.push(next);// ,
}
next = next.nextSibling;// next,
}
return arr;
}
let odiv = document.getElementById('sibling1');
console.log(siblings(odiv));
タグ名はtagName属性で取得し、比較判断でフィルタリングすればよい.古いルールで、jQueryチェーン呼び出しを真似します.
class aQuery {
constructor(seletor){
this.arr = [] ; //
this.seletor = document.querySelector(seletor);
}
siblings(){
let prev = this.seletor.previousSibling; //o
//
while(prev){
if(prev.nodeType == 1&&prev.tagName == this.seletor.tagName){
this.arr.unshift(prev);// ,
}
prev = prev.previousSibling;// prev
}
//
let next = this.seletor.nextSibling;//o
while(next){
if(next.nodeType == 1 &&next.tagName == this.seletor.tagName){
this.arr.push(next);// ,
}
next = next.nextSibling;// next,
}
return this;
}
}
console.log(new aQuery('#sibling1').siblings().arr)
手間を省くために、直接es 6のクラスclass構造を使いますが、newなし構造は実現していませんので、次回暇があれば追加します
参照リンク:http://www.zhufengpeixun.cn/jishuziliao/javaScriptzhuanti/2011-07-21/130.html