2012-08-08 17 views
28

Dün bir değişkene atanan jQuery-selector ile ilgili bir sorunla karşılaştım ve beni delirtiyor.Depolanmış ve snapshotted jquery seçici değişkeni nasıl yenileyebilirim

  • günlük konsola hem uzunlukları benim obj var kadar .elem atayın: Burada

    testcase ile jsfiddle olduğunu. konsola obj DOM
  • günlüğünden Sonucu => 4
  • Kaldır 3. kaldırılan 3. hala var> = ve uzunluk 4. ben jquery sorgu snapshotted olduğunu anladım hala? değişkene ve yapamaz mı? konsola
  • günlük .elem güncellenecektir .. evet => 3 ve 3. Şimdi 300
  • günlük yeni bir genişliğe sahip .elem güncellemek
  • gitmiş obj & obj.width bana 300 veriyor Sonuç .. Yani anlık görüntü güncellendi mi? İlginç olan, 4 divanın 3'ünün yeni genişliğe sahip olması, ancak kaldırılan # 3'ün ... #

Başka bir test: Bir domtree ve logging obj ve .elem öğesine bir eleman eklenmesi. .elem yeni li var ve hala eski enstantane

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

bu yeni içerikle obj güncellemek için hiçbir yolu var mı çünkü obj, değil mi? Yeni bir objeyi yapmak istemiyorum çünkü uygulamamda bu nesneye kaydedilen çok fazla bilgi var, yok etmek istemiyorum ...

cevap

56

Evet, bu bir anlık görüntü. Ayrıca, sayfa DOM ağacından bir öğenin kaldırılması, öğeye yapılan tüm başvurularda sihirli bir şekilde kaybolmaz.

Öyle gibi yenileyebilirsiniz:

var a = $(".elem"); 

a = $(a.selector); 

Mini eklentisi:

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

var a = $(".elem"); 

a = a.refresh(); 

Bu basit çözüm olsa karmaşık geçişleri ile çalışmaz. Bunların anlık görüntüsünü yenilemek için .selector özelliği için ayrıştırıcı yapmanız gerekir.

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

Yerinde mini eklentisi:

biçimi gibidir

$.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

Yardımlarınız ve açıklamalarınız için teşekkür ederiz! .selector çağrısı ile çok iyi çalıştı. JQuery iç yöntemi mi? Bu arama için herhangi bir doküman bulamadı. Her neyse .. Kodumu biraz değiştirdim ve bu sayım için yeni bir setter yaptı ve setCount ($ ... length) ile de oldukça iyi çalışıyor. – Ralk

+0

@Ralk '.selector' özelliği teknik olarak dahili olarak evet. – Esailija

+1

@Esailija - Burada çalışmıyor: http://jsfiddle.net/nJeqf/ (.selector özelliği jQuery 1.7'de kullanımdan kaldırılmıştır). http://api.jquery.com/selector/ –

1

Ben de @Esailija çözüm sevdim, ama this.selector filtreli bazı hatalar var gibi görünüyor. Yani benim ihtiyaçlarına modifiye, belki de

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

Kod olan bu yüksek sürümlerinde süzülmüş anlık jQuery 1.7.2 `t testi yenileme içindi birisi

faydalı olacaktır çok güzel değil ama filtreli seçmenlerim için çalıştı.Eğer sadece bir kısmını kaldıracaktır remove() kullanırsanız

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

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

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

0

, şu anda bazı değişkene seçici değeri ile dize hatırlamak için iyidir DOM, ancak tüm çocuklar veya ilgili değil, eğer eleman üzerinde empty() kullanırsanız sorun gider.

ör .:

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

Belki birine yararlı olabilir!

0

atadığınızda jQuery .Seçici kullanımdan kaldırılmıştır