2012-07-31 80 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

相关问题