我需要提供包含Javascript的XHTML页面。我的问题是Firefox(3.5.7)似乎忽略了Javascript。例如:
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My Title</title>
</head>
<body>
<script type="text/javascript">
document.write("Hello world!");
</script>
</body>
</html>
如果我将其保存为test.html
,则Firefox会正确显示。如果我将其保存为test.xml
,则Firefox会显示空白页面。我在这里做错了什么?
答案 0 :(得分:7)
来自http://www.w3.org/MarkUp/2004/xhtml-faq#docwrite
document.write是否适用于XHTML?
没有。由于XML的定义方式,不可能做这样的技巧,其中标记是通过脚本生成的,而解析器仍在解析标记。
您仍然可以实现相同的效果,但您必须使用DOM来添加和删除元素。
答案 1 :(得分:2)
document.write
不起作用,但设置innerHTML
仍然有效。请记住,无论你在那里设置什么,都必须有良好的形式。
这意味着您可以使用jQuery将新元素/集合html添加到任何元素。
我有一个用于此的小型库。它工作得很好。
function IsXHTML() {
if (document.doctype == null)
return false;
var vPublic = document.doctype.publicId.replace(/^.*(.html).*$/i, '$1').toLowerCase();
var vSystem = document.doctype.systemId.replace(/^.*(.html).*$/i, '$1').toLowerCase();
return (vPublic == 'xhtml')
&& (vSystem == 'xhtml');
};
function XHTMLDocWrite($Str, $Element) {
if ($Str == null)
return;
var vIsMozilla = !window.opera && !/Apple/.test(navigator.vendor);
var vIsOpera = window.opera;
// Make sure &s are formatted properly
if (!vIsOpera)
$Str = $Str.replace(/&(?![#a-z0-9]+;)/g, "&");
else $Str = $Str.replace(/&(?![#a-z0-9]+;)/g, "&");
// - Mozilla assumes that everything in XHTML, innerHTML is actually XHTML
// - Opera and Safari assume that it's XML
if ( !vIsMozilla )
$Str = $Str.replace(/(<[a-z]+)/g, "$1 xmlns='http://www.w3.org/1999/xhtml'");
// The HTML needs to be within a XHTML element
var vDiv = document.createElementNS("http://www.w3.org/1999/xhtml","div");
vDiv.innerHTML = $Str;
if ($Element == null) {
// Find the last element in the document
var vLastElmt = document.getElementsByTagName("*");
vLastElmt = vLastElmt[vLastElmt.length - 1];
$Element = vLastElmt;
}
// Add all the nodes in that position
var vNodes = vDiv.childNodes;
while (vNodes.length)
$Element.parentNode.appendChild( vNodes[0] );
};
function UseXHTMLDocWrite($IsForced) {
if (!IsXHTML() && !$IsForced)
return;
if (document.write == XHTMLDocWrite)
return;
document.write = XHTMLDocWrite;
};
您运行UseXHTMLDocWrite
,以便在需要时document.write
替换为XHTMLDocWrite
。
这只会将内容添加到最后添加的元素中。但是,它不适用于嵌套元素。
注意:我从我从互联网上的某些地方获得的代码修改XHTMLDocWrite
的代码,似乎无法再找到它。对不起,我不能相信他。
希望这有帮助。