2012-07-19 20 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> 

मैं तिथि करने के लिए इसी प्राप्त करने के लिए दिनांक से बाद अगले तत्व प्राप्त करना चाहते हैं। (लेआउट थोड़ा अधिक जटिल है लेकिन तिथि से लेकर आज तक की कक्षा है और आज तक की तारीख है)।

यह मैं करने की कोशिश कर रहा हूं, मैं तारीख से तत्व लेना चाहता हूं और डोम में अगले तत्व को डेट क्लास के साथ ढूंढना चाहता हूं। मैंने यह कोशिश की:

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

लेकिन यह मुझे खाली jQuery तत्व दे रहा है। मुझे लगता है कि ऐसा इसलिए है क्योंकि next अगला भाई चयनकर्ता से मेल खाता है। मैं संबंधित to-date कैसे प्राप्त कर सकता हूं? क्योंकि आप में एक अतिरिक्त p है

के बीच आप .parent().next().find('.to-date') जरूरत

उत्तर

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') कुछ भी वापस नहीं करता है,।

यदि आपका डोम आपके उदाहरण से अधिक जटिल है तो आपको इसे समायोजित करना पड़ सकता है। लेकिन अनिवार्य रूप से यह कुछ इस तरह करने पर निर्भर करता:

$(".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")); 
}); 

संपादित करें: यह सिर्फ आईडी देखने के लिए काफी बेहतर है और तेजी से है। निम्नलिखित कोड-दिनांक से सभी खोज करता है और हो जाता है करने के लिए दिनांक अनुसार:

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

अच्छी तरह से, यह बेहद अक्षम है ... बस आईडी के लिए देखो! आप एक आईडी है, तो इसका इस्तेमाल - यह बहुत तेजी से एक पुनरावर्ती एल्गोरिदम के साथ डोम traversing तो है।मैं आपको यह दिखाने के लिए अपना जवाब संपादित करूंगा कि यह कैसे करें। – 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

मैंने यह कोशिश नहीं की ... लेकिन चूंकि आप डोम के सभी तत्वों पर लूप कर रहे हैं, मुझे विश्वास है कि यह बहुत अक्षम हो सकता है। – rubyprince

+0

मैं इस बात से सहमत हूं कि आप किस बारे में चिंतित हैं। लेकिन ट्रैवर्सिंग के अन्य रूपों में अधिक स्क्रिप्टिंग का उपयोग किया जाएगा। इसके अलावा, मुझे विश्वास नहीं है कि पूरे डोम के माध्यम से यात्रा करने से इस स्तर के खोज के लिए काफी समय लगेगा। –

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; 
     } 
    } 

जेएस का उपयोग करें। अपनी आईडी से कुंजी नंबर प्राप्त करने के लिए। संख्या को आउटपुट करने से विश्लेषण करें। जेक्यू का प्रयोग करें। चयनकर्ता गठबंधन स्ट्रिंग जो आप + इस नंबर से चाहते हैं। उम्मीद है कि यह भी आपकी मदद कर सकता है।