2015-02-09 130 views
0

我試着去修改從$產生的對象(「#SOME_ID」),並且一切似乎工作正常,但是當我問回我的修改對象時,它根本沒有變化。是否有可能修改jQuery對象和檢索所修改的對象

$('#log_container').log 
undefined 
$('#log_container').log = {} 
Object {} 
$('#log_container').log 
undefined 

爲什麼$('#log_container').logundefined什麼,而不是我明確地前行分配?

回答

1

因爲jQuery('some-selector')返回一個新對象,每一次它被調用:

function whatHappens(selector) { 
    return { 
    magic: 'here' 
    } 
} 

whatHappens('when').log // undefined 
var result = whatHappens('when'); 
result.log = {}; 
var result2 = whatHappens('when'); 
result === result2 // false 
result.log // {} 
result2.log // undefined 

如果你需要一些數據始終可用的對象,你可以在:

  • 使用data方法設置DOM節點上的數據:

    $('#log_container').data('log', {}); 
    $('#log_container').data('log'); 
    
  • 存儲參考了jQuery集合:

    var $logContainer = $('#log_container'); 
    $logContainer.log = {}; 
    $logContainer.log; // {} 
    
  • 更新返回的jQuery集合的[[Prototype]]jQuery.prototype,通常稱爲由它的別名,jQuery.fn)添加數據/方法(這使得提供給所有數據 jQuery的收藏,過去,現在和將來):

    jQuery.fn.log = function yourLoggingMethod() { 
        // Available on all jQuery collections now 
        // Shared state - don't put things like {} or [] 
        // on here unless you intend to have a mutable "global". 
    }; 
    

    然後,你可以創建集合正常:

    var $logContainer = $('#log_container'); 
    $logContainer.log // function yourLoggingMethod 
    
0

每次運行$('#log_container')時,它都會創建一個新的jQuery對象。

如果你想專門修改某些原因的jQuery(你可能不應該,還有很多更好的選擇),將其分配給一個變量;然後修改並使用該變量;

var test = $('#log_container'); 
test.log = {}; 
console.log(test.log); 
+0

這是一個半答案:「有很多更好的選擇」。請提供幾個例子,以及爲什麼你認爲他們更好。 – ktamlyn 2015-02-09 19:00:44