0

値(domツリーの一部)を取り戻そうとして、次の関数に行き詰まっています。

有用な値を受け取る代わりに、 を取得するだけです0/undefined

var findNodeForAttributeValue = function (node, innerXmlAttributeName, innerXmlAttributeValue) {
var indirectReturnVar='0';
if ((node.nodeType === 1)&&(node.hasAttribute(innerXmlAttributeName))) {
    if (node.getAttribute(innerXmlAttributeName)==innerXmlAttributeValue) {
        indirectReturnVar=node;
        return indirectReturnVar;
    }
}
if((node.hasChildNodes())&&(node.firstChild!=null)) {
    Array.forEach ( node.childNodes, function (children) {
        findNodeForAttributeValue(children, innerXmlAttributeName, innerXmlAttributeValue);
    } );
    return indirectReturnVar;
}

編集

更新されたコード:

var findNodeForAttributeValue = function (node, innerXmlAttributeName, innerXmlAttributeValue) {
  var indirectReturnVar='0';
  if ((node.nodeType === 1) && (node.hasAttribute(innerXmlAttributeName))) {
    if (node.getAttribute(innerXmlAttributeName) == innerXmlAttributeValue) {
      indirectReturnVar = node;
      return indirectReturnVar;
    }
  }

  if ((node.hasChildNodes()) && (node.firstChild != null)) {
    for (var fi=0, fiLen=node.childNodes.length; fi<fiLen; fi++) {
      findNodeForAttributeValue(node.childNodes[fi], innerXmlAttributeName, innerXmlAttributeValue);
    }
    return indirectReturnVar;
  }
}
4

2 に答える 2

1

あなたがするとき:

> Array.forEach ( node.childNodes .. )

forEachArray.prototypeにある Array インスタンスのメソッドです。childNodesプロパティはNodeListあり、配列ではありません。

ES5 をサポートする一部のブラウザーでは、次のことができます。

Array.prototype.forEach.call(childNodes, ...)

ただし、それが機能することは保証されていません (IE 8 以下では失敗します)。したがって、for ループを使用するだけです。

for (var i=0, iLen=node.childNodes.length; i<iLen; i++) {
  // do stuff with node.childNodes[i];
}

編集

更新したコードを修正するには:

function findNodeForAttributeValue (node, innerXmlAttributeName, innerXmlAttributeValue) {

関数宣言を使用してください。代入式を使用している理由がわかりません。また、変数名を短くすると生活がずっと楽になります。おそらく次のようにします。

function getNodeByAttributeValue (node, att, value)

変数に真の値を持たせたい場合は、単に true に設定してください。この場合、falsey が必要なので、未定義のままにするか、nullに設定します(ほとんどの DOM メソッドは、一致する要素を取得しない場合に null を返すため)。

  var indirectReturnVar = null;

これはブロック用で問題ありません。

  if ((node.nodeType === 1) && (node.hasAttribute(innerXmlAttributeName))) {

    if (node.getAttribute(innerXmlAttributeName) == innerXmlAttributeValue) {
      indirectReturnVar = node;
      return indirectReturnVar;
    }
  }

  if ((node.hasChildNodes()) && (node.firstChild != null)) {

このビットは変更が必要です。indirectReturnVarが false の間だけループを続けます。

    for (var fi=0, fiLen=node.childNodes.length; fi<fiLen && !indirectReturnVar; fi++) {

再帰関数の戻り値をindirectReturnVarに割り当てます。そうしないと、エーテル内で失われます。

      indirectReturnVar = findNodeForAttributeValue(node.childNodes[fi], innerXmlAttributeName, innerXmlAttributeValue);


    }
  }

再帰ループので値を返します。一致するノードが見つかるか、ノードがなくなるまでループします。

  return indirectReturnVar;
}
于 2013-10-25T00:53:58.737 に答える