2010-05-24 53 views
2

如何访问)由$。数据(设定值的函数内部或对象

 $('#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/

+0

你在哪里叫blah()? – derek 2010-05-24 00:34:46

+0

对不起,更正了代码 – John 2010-05-24 01:01:44

回答

3

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

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

编辑:

找到有关document.write这个计算器的问题:

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

从该职位的答案一个一个有趣的一句话:

只要你不在文件加载后尝试使用它,document.write本身并不是邪恶的,以我的愚见来看。

因此,这可能是麻烦(或其中的一部分)的关键。

+0

在我的实际代码中,我没有使用document.write,而是试图将值赋给一个对象。然而,我的问题已经足够正确地处理代码的加载顺序 – John 2010-05-24 01:21:49

1

问题在于“document.write()”。尽量避免它。

1

在这种情况下,我相信你的document.write以一种奇怪的方式跺脚DOM,消灭你的定时器div。切换两个文件撰写的呼吁,而不是提醒电话(和添加一行来调用胡说())让我看到了两个警告框,均显示值100

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

JS代码:

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

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

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

blah(); 
1

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

下面是来自HTML5 specs上文件撰写相关文字:

除非从脚本元素的机构,称为在文档被解析,或者叫上一个脚本创建的文档,则调用此方法将清除第一个当前页面,就好像document.open()被调用一样。

下面介绍如何在浏览器上我的Mac表现给出这个code:共

Chrome和Safari
抹了文件。即使100不打印。文本节点本身在这里被忽略,但是当包装在一些html标签中时 - 它们显示出来了。 This code与上面相同,其值分别包含在 <b><i>标签中。

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

但是,它打印“100”的第一次你叫document.write在Opera和Firefox

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

因为函数参数$('#timers').data('firsttimer')首先计算,并且由于原始文件是在这一点上完整,我们得到值100,然后传递给document.write,然后重新创建整个文档。因此,所有后续调用取回与#timers相关的数据都将返回未定义状态。