Firefox是否支持XHTML页面中的Javascript?

时间:2010-02-11 10:36:33

标签: javascript xml firefox xhtml

我需要提供包含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会显示空白页面。我在这里做错了什么?

2 个答案:

答案 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, "&amp;");
    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的代码,似乎无法再找到它。对不起,我不能相信他。

希望这有帮助。