2015-07-13 42 views
2

我只是通过代码将在counterup.js,我碰到下面的代码行:理解为什么数据属性值都设置为null

  delete $this.data('counterup-nums'); 
      $this.data('counterup-nums', null); 
      $this.data('counterup-func', null); 

当然这个插件使用的数据存储属性值,它稍后用于计算。现在我的问题是,不是上面的代码行是什么,而是为什么上面的代码行呢?

确定的第一行代码:

delete $this.data('counterup-nums'); 

是否看得懂一点点,但什么是代码的下方线条可言

$this.data('counterup-nums', null); 
$this.data('counterup-func', null); 

在做什么?

+0

https://api.jquery.com/jQuery.removeData/ –

+2

我不认为'删除$ this.data('counterup-nums');'什么都做不了...... http:// jsfiddle .net/arunpjohny/qdwb5avx/2/ –

回答

3

这很有趣。但我通过编写如下示例代码研究了一些有趣的事实。

function hello(){ 
    var el = document.querySelector('#user'); 
    el.dataset.dateOfBirth = '1960-10-03'; 
} 


function undIt(){ 
var el = document.querySelector('#user'); 
el.dataset.dateOfBirth = undefined;  
} 

hello() 
alert(document.querySelector('#user').dataset.dateOfBirth) 

undIt() 
alert(document.querySelector('#user').dataset.dateOfBirth) 

delete document.querySelector('#user').dataset.dateOfBirth; 

的js提琴手链接http://jsfiddle.net/nirus/f92chmdp/1/

当我评论的删除声明我发现,该数据集变量在DOM树仍然存在(设置为未定义字符串)看到下面的图片enter image description here

当我取消评论删除声明我可以看到它已从DOM树中删除。查看该图像下面 ​​

结论:作者已经用delete关键字完全去除数据变量和它的持久性的参考。

---------------------------- *****根据用户的评论guest271314 ***** * ------------------

我做了一些研究,是的,是的,jQuery实现是不同的。因此,要实现上述的jQuery代码见下面。(作者应该已经实现了类似下面的代码)Jsfiddler

$(function(){ 
    function hello(){ 
     var el = $('#user'); 
     el.data('dateOfBirth','1960-10-03'); 
    } 


    function undIt(){ 
     var el = $('#user'); 
     el.data('dateOfBirth',null);  
    } 

    alert($('#user').data('dateOfBirth')) 

    hello() 
    alert($('#user').data('dateOfBirth')) 

    undIt() 
    alert($('#user').data('dateOfBirth')) 

    //delete document.querySelector('#user').dataset.dateOfBirth; 
    //delete $('#user').data('dateOfBirth'); 
    delete jQuery.cache.data.dateOfBirth; 

    alert($('#user').data('dateOfBirth')) //This line throws Error. Read Note: section 
}); 

的jQuery维护一个名为jQuery.cache缓存变量。数据,并在此引擎下存储键/值,以通过查询DOM并提取值来避免性能开销。如果你想用HTML5实现数据的jQuery的 API使用.Attr() API

注:在上面的代码值被删除,浏览器不能引用不确定最后一行抛出一个错误或null对象树中的对象引用。从技术上讲,变量和引用被删除。

+0

谢谢!将会通过你的代码,一旦我回家 –

+0

@Nirus注意,jQuery'.data()'https://api.jquery.com/data/不依赖于'HTMLElement.dataset' https://developer.mozilla .org/en-US/docs/Web/API/HTMLElement/dataset;两个独立的实现? – guest271314

+1

@ guest271314通过根据您的评论做更多的研究更新了答案。希望能帮助到你。 – Nirus

1

delete:删除操作从对象中删除属性。

我可能没有解释delete $this.data('counterup-nums');行正在做什么,但可能是作者想要用这行清除所有的东西。我相信这delete关键字与$this.data('counterup-nums')没有意义。代替这delete我会更喜欢Jquery.removeData()从元素中删除data属性。

但以下做一样的感觉:

$this.data('counterup-nums', null); 
$this.data('counterup-func', null); 

作者是设置数据属性null,这样下次他可以轻松地识别,值复位与否。

相关问题