2015-02-09 82 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