2009-08-25 128 views
0

我在這裏得到了一個非常有趣的東西。奇怪的javascript

<html> 
<head> 
<script language="Javascript"> 
    var str="me&myhtml"; 
    function delimit(){ 
     document.write(str); 
     document.write("<hr>"); 

    } 
</script> 
</head> 
<body onload="delimit()"> 
</body> 
</html> 

你看到'me & myhtml'下面有一行。但是,如果您評論//document.write(「<hr>」); 然後你只看到'我',這很奇怪。

事情是,JavaScript的通常不讀「&」,而是解釋爲命令。但是,如果有任何document.write()的與至少6個字符,或者「BR」,或「小時」,則它會顯示「&」,因爲它是。

任何想法?

+2

除非您真的要替換頁面上的所有內容,否則不應在body onload事件之後使用document.write。 – epascarello 2009-08-25 17:42:13

回答

0

,可能還存在的事實,&基本上是HTML的轉義字符的事情。如果你想寫出一個符號的頁面,你應該使用&amp;

+0

不,我可以在我的頁面上看到'&',沒有使用'&'的問題。 我只是想知道爲什麼會發生這種情況。 – rishi 2009-08-25 14:08:46

9

如果沒有HTML標記之後&myhtml的JavaScript或HTML渲染引擎可能將它解釋爲一個無法識別或不完整的實體(缺少結束;)和不呈現它。如果你遵循me&myhtml與HTML標籤,然後的JavaScript或HTML渲染引擎識別&myhtml不是一個不完整的實體,因爲它後面是一個HTML標籤,而不是;

無論您使用的字符串是什麼HTML標籤,<a><p>都可以和<br>一樣正常工作。

該行爲在所有瀏覽器中都不一致。 IE 6,7 & 8和Firefox 2,3 & 3.5按照您描述的方式運行,Safari for Windows 3 & 4當您註釋掉第二個document.write()或執行類似document.write("abc");的操作時,不會顯示任何內容。 Opera 9.64 & 10b3無論第二個write()的內容如何都正確地呈現文本。

注意的是,在onload事件中使用document.write()沒有寫出格式正確,有效的HTML(完整的文檔類型和<html><head>等)可能是一個錯誤呢。請注意,如果你做的問題沒有顯現出來:

<html> 
<head> 
<script> 
function delimit() { 
    document.write('me&myhtml'); 
} 
</script> 
</head> 
<body> 
<script> 
delimit(); 
</script> 
</body> 
</html> 

要回答你的問題,這是在任何一個規範的實施,或每個瀏覽器實現了不同規格的不確定部分的錯誤。你所做的是稍微不正確的,這個稍微不正確的代碼的結果是沒有定義的,並且不能依賴於在當今使用的所有主流瀏覽器中保持一致。應該避免你在做什麼。

+1

非常好的答案 – Steven 2009-08-25 14:35:57

+0

我認爲這個問題更多的是原始問題。我知道,Firefox可以補償未封閉的標籤和其他小型語義事物。當在行後面打印


時,它似乎將&html註冊爲字符串文字,而不是試圖將其解釋爲編碼實體(如&) – idrumgood 2009-08-25 14:37:57

+0

感謝您的好澄清。 – rishi 2009-08-26 05:19:24

1

我只是想知道爲什麼會這樣。

好了,瀏覽器還不知道你的& MYHTML是否是你還沒有寫完,又或只是斷碼將不得不修復了一個實體引用。例如,你可以說:

document.write('&eac'); 
document.write('ute;'); 

(當然也有像&myhtmlpotato沒有實體引用,那你可能會被提及,但是解析器不知道呢。)

如果讓解析器知道沒有更多的實體引用即將到來,通過文檔寫入一些不可能存在於實體引用(如< tag>或空格)中的東西,它會放棄並決定代碼被破壞,並修復它。

通常情況下,頁面的結尾將會發生這種情況,但是頁面沒有結束,因爲腳本沒有按照您的想法行事。

而不是在原始頁面加載過程中調用document.write(),當它可以寫入一些內容到當前頁面時,您將在onload中調用它,屆時文檔將完全加載,再加上它。在這種狀態下,調用document.write()實際上會隱式地調用document.open(),銷燬當前頁面並啓動一個新頁面,然後將其寫入'my & myhtml'。您打開的新頁面保持打開狀態並且不會完全加載,直到您調用document.close()告訴它您不會再寫入它爲止。此時,您的部分實體引用將被解析爲不良標記並被修復。

+0

很好的答案。當然,命名字符引用的列表是固定的,瀏覽器可以告訴他們沒有一個啓動&myhtml ...因此它已經有足夠的信息來知道它是壞標記,不消耗字符,發出&符號並按正常處理myhtml文本。這可能是Opera正在做的事情。 – Alohci 2009-08-25 21:12:18