2012-07-19 14 views
5

後、私はこのようなHTMLマークアップを持っている特定のクラスで次の要素を取得します:私は、日付に対応する取得するには日付から後の次の要素を取得したい特定の要素

<p> 
    <label>Arrive</label> 
    <input id="from-date1" class="from-date calender" type="text" /> 
</p> 

<p> 
    <label>Depart</label> 
    <input id="to-date1" class="to-date calender" type="text" /> 
</p> 

<p> 
    <label>Arrive</label> 
    <input id="from-date2" class="from-date calender" type="text" /> 
</p> 

<p> 
    <label>Depart</label> 
    <input id="to-date2" class="to-date calender" type="text" /> 
</p> 

。 (レイアウトはもう少し複雑ですが、dateからdateクラスまで、dateには最新のクラスがあります)。

これは私がやろうとしていることですが、私はdate要素を取得し、domの次の要素をto-dateクラスで見つけたいと思います。私はこれを試しました:

$('#from-date1').next('.to-date') 

しかし、それは私に空のjQuery要素を与えています。これは、nextがセレクタに一致する次の兄弟を与えるからです。対応するto-dateを入手するにはどうすればよいですか?あなたはあなたが.parent().next().find('.to-date')が必要

の間に追加の pを持っているので

答えて

6

これを行う直接的な方法を見つけることができませんでしたので、少し再帰的なアルゴリズムを書いています。

デモ:http://jsfiddle.net/sHGDP/

nextInDOM()関数は2つの引数、すなわちから見て開始する要素と一致するセレクタをとります。代わりに

あなたが使用することができます
$('#from-date1').next('.to-date') 

nextInDOM('.to-date', $('#from-date1')) 

コード

function nextInDOM(_selector, _subject) { 
    var next = getNext(_subject); 
    while(next.length != 0) { 
     var found = searchFor(_selector, next); 
     if(found != null) return found; 
     next = getNext(next); 
    } 
    return null; 
} 
function getNext(_subject) { 
    if(_subject.next().length > 0) return _subject.next(); 
    return getNext(_subject.parent()); 
} 
function searchFor(_selector, _subject) { 
    if(_subject.is(_selector)) return _subject; 
    else { 
     var found = null; 
     _subject.children().each(function() { 
      found = searchFor(_selector, $(this)); 
      if(found != null) return false; 
     }); 
     return found; 
    } 
    return null; // will/should never get here 
} 
+1

私はこれを試して、それは私に次の要素を与えました。あなたはこれを素敵な小さな機能にしました。どうもありがとう。 – rubyprince

+0

うれしかったです。 :)解決するのは本当にクールな問題でした。実際、 'nextInDOM()'のようなものは、多くの場所で役に立つと思います。 – techfoobar

+0

はい、私は自分のサイトでカレンダーの日付を日付から人が日付の日付を選択する日付にするために使用しました。多くのありがとうと私は間違いなく私の将来のプロジェクトにもこの機能を使用しています。 – rubyprince

4

.next('.to-date')は、何も返しません。

domがあなたの例よりも複雑な場合は、これを調整する必要があります。しかし、本質的には次のようなものに変わります。

$(".from-date").each(function(){ 
    // for each "from-date" input 
    console.log($(this)); 
    // find the according "to-date" input 
    console.log($(this).parent().next().find(".to-date")); 
}); 

編集:IDを探すだけではるかに速くなります。次のコードは、TO-日付に従って-日付から全て検索し、取得します。

function getDeparture(el){ 
    var toId = "#to-date"+el.attr("id").replace("from-date",""); 
    //do something with the value here 
    console.log($(toId).val()); 
} 

var id = "#from-date", 
    i = 0; 

while($(id+(++i)).length){ 
    getDeparture($(id+i)); 
} 

exampleを見てみましょう。

+1

はい、私はこれにいくつかの繰り返し場所があるので、マークアップに関係なく次のアイテムを取得したいと思います。マークアップに関係なくこの機能をどこにでも適用したいと思います。 – rubyprince

+0

まあ、これは非常に非効率です...ちょうどそのIDを探してください!あなたはIDを持っていますので、それを使用してください - これは、はるかに高速ですし、再帰的なアルゴリズムでDOMを横断します。私はあなたにそれを行う方法を示すために私の答えを編集します。 – Christoph

0

var flag = false; 
var requiredElement = null; 
$.each($("*"),function(i,obj){ 
    if(!flag){ 
     if($(obj).attr("id")=="from-date1"){ 
      flag = true; 
     } 
    } 
    else{ 
     if($(obj).hasClass("to-date")){ 
      requiredElement = obj; 
      return false; 
     } 
    } 
}); 
を試してみてください
+1

私はこれを試していませんでしたが、あなたがDomのすべての要素をループしているので、これは非常に非効率的かもしれません。 – rubyprince

+0

私はあなたが心配していることに同意します。しかし、他の形式のトラバースでは、より多くのスクリプトを使用します。さらに、私は、DOMの全体を走査することは、このレベルの探索のために多くの時間を要するとは考えていません。 –

0
var item_html = document.getElementById('from-date1'); 
    var str_number = item_html.attributes.getNamedItem("id").value; 
    // Get id's value. 
    var data_number = showIntFromString(str_number); 


    // Get to-date this class 
    // Select by JQ. $('.to-date'+data_number) 
    console.log('to-date'+data_number); 

    function showIntFromString(text){ 
     var num_g = text.match(/\d+/); 
     if(num_g != null){ 
      console.log("Your number:"+num_g[0]); 
      var num = num_g[0]; 
      return num; 
     }else{ 
      return; 
     } 
    } 

JSを使用してください。あなたのIDからキー番号を取得する。数値を出力するよりも分析します。 JQを使用します。セレクタあなたが+この番号よりも望む文字列を結合します。これがあなたにも役立つことを願っています。

関連する問題