2012-07-31 77 views
1

我想用一個jsFiddle例子來回答用戶的問題。該示例是通過Javascript動態初始化iframe元素。由iframe顯示的內容是分配給變量的有效html文檔。這裏的變量賦值:jsFiddle中的JavaScript變量可以包含HTML腳本標記嗎?

var aValidDoc = '<!DOCTYPE html PUBLIC 
\"-//W3C//DTD XHTML 1.0 
Transitional//EN\" 
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"> 
<html 
xmlns=\"http://www.w3.org/1999/xhtml\"> 
<head><title></title><style 
type=\"text/css\">@media 
screen{html,body{margin:0;padding:0;height:100%;width:100%}p{margin:15px;}}</style> 
</head><body><p>This is the content of 
the dynmic document.</p><body></html>'; 

這裏是我想要做的一個片段:

</p><script type=\"text/javascript\">alert(\"Hi\")</script><body></html>'; 

事實上,即使評論與<script>斷接口:

// below line breaks jsFiddle 
// <script type="text//javascript"></script> 

這裏的小提琴:jsFiddle example

有沒有辦法寫變量分配包括script標籤,以免破壞jsFiddle接口?

回答

4

從字面上寫</script>任何地方你的內聯JavaScript將打破包含HTML標記。

一個簡單的解決辦法是改寫"<\/script>"。因爲它是一個字符串字母,反斜槓被刪除,你會得到"</script>"

http://jsfiddle.net/KavDy/2/

+0

謝謝。有趣的是,代碼第一次運行得很好。當我第二次運行它時,IE抱怨跨站腳本。 (所以SO不允許我接受你的答案,我會回來的。) – Karl 2012-07-31 22:23:25

+0

@Karl LOL這是一個有趣的IE怪癖。但是,刷新頁面可以完全起作用。 – Esailija 2012-07-31 22:26:56

+0

請注意,這個'問題'不是特定於JSFiddle的。此行爲是HTML標準的一部分。 – Phrogz 2012-07-31 22:37:48

0

jsFiddle將腳本放入cdata-section

<head> 
    ... 
    <script type='text/javascript'>//<![CDATA[ 

    var aValidDoc = '...<script>...</script>...'; 

    // also in comments: 
    // <script type="text//javascript"></script> 

    //]]> 
    </script> 
</head> 

然而,他們以content-type服務於他們的文檔text/html,所以cdata將不會被正確解析,因爲XHTML和關閉</script>標記會破壞所有內容。

通過XHTML代理獲取文檔應該可行,但這不行。因此,您需要將其轉義,例如插入反斜槓或'+'(文字串聯)。

+0

'<!DOCTYPE html>'也被使用。我不認爲他們需要XHTML(誰呢?) – Esailija 2012-07-31 22:36:20

+0

爲什麼你會使用CDATA標籤?順便說一句:doctype似乎在[XHTML5](http://blog.whatwg.org/xhtml5-in-a-nutshell)中是有效的 – Bergi 2012-07-31 22:41:21

+0

爲什麼每個人都在'text/html'使用''?無知我猜。將不得不問這個jsfiddle創建者。 :P – Esailija 2012-07-31 22:43:21

相關問題