2012-08-08 33 views
28

我昨天跑了一個jquery選擇器,我分配給一個變量的問題,這讓我很生氣。如何刷新存儲和快照的jquery選擇器變量

這裏是一個測試用例的jsfiddle:

  • 的.elem分配給我的OBJ VAR
  • 日誌都長到控制檯。結果=> 4
  • 刪除#3從DOM
  • 日誌OBJ到控制檯=>除去的#3是仍然存在,長度仍然是4. 我想通了jquery的查詢快照?到變量,不能?不會?被
  • 日誌.elem更新到控制檯..是的結果=> 3,#3不見了
  • 現在我有300
  • 記錄的新寬度更新.elem OBJ & obj.width給我300所以快照已更新?有趣的是,4個div中的3個具有新的寬度,但是刪除的#3不是...

另一個測試:向domtree添加li元素並記錄obj和.elem。 .elem確實有新的Li和OBJ不會的,因爲它仍然是舊的快照

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

有沒有辦法來更新這個新內容OBJ? 我不想做一個新的obj,因爲在我的應用程序中有很多信息保存在那個對象中,我不想銷燬...

回答

56

是的,這是一個快照。此外,從頁面DOM樹中移除一個元素並不奇怪會消除對元素的所有引用。

可以刷新它像這樣:

var a = $(".elem"); 

a = $(a.selector); 

小插件:

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

var a = $(".elem"); 

a = a.refresh(); 

這種簡單的解決方案並不複雜的遍歷工作,雖然。您將不得不爲.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

感謝您的幫助和解釋!它通過.selector調用非常有效。這是一個jQuery內部方法?找不到該電話的任何文件。無論如何..我改變了一下我的代碼,併爲這個計數做了一個新的setter,並用setCount($ ... length)來調用它,這也很好用。 – Ralk 2012-08-09 16:29:13

+0

@Ralk'.selector'屬性在技術上是內部的。 – Esailija 2012-08-09 16:58:47

+1

@Esailija - 這裏不起作用:http://jsfiddle.net/nJeqf/(.selector屬性在jQuery 1.7中被棄用)。 http://api.jquery.com/selector/ – 2013-06-23 22:11:57

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已被棄用,這是更好的那一刻到remeber字符串選擇值的一些變量當你將

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

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

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

0

如果使用remove()它只會移除的部分DOM但不是所有的孩子或相關的,相反,如果你使用元素empty()問題已經消失。

例如爲:

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

也許它可以是有用的人!