2013-05-07 95 views
0

以某種方式獲取jquery data()函數通過ref返回一個對象。如何通過ref禁用jquery數據函數的返回值?

它是在JavaScript的方式指向對象他自己沒有修改裁判的對象?

這裏是我的問題的演示:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
<script> 
var c= console.log ; 
$(document).ready(function(e) { 
    var _data = $("#elem").data(); 
    var _xdata = _data ; // should be a miror object 
    console.log($("#elem").data()); 
    _xdata.id = "changes applied back to #elem.data object !!!" ; 
    console.log($("#elem").data()); 
    //any way to separate between $("#elem").data() and _xdata ?? 
}) ; 
</script> 
<div id="elem" data-id="1" data-foo="some data"></div> 

回答

1

這不是一個jQuery的問題 - 它的一個JavaScript之一。在將_xdata分配給_data時,實際上是將引用的值分配給_data對象(我知道這是一個令人困惑的接觸)。如果你想創建一個「鏡像對象」,你應該克隆它想:

var _xdata = jQuery.extend(true, {}, _data); 

編輯: 我總是太慢了這裏,但如果你正在尋找一個淺拷貝,你可以去搭配:

var _xdata = jQuery.extend({}, _data); 
+0

這不是JavaScript問題它的jQuery的嘗試沒有克隆只是通過引用獲取對象的對象: //應該是克隆對象\ n var _data = $(「#elem」)。data(); \ n _data.id =「將變更應用回#elem.data對象!!!」 ; \ n console.log($(「#elem」)。data()); – foxdanni 2013-05-07 21:10:27

+0

那麼如果你想操縱_data變量,你可以製作它的一個拷貝(不是整個元素,只是你從數據()中重新調用的對象),然後你會沒事的。 – 2013-05-07 21:16:06

+0

反正這解決了我的問題'變種_data \t = jQuery.extend({} $( 「#ELEM」)數據());' – foxdanni 2013-05-07 21:16:16

0

您可以使用jQuery的.clone()方法來克隆對象(和它的數據),而不是創建一個參考,你現在正在做的事情。

var _xdata = $("#elem").clone(true).data(); 

這樣,你可以操縱這個克隆的數據,而不會影響原來的。

+0

true!但克隆將克隆元素本身,並在我的項目中,它意味着克隆一個非常大的元素(與很多子元素,事件等)抱歉..這不是我優化的解決方案 – foxdanni 2013-05-07 21:07:45

0

另一件事是,從數據無論是在頁面加載存儲在內部的緩存值。 因此,當你編寫$("#something").data("whatever")時,它會從加載頁面的時間返回值,而不管數據是什麼 - 在那個特定時刻用html編寫的值。