2

クラスごとにHTML要素を見つける再帰関数を実行しようとしていますが、何らかの理由で、子のない子要素に到達すると停止します。コードは次のとおりです。


var alpha = Obj.elementByClass(document.body, "message");

Obj.elementByClass = function(element, cl) {
   var elementChildren = element.children,
       elementChildrenLength = elementChildren.length;

   for(var num=0; num<elementChildrenLength; num++) {
      if(elementChildren[num].className && elementChildren[num].className.indexOf("cl") > -1) {
         return elementChildren[num];
      }
      else if(elementChildren[num].children.length !=0) {
         return Obj.elementByClass(elementChildren[num], cl);
      }
   }
};

jqueryや他のライブラリにアドバイスしないでください。子のない要素に到達すると停止する理由を理解したいと思います。

ありがとう!

4

5 に答える 5

1
Obj.elementByClass = function(element, cl) {
   for(var i=0, len = element.children.length; i<len; i++) {
    if (element.children[i].className && new RegExp('\\b'+cl+'\\b').test(element.children[i].className))
       return element.children[i];
    else if(element.children[i].children.length)
       return Obj.elementByClass(element.children[i], cl);
   }
};

いくつかのポイント:

  • 定義される前に関数を呼び出していました(これは巻き上げられた関数ではないため、エラーになります)
  • 同じ単語を共有する他のクラス名で見つかったクラス名が許可されなくなったため、クラスのテストがより厳密になりました(チェックは、単語の境界を使用してREGEXPで実行されるようになりました)
  • あなたindexOf()は文字列「cl」を明示的に探していました。cl
  • 読みやすくするために少し切り詰めました
  • 現在のコードでは、すべてではなく、最初に一致するノードのみを返します。
于 2012-07-06T10:44:33.500 に答える
1

elementChildrenLengthがゼロの場合、for ループ ブロック全体が実行されません。

これを回避する最善の方法は、次の行に沿って for ループ ブロックを何かでラップすることです。

if(elementChildrenLength==0){
    return 0;
}else{
   for(var num=0; num<elementChildrenLength; num++) {
       //for loop block here
   }
}
于 2012-07-06T10:37:46.073 に答える
1

非要素ノード (テキスト ノードなど) には childNodes プロパティがないため、.children.lengthそれらを読み込もうとするとエラーがスローされ、実行が中止されます。

ノードが要素であることを確認する必要があります。

for(var num=0; num<elementChildrenLength; num++) {
    if (elementChildren[num].nodeType !== 1) {
        continue;
    }
    ...

または、ノードにアクセスする前に、ノードに childNodes プロパティがあることを確認してください。

else if(elementChildren[num].children && elementChildren[num].children.length !=0) {
于 2012-07-06T10:36:48.027 に答える
1

for要素に子がない場合、ループは決して実行されないためです。これは、 numandとの両方elementChildrenLength0あり、条件num<elementChildrenLengthが決して true にならないためです。

于 2012-07-06T10:36:00.757 に答える
1

私が見る限り、あなたは className 'message' を持つ body 要素の最初の子を探しています。この代替案を提案してもよろしいですか?

document.querySelector('body .message')

undefined最初の条件とelse if(elementChildren[num].children.length !=0)両方が真ではないため、関数は戻ります。したがって、何もせず、終了し、何も返されません。

于 2012-07-06T10:52:10.857 に答える