访问$('selector')。函数/对象中的数据

时间:2010-05-24 00:27:54

标签: javascript jquery

如何在函数或对象

中访问$ .data()设置的值
       $('#timers').data('firsttimer', 100);


    //prints 100
    document.write($('#timers').data('firsttimer'));

    function blah(){
        //Prints nothing
        document.write($('#timers').data('firsttimer'));
    }

blah();

查看此jsfiddle以便于访问以测试代码http://jsfiddle.net/JUfd8/

4 个答案:

答案 0 :(得分:3)

由于某些原因,我在函数调用中遇到document.write()问题,但如果我使用jQuery的.append(),它会正常工作。

function blah(){
    $('body').append($('#timers').data('firsttimer'));
};

修改

发现此关于document.write的stackoverflow问题:

Why is document.write considered a "bad practice"?

该帖子中其中一个答案的有趣句子:

只要您在文档加载后没有尝试使用它,document.write本身并不是邪恶的,我认为。

因此,这可能是解决问题的关键(或者其中的一部分)。

答案 1 :(得分:1)

麻烦在于“document.write()”。尽量避免它。

答案 2 :(得分:1)

在这种情况下,我相信你的document.write会以某种奇怪的方式踩踏DOM,消灭你的定时器div。将document.write调用转换为警报调用(并添加一行以调用blah())允许我看到两个警告框,两者都显示值100。

<div id="timers"></div>

js code:

$('#timers').data('firsttimer', 100);

//shows 100
alert($('#timers').data('firsttimer'));

function blah(){
  //Prints nothing
  alert($('#timers').data('firsttimer'));
}

blah();

答案 3 :(得分:1)

所有浏览器的行为都不一致。请记住,在jsfiddle上,由于您在左侧选择了onLoad设置,因此该代码已经包含在窗口加载回调中。加载DOM后,使用document.write进行的任何后续更改都将替换整个文档。

以下是document.write上的HTML5 specs的相关文字:

除非在解析文档时调用脚本元素的主体,或者在脚本创建的文档上调用,否则调用此方法将首先清除当前页面,就像调用了document.open()一样。 / BLOCKQUOTE>

根据code

,以下是浏览器在我的Mac上的行为方式

Chrome和Safari
完全擦除文档。甚至100不打印。文本节点本身在这里被忽略,但是当包含在一些html标签内时 - 它们会出现。 This code与上述内容相同,值分别包含在<b><i>标记内。

Opera和Firefox
擦除文档,然后附加文本节点“100undefined”。它打印“未定义”,因为新文档中的节点<div id="timers></div>不再存在。

但是,在Opera和Firefox上调用document.write 第一次打印“100”

document.write($('#timers').data('firsttimer'));

因为首先计算函数参数$('#timers').data('firsttimer'),并且由于此时原始文档是完整的,我们得到值100,然后传递给document.write,然后重新创建整个文档。因此,所有后续调用以获取与#timers关联的数据都将返回undefined。