Поддерживает ли Firefox Javascript на страницах XHTML? - PullRequest
2 голосов
/ 11 февраля 2010

Мне нужно обслуживать страницы XHTML, которые включают Javascript. Моя проблема в том, что 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 ]

7 голосов
/ 11 февраля 2010

С http://www.w3.org/MarkUp/2004/xhtml-faq#docwrite

Работает ли document.write в XHTML?

Нет. Из-за способа определения XML невозможно выполнить подобные трюки, когда разметка генерируется скриптами, пока синтаксический анализатор все еще анализирует разметку.

Вы все еще можете достичь тех же эффектов, но вы должны сделать это, используя DOM для добавления и удаления элементов.

2 голосов
/ 11 февраля 2010

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 из кода, который я получил из Интернета, и, похоже, больше не могу его найти. Извините, я не могу поверить ему.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...