1

Тема: WSH: htmlfile невозможно назначить свойство innerHTML

Обнаружил неприятную вещь.

var htmlfile = new ActiveXObject('htmlfile');

var window = htmlfile.parentWindow;
var document = window.document;

var tag = document.createElement('textarea');
tag.innerHTML = 'непустая строка'

При выполнении скрипта выпадает ошибка в строке назначения innerHTML.

htmlfile: Catastrophic failure

Все скрипты (JS, VBS) валятся с такой ошибкой при назначении свойства tag.innerHTML. В примерах создается тег TEXTAREA, но это не имеет значения. Не работает для ВСЕХ блочных и строчных тегов. Тем не менее, в браузерах присваивание свойству innerHTML работает нормально, без проблем (см. второй пример)

var tag = document.createElement('textarea');
tag.innerHTML = 'непустая строка'

У меня вопрос - это известный баг или особенность объекта htmlfile? Или с подобным никто не сталкивался?

( 2 * b ) || ! ( 2 * b )

2

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Ога...   попробовал Win7 x64 IE9_Beta - Неопознанная ошибка
т.е. стабильно неработающий код...

Времени не хватает... :-(

3

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Option Explicit
Dim document, DIVelement
Set document = CreateObject("htmlfile")
document.open
document.close

Set DIVelement = document.CreateElement("div")

DIVelement.innerHtml = "<b>sss</b>"

msgbox DIVelement.innerHtml

Да вроде бы всё норм работает, если документ инициализирован.

document.open
document.close

Просто в браузере это уже происходит автоматом, а в нашем случае нужно делать это принудительно.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

4

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Спасибо! Действительно, документ надо инициализировать.

( 2 * b ) || ! ( 2 * b )

5

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Xameleon, Rumata, на моей памяти это уже третий раз (я сам как-то спрашивал, зачем сие «document.open/document.close» нужно). Может это как-то оформить в Коллекцию?

6

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Эт как скажете. ) Я за.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

7

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Я тоже - за. Но сказав о document.open надо сказать и о его недостатках. А они есть, однако.

( 2 * b ) || ! ( 2 * b )

8

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Например ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

9 (изменено: Rumata, 2010-12-25 20:09:49)

Re: WSH: htmlfile невозможно назначить свойство innerHTML

document.open затирает текущий поток. Вот простой пример:

<html>
<head>
<script>

winodw.onload = function()
{
    document.open();
    document.write('FAIL!');
    document.close();
}

</script>
</head>
<body>
<h1>Текст, который никто не увидит</h1>
</body>
</html>
( 2 * b ) || ! ( 2 * b )

10

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Разве это неудобство ? На мой взгляд это вполне правильное поведение. И ни кто не запрещает вызывать document.write не в window.onload а до загрузки. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Да. Но в этом случае текущий документ затирается и создается новое DOM-дерево.

( 2 * b ) || ! ( 2 * b )

12

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Rumata пишет:

Да. Но в этом случае текущий документ затирается и создается новое DOM-дерево.

Ну и чем же это плохо то ?

<html>
    <head>
    </head>
    <body>
        <script>
            document.write('aaaaaaa');
        </script>
        <h1>Текст, который никто не увидит</h1>
    </body>
</html>

Пока что не вижу ни единой причины для переживания.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

13

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Действительно, в случае вызова document.open без параметров (используются значения по умолчанию "text/html", "replace" ) затирается текущее дерево и создается новое, которое заполняется в последующем методом document.write. В этом и есть предназначение open. Описание метода тут.

Только причем тут недостатки, я не понял. Если есть какие-то вопросы, может рассмотрим?

14

Re: WSH: htmlfile невозможно назначить свойство innerHTML

Главное, чтобы итог в Коллекцию попал . Можно прямо здесь сделать предварительное сообщение, и здесь же обсудить его.

15

Re: WSH: htmlfile невозможно назначить свойство innerHTML

JSman пишет:

... затирается текущее дерево и создается новое...

Вот об этом я и вел речь. Давайте оставим это. Где-то в памяти застряла мысль, что этот метод устаревший и не рекомендован к использованию. Есть вероятность, что я что-то с чем-то путаю. В данном случае необходимо явное открытие документа, чтобы можно было работать с DOM. И в этом его непременная польза и необходимость.

( 2 * b ) || ! ( 2 * b )

16

Re: WSH: htmlfile невозможно назначить свойство innerHTML

На самом деле в документации не все описано относительно работы метода open.

Вроде бы должен перегружаться документ (вроде как набор nodes). Но думать, что документ равносилен дереву элементов, неправильно. Узлы действительно исчезают, однако появляются следующие вопросы:

1. Сохранятся ли переменные в window после применения document.open?

var a = 1;

window.onload = function test()
{
document.open("html/text", "replace");
document.write(1);
document.write(2);
document.close();
alert([window.a, window.test]);
}

Ответ: Да. Таким образом documentElement будет заново инициализирован, но объекты JS будут сидеть в памяти.

2. Элементы «в воздухе», созданные createElement, можно ли потом прилепить к новому дереву?

var element = document.createElement("span");
element.innerHTML = "Spartaaaa!!";
window.onload = function ()
{
document.open("html/text", "replace");
document.write(1);
document.write(2);
document.close();

alert(typeof element);
alert(element.tagName);
document.body.appendChild(element);

Ответ: Нет. При этом будет известно, что мы имеем дело с объектом. Но получить доступ к нему не удастся: разрешение отклонено. Вроде бы на первый взгляд кажется, что элементы, созданные createElement должны быть автономными (как экземпляры класса), однако это не так. Они жестко привязаны к документу. Таким образом документ — это уже не просто иерархия нодов, начиная от рута, но и «висячие в воздухе» элементы.

3. Восстановятся ли перегруженные встроенные функции языка JScript после применения метода open?

window.onload = function ()
{
window.setInterval  = function (){return};
alert(window.setInterval);

document.open("html/text", "replace");
document.write(1);
document.write(2);
document.close();

alert(window.setInterval);

Ответ: Да. Таким образом в понятие «документ» добавятся набор встроенных функций языка.