Я использую встроенный браузер 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
- Сначала скрипты кажутся синхронными, так как
async
является ложным. - Но на самом деле они делают behave асинхронно!
- Нельзя использовать
document.write
. - Обратные вызовы (
errorHandler()
в моем примере) не доступны сразу.
- Нельзя использовать
ли кто-нибудь имеет понятия о том, что здесь происходит?
Ваша таблица стилей XSLT не является хорошо сформированным XML-документом. Однако не могли бы вы указать, как загрузить страницу? Думаю, вы создали XML-документ с инструкцией прецессии «xml-stylesheet», правильно? Загружаете ли вы этот файл через URL-адрес 'file:'? Что это за имя? –
Думаю, вам нужно правильно отформатировать его (используйте обратную сторону '). Однако не могли бы вы ответить на другие вопросы? Вы также можете отредактировать вопрос, если писать слишком много. –
Я попытался выполнить эту таблицу стилей как из файловой системы ('файл:'), так и с веб-сервера ('http:'). Те же результаты. –