如何在函数或对象
中访问$ .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/
答案 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。