2012-08-08 14 views
28

को रीफ्रेश कैसे कर सकता हूं, मैंने कल एक चरम पर चयन किए गए एक jquery-selector के साथ एक समस्या में भाग लिया और यह मुझे पागल कर रहा है।मैं एक संग्रहीत और स्नैपशॉट किए गए jquery selector variable

  • मेरी obj वर
  • लॉग कंसोल के लिए दोनों लंबाई करने के लिए .elem आवंटित:

    यहाँ testcase के साथ एक jsfiddle है। परिणाम => 4

  • निकालें # 3 डोम
  • लॉग से कंसोल के लिए obj => हटा # 3 अभी भी वहाँ है और लंबाई अब भी है 4. मैं पता लगा कि jQuery क्वेरी snapshotted है? चर के लिए और नहीं कर सकते हैं? नहीं? सांत्वना के लिए अद्यतन किया
  • लॉग .elem .. हां परिणाम => 3 और # 3 चला गया है
  • अब मैं .elem 300
  • प्रवेश का एक नया चौड़ाई के साथ अद्यतन obj & obj.width मुझे 300 देता है .. तो स्नैपशॉट अपडेट किया गया है? domtree और लॉगिंग obj और .elem करने के लिए एक li तत्व जोड़ना: दिलचस्प बात यह है कि 4 divs के 3 नए चौड़ाई

एक अन्य परीक्षण है, लेकिन हटा # 3 नहीं है ...। .elem नई ली है और यह अभी भी पुराने स्नैपशॉट

http://jsfiddle.net/CBDUK/1/

इस अद्यतन करने के लिए नई सामग्री के साथ obj कोई रास्ता नहीं है, क्योंकि obj नहीं है,? मैं एक नया ओबीजे नहीं बनाना चाहता, क्योंकि मेरे आवेदन में उस वस्तु में बहुत सारी जानकारी सहेजी गई है, मैं नष्ट नहीं करना चाहता ...

उत्तर

56

हाँ, यह एक स्नैपशॉट है। इसके अलावा, पृष्ठ डीओएम पेड़ से एक तत्व को हटाने से जादुई रूप से तत्व के सभी संदर्भों को गायब नहीं किया जा रहा है।

तुम इतनी है कि यह ताज़ा कर सकते हैं:

var a = $(".elem"); 

a = $(a.selector); 

मिनी प्लगइन:

$.fn.refresh = function() { 
    return $(this.selector); 
}; 

var a = $(".elem"); 

a = a.refresh(); 

यह सरल समाधान जटिल traversals साथ हालांकि काम नहीं करता। उन लोगों के लिए स्नैपशॉट रीफ्रेश करने के लिए आपको .selector संपत्ति के लिए एक पार्सर बनाना होगा।

प्रारूप की तरह है:

$("body").find("div").next(".sibling").prevAll().siblings().selector 
//"body div.next(.sibling).prevAll().siblings()" 

यथा-स्थान मिनी प्लगइन:

$.fn.refresh = function() { 
    var elems = $(this.selector); 
    this.splice(0, this.length); 
    this.push.apply(this, elems); 
    return this; 
}; 

var a = $(".elem"); 
a.refresh() //No assignment necessary 
+0

आपकी मदद और स्पष्टीकरण के लिए धन्यवाद! यह चयनकर्ता कॉल के साथ बहुत अच्छी तरह से काम किया। यह एक jquery आंतरिक विधि है? उस कॉल के लिए कोई दस्तावेज नहीं मिला। वैसे भी .. मैंने अपना कोड थोड़ा सा बदल दिया और उस गिनती के लिए एक नया सेटटर बनाया और इसे सेटकाउंट ($ ... लंबाई) के साथ बुलाया जो कि काफी अच्छा काम करता है। – Ralk

+0

@ 'selecter' संपत्ति रॉक तकनीकी रूप से आंतरिक हाँ है। – Esailija

+1

@Esailija - यहां काम नहीं करता है: http://jsfiddle.net/nJeqf/ (। चयनकर्ता संपत्ति jQuery 1.7 में बहिष्कृत की गई थी)। http://api.jquery.com/selector/ –

1

मैं भी @Esailija समाधान पसंद किया, लेकिन लगता है कि this.selector फिल्टर के साथ कुछ कीड़े है। तो मैं मेरी जरूरतों के लिए संशोधित, हो सकता है यह किसी

यह उच्च संस्करणों पर स्नैपशॉट फ़िल्टर्ड पर jQuery 1.7.2 didn `t परीक्षण ताज़ा लिए किया गया था के लिए उपयोगी होगा

$.fn.refresh = function() { // refresh seletor 
    var m = this.selector.match(/\.filter\([.\S+\d?(\,\s2)]*\)/); // catch filter string 
    var elems = null; 
    if (m != null) { // if no filter, then do the evarage workflow 
     var filter = m[0].match(/\([.\S+\d?(\,\s2)]*\)/)[0].replace(/[\(\)']+/g,''); 
     this.selector = this.selector.replace(m[0],''); // remove filter from selector 
     elems = $(this.selector).filter(filter); // enable filter for it 
    } else { 
     elems = $(this.selector); 
    } 
    this.splice(0, this.length); 
    this.push.apply(this, elems); 
    return this; 
}; 

कोड है इतना सुंदर नहीं है, लेकिन यह मेरे फ़िल्टर किए गए चयनकर्ताओं के लिए काम करता है।

0

Jquery .selector हटाई गई है, यह इस समय कुछ चर करने के लिए चयनकर्ता मान के साथ स्ट्रिंग याद करना बेहतर है जब आप

function someModule($selector, selectorText) { 
    var $moduleSelector = $selector; 
    var moduleSelectorText = selectorText; 

    var onSelectorRefresh = function() { 
     $moduleSelector = $(moduleSelectorText); 
    } 
} 

https://api.jquery.com/selector/

0

आवंटित आप remove() का उपयोग करते हैं इसके बारे में केवल एक हिस्सा निकाल देंगे डीओएम लेकिन सभी बच्चे या संबंधित नहीं, इसके बजाय यदि आप तत्व पर empty() का उपयोग करते हैं तो समस्या समाप्त हो जाती है।

उदा .:

$('#parent .child).find('#foo').empty(); 

हो सकता है कि यह किसी के लिए उपयोगी हो सकता है!

संबंधित मुद्दे