Вопрос. Настройка динамического HTML с помощью Javascript для iFrames в Windows Mobile 6.1 - IE Mobile6

(извините, если это не тот форум для публикации - я не смог найти ничего, связанного с неродным программированием и относящимся к этой теме)

Я пытаюсь установить динамический HTML в iFrame на веб-странице. Я пробовал пару вещей, но ни одна из них не работает. Я могу читать innerHTML, но не могу его обновить.

// Able to read using 
document.getElementById('iFrameIdentifier').innerHTML;

// On Desktop IE, this code works 
document.getElementById('iFrameId').contentWindow.document.open();
document.getElementById('iFrameId').contentWindow.document.write(dynamicHTML);
document.getElementById('iFrameId').contentWindow.document.close();

В идеале должна работать та же функция, что и для div, но она говорит: «Объект не поддерживает этот метод или свойство».

Я также пробовал document.getElementById('iFrameId').document.body.innerHTML.

Очевидно, это заменяет весь HTML-код страницы, а не только innerHTML.

Я пробовал пару вещей, и они не работали

  • document.getElementById('iFrameId').body.innerHTML
  • документ.кадры[0].document.body.innerHTML

Моя цель состоит в том, чтобы иметь элемент контейнера, который может содержать установленный для него динамический HTML.

Я хорошо использовал его до сих пор, когда заметил, что настройка innerHTML в div занимает все больше времени из-за onClicks или других методов JS, которые прикреплены к якорям и изображениям в динамическом HTML. Появляются методы JS или HTML как-то не очищаются должным образом (утечка памяти?)

Также обсуждается - http://www.experts-exchange.com/Programming/Languages/Scripting/JavaScript/Q_26185526.html#a32779090


person Swaroop    schedule 18.05.2010    source источник


Ответы (2)


Я пробовал пару вещей, но ни одна из них не работает.

Добро пожаловать в IEMobile! Ничего из того, что вы знаете о сценариях DOM, здесь не применимо.

К сожалению, в IEMobile6-7 скрипты между iframe невозможны.

  • frameelement.contentDocument (стандартный метод DOM) недоступен
  • frameelement.contentWindow.document (версия обхода IE6-7) недоступна
  • массив Netscape window.frames старой школы работает только для фреймов, а не для iframe
  • если дочерний документ передает свой объект document объекту window.parent, работает только для фреймов, а не для фреймов. В iframe, window.parent===window.

Так что единственные пути вперед, которые я вижу, это:

  1. используйте фреймы вместо фреймов. Противный. Или же,
  2. используйте document.cookie для связи между родительским и дочерним документом: дочерний документ — это просто сценарий, который проверяет наличие определенного файла cookie в document.cookie на опроснике, и когда он обнаруживает, что это сообщение от родителя, и он может написать HTML или что-то еще. Медленно и противно. Или же,
  3. использование серверной стороны для вставки содержимого во фреймы, передавая его в качестве аргумента сценарию. Медленный, противный и потенциально небезопасный. Или же,
  4. полностью избегайте фреймов (лучше всего, если можете). Или же,
  5. отказаться от поддержки от IEMobile6-7 (лучше всего для сохранения здравомыслия, если вам это сойдет с рук!)

Появляются методы JS или HTML как-то не очищаются должным образом (утечка памяти?)

Да, возможно. IEMobile6-7(*) почти непригоден для динамического HTML. Это дает вам прекрасное представление о том, какими были сценарии для нас, бедных мерзавцев, во времена Netscape 4.

Старайтесь не создавать и не уничтожать множество узлов и обработчиков событий. Сохраняйте страницу как можно более статичной, повторно используя узлы элементов, где это возможно, и устанавливая свойства данных текстовых узлов вместо того, чтобы сносить все и создавать заново с помощью createElement или innerHTML. Используйте заглушку события (onclick="return this._onclick()") в HTML вместе с записью в _onclick, если вам нужно установить обработчики событий из JavaScript, а не воссоздавать HTML с новым обработчиком событий (или просто пытаться установить свойство, что, конечно, не я не работаю в IEMobile). По возможности избегайте длительных одиночных страниц.

Он по-прежнему будет падать, но, надеюсь, это займет больше времени.

*: то есть версии IE, присутствующие в WinMo до версии 6.1.4, где он стал бесконечно лучшим IEMobile8, продаваемым как «Internet Explorer Mobile 6» (спасибо, Microsoft).

person bobince    schedule 18.05.2010
comment
Можете ли вы объяснить это? Используйте заглушку события (onclick=return this._onclick()) в HTML вместе с записью в _onclick, если вам нужно установить обработчики событий из JavaScript, вместо воссоздания HTML с новым обработчиком событий (или просто пытаясь установить свойство, которое, конечно, не работает в IEMobile). Я точно не уверен, что вы просите меня изменить. У меня обычно есть теги привязки или изображения с атрибутом onClick. У меня также есть onChange() для элементов ввода, таких как текстовые поля и текстовые области и т. д. - person Swaroop; 19.05.2010
comment
Я говорю о том, что вы не можете написать свойства обработчика событий из JavaScript в IEMobile, то есть document.getElementById('x').onclick= somefunction. Единственный способ, которым вы можете прикрепиться к событиям click, — это использовать встроенный обработчик событий в HTML, например <a onclick="return somefunction();">. Обычно это ужасная практика, которой следует избегать, и это означает, что вы не можете изменить обработчик событий без воссоздания HTML (и, следовательно, утечки памяти). Использование атрибута-заглушки onclick, который просто перенаправляет свойство _onclick, которое вы можете написать из JavaScript, позволяет избежать этой проблемы. - person bobince; 19.05.2010
comment
Теперь я понимаю реализацию заглушки. Но я каждый раз заменяю весь HTML (динамический), а не только атрибуты onClick(). Мне нравится идея, что, используя заглушки, мы можем очистить реализации заглушек, очистив память, используемую реализациями JS, вроде отключения указателя, верно? Но одна из основных причин, по которой я придерживался динамического HTML на одной и той же странице, заключалась в том, чтобы каждый раз не перезагружать Javascripts. У меня есть реализации JS, загруженные один раз, а динамический HTML использует их много раз. - person Swaroop; 20.05.2010

Хорошо, я решил проблемы, с которыми сталкивался ранее, и более серьезную проблему, связанную с установкой HTML в iFrame на IEMobile. Но у меня все еще есть еще один PIA, связанный с двойными полосами прокрутки, который я сейчас изучаю. Кажется, есть еще бедняги, сталкивающиеся с подобной проблемой - если я и это исправлю. Я опубликую обновление здесь.

Как я, наконец, написал в iFrame на IEMobile? У меня есть 2 div, один для переноса iFrame, а другой для записи внутри iFrame.

document.getElementById('OuterDiv').innerHTML = '';
document.getElementById('OuterDiv').innerHTML = '<iframe id="iFrameId" src="somefile.html"></iframe>';

Это создает iFrame каждый раз, а в somefile.html при загрузке есть InnerDiv.innerHTML, который, похоже, не пропускает память.

В somefile.html будет метод onLoad, который будет извлекать HTML (ниже поясняется, как мне удалось его получить) и выполнять

document.getElementById('InnerDiv').innerHTML = dynamicHTML;

Как мне удалось передать HTML между родительским и дочерним iFrame Как уже объяснял @bobince ранее, нужно полагаться на сторонние службы, такие как файлы cookie или сервер, для передачи данных между родительским и дочерний iFrame.

Фактически я использовал ActiveXControl для установки и получения данных из javascript родительского и дочернего iFrame соответственно. Я не рекомендую делать это, если вам нужно ввести элемент управления ActiveX только для этого. У меня случайно уже есть тот, который я использую для получения динамического HTML в первую очередь.

Если вам нужна помощь, вы можете написать мне в DM - Twitter @Swaroop

Спасибо @bobince за вашу помощь. Я отмечаю это как ответ, потому что в нем говорится, что я сделал, чтобы решить проблему.

person Swaroop    schedule 20.05.2010