2013-12-26 4 views
1

Я использую встроенный браузер XSLT для генерации HTML, <script>. В этом случае Firefox, по-видимому, ведет себя странно.Почему вставленные XSLT скрипты ведут себя как асинхронные в Firefox?

The files below can be obtained and tried from there. (Откройте doc.xml и посмотрите сообщения журнала в консоли.)

Ниже приведена таблица стилей XSLT для тестирования. Источник XML doc.xml - это просто <?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?><doc/>. Преобразование создает как встроенный и внешний скрипт:

<html xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="1.0"> 
    <head> 
    <title>Firefox and XSLT inserted scripts</title> 
    </head> 
    <body> 
    <script type="text/javascript" src="script.js"></script> 
    <script type="text/javascript"> 
     console.log('inline, asynchronous? '+ document.currentScript.async); 
     // -> "inline, asynchronous? false" 
     // alert('inline, pause'); 
     function errorHandler(img) { 
      img.src = 'http://people.mozilla.com/~faaborg/files/shiretoko/firefoxIcon/firefox-32-noshadow.png'; 
     } 
     try { 
      document.write("<p>Inserted</p>"); 
     } catch(e) { 
      console.error(e.name + ": " + e.message); 
      // -> "InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable" 
     } 
    </script> 
    <p><img src="about:blank" onError="window.errorHandler?errorHandler(this):console.log('Too late for handling error!')"/></p> 
    </body> 
</html> 

внешний скрипт script.js почти так же, как один рядный:

console.log('external, asynchronous? '+document.currentScript.async); 
// -> "external, asynchronous? false" 
// alert('external, pause'); 
try { 
    document.write("<p>Inserted</p>"); 
} catch(e) { 
    console.error(e.name + ": " + e.message); 
    // -> "InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable" 
} 

консоли отображается:

19:21:14.435 "Too late for handling error!"    index.xml:1 
19:21:14.477 "external, asynchronous? false"   script.js:1 
19:21:14.478 "InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable" 
                 script.js:7 
19:21:14.479 "inline, asynchronous? false"    index.xml:1 
19:21:14.480 "InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable" 
                 index.xml:10 
  1. Сначала скрипты кажутся синхронными, так как async является ложным.
  2. Но на самом деле они делают behave асинхронно!
    • Нельзя использовать document.write.
    • Обратные вызовы (errorHandler() в моем примере) не доступны сразу.

ли кто-нибудь имеет понятия о том, что здесь происходит?

+0

Ваша таблица стилей XSLT не является хорошо сформированным XML-документом. Однако не могли бы вы указать, как загрузить страницу? Думаю, вы создали XML-документ с инструкцией прецессии «xml-stylesheet», правильно? Загружаете ли вы этот файл через URL-адрес 'file:'? Что это за имя? –

+0

Думаю, вам нужно правильно отформатировать его (используйте обратную сторону '). Однако не могли бы вы ответить на другие вопросы? Вы также можете отредактировать вопрос, если писать слишком много. –

+0

Я попытался выполнить эту таблицу стилей как из файловой системы ('файл:'), так и с веб-сервера ('http:'). Те же результаты. –

ответ

3

Реализация процессора XSLT от Mozilla создает дерево результатов и визуализирует это напрямую, поэтому использование document.write не поддерживается, см. https://developer.mozilla.org/en/docs/XSL_Transformations_in_Mozilla_FAQ#What_about_document.write.3F. Другие реализации XSLT на стороне клиента могут передавать результат сериализованного преобразования его парсера HTML, в этом случае document.write работает.

Если вы хотите выводить материал своими скриптами внутри XSLT, вам необходимо использовать методы DOM для создания узлов и их вставки. См. Пример http://home.arcor.de/martin.honnen/xslt/test2013122801.xml.

+0

Это объясняет ошибку с помощью 'document.write'. Но остается загадкой о порядке исполнения. Обработчик 'onerror' в основном запускается до выполнения'

Смежные вопросы