2016-05-10 4 views
0

JavaScript/jQueryの奇妙な振る舞いのように思えますが、クラス名で親要素を見つけるために書いた簡単な関数ではうんざりです。この関数は、要素のクラスをチェックするという点ではかなり単純ですが、見つからない場合は、クラスを見つけるまで親要素と同じ関数を呼び出します。jQueryクラスの再帰的検索親要素

ここに関連するJSFiddle、https://jsfiddle.net/xxvywa4v/があります。

<div class="outer"> 
    <div class="inner"> 
    <div class="innermost">Click Me</div> 
    </div> 
</div> 

と次のJavaScript:

function getParentByClass($el, className) { 
    if ($el.hasClass(className)) { 
    console.log('found element!', $el); // returns correct element 
    return $el; 
    } else { 
    getParentByClass($el.parent(), className); 
    } 
} 

$('.innermost').on('click', function(e) { 
    var $outerEl = getParentByClass($(e.target), 'outer'); 

    console.info($outerEl); // undefined 
}); 

はなぜ正しく記録され、getElementByClassで見つかった要素ですが、クリックハンドラに返され、次のHTMLを考える


としてundefined

(注:私はこの機能を再現する別の方法に興味がないんだけど、むしろそれは、この特定の実装では機能しない理由)

+0

はjQueryのは、すでにこの '.parentsを持っていません() '? – Quantastical

+0

@ Quantastical彼は、彼の実装がうまくいかない理由を知りたがっています。 – juvian

答えて

1

小さなエラー、あなたが実際にあなたが見つけたものを返すされていません再帰。あなたがそれを見つけたときあなたは戻ってきているが、あなたはそれを返すためにそれをバブリングされていません。

} else { 
    getParentByClass($el.parent(), className); 
} 

あなたがそこにもリターンを配置する必要があります:return getParentByClass($el.parent(), className);

+0

ありがとう!この再帰の結果を返すことを完全に見落としました。 – Himmel