2010-05-24 54 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相關的數據都將返回未定義狀態。