Quirksmode имел сообщение на этом .
, Так как страница теперь повреждается, и только доступная с помощью archive.org, я воспроизвел ее здесь:
IFrames
На этой странице я даю краткий обзор доступа iframes от страницы they’re на. Не удивительно, существуют некоторые соображения браузера.
iframe является встроенной рамкой, кадр, который, в то время как содержащий абсолютно отдельную страницу с ее собственным URL, тем не менее, помещается в другой странице HTML. Это дает очень хорошие возможности в веб-дизайне. Проблема состоит в том, чтобы получить доступ к iframe, например, для загрузки новой страницы в него. Эта страница объясняет, как сделать это.
Кадр или объект?
фундаментальный вопрос состоит в том, рассматривается ли iframe как кадр или как объект.
top.frames[1].frames[2]
и такой). iframe вписывается в эту иерархию кадра? document.getElementById('theiframe'))
для доступа к нему. В общих браузерах позволяют оба представления о 'реальном' (трудно кодированном) iframes, но к сгенерированному iframes нельзя получить доступ как кадры. атрибут ИМЕНИ
самое важное правило состоит в том, чтобы дать любой iframe, который Вы создаете name
атрибут, даже если Вы также используете id
.
Большинству браузеров нужно эти name
атрибут для создания iframe части иерархии кадра. Некоторым браузерам (особенно Mozilla) нужно id
для создания iframe доступного как объекта. Путем присвоения обоих атрибутов iframe Вы не торопитесь с решением. Но name
намного более важно, чем id
.
Доступ
Или Вы получаете доступ к iframe как к объекту и изменяете src
, или Вы получаете доступ к iframe как к кадру и изменяете location.href
.
document.getElementById ('iframe_id') .src = 'newpage.html'; кадры ['iframe_name'] .location.href = 'newpage.html'; синтаксис кадра немного предпочтителен, потому что Opera 6 поддерживает его, но не объектный синтаксис.
Доступ к iframe
Так для полного cross†“опыт браузера необходимо дать iframe имя и использовать
frames['testiframe'].location.href
синтаксис. Насколько я знаю, что это всегда работает.
Доступ к документу
, Получающему доступ к документу в iframe, довольно прост, если Вы используете эти name
атрибут. Для подсчета количества ссылок в документе в iframe сделайте frames['testiframe'].document.links.length
.
в Сгенерированный iframes
при генерации iframe через W3C DOM iframe сразу не вводят эти frames
массив, тем не менее, и frames['testiframe'].location.href
, синтаксис не будет работать правильно далеко. Браузеру требуется немного времени, прежде чем iframe поднимется в массиве, время, в течение которого не может работать никакой сценарий.
document.getElementById('testiframe').src
синтаксис хорошо работает при всех обстоятельствах.
target
атрибут ссылки не работает ни один со сгенерированным iframes, кроме Opera, даже при том, что я дал свой сгенерированный iframe и name
и id
.
отсутствие [1 120] поддержка означает, что необходимо использовать JavaScript для изменения содержания сгенерированного iframe, но так как Вам нужен JavaScript так или иначе для генерации его во-первых, я не рассматриваю это как большую часть проблемы.
Размер текста в iframes
А любопытный Проводник 6 только ошибка:
при изменении размера текста через меню View размеры текста в iframes правильно изменяются. Однако этот браузер не изменяет разрывы строки в оригинальном тексте, так, чтобы часть текста могла стать невидимой, или разрывы строки могут произойти, в то время как строка могла все еще содержать другое слово.
Ниже приведен вывод компилятора. Странно, что второй раз запустить сборку удается. Однако я подозреваю, что проблема может быть связана с этой ошибкой при запуске mt.exe, который отвечает за встраивание информации из манифеста в исполняемый файл ...
Generating Code...
link /LIBPATH:"c:\Qt\4.5.2-vc\lib" /NOLOGO /DEBUG /MANIFEST /MANIFESTFILE:"debug\formExtractor.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /OUT:debug\formExtractor.exe @.\nmD932.tmp
mt.exe -nologo -manifest "debug\formExtractor.intermediate.manifest" -outputresource:debug\formExtractor.exe;1
'mt.exe' is not recognized as an internal or external command,
operable program or batch file.
NMAKE : fatal error U1077: 'mt.exe' : return code '0x1'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.
Exited with code 2.
ОБНОВЛЕНИЕ
Причиной действительно была ошибка при запуске mt.exe во время процесса связывания. проблемы. Я добавил путь к Windows SDK ( C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A \ bin
) в переменную среды PATH, и теперь я могу запустить исполняемый файл.
Комментарии к различные ответы;
@Shay
Выходной текстовый файл из sxstrace пуст. Понятия не имею, почему. Однако в журнале приложения есть следующая информация:
Faulting application formExtractor.exe, version 0.0.0.0, time stamp 0x4a638ee1, faulting module MSVCR90D.dll, version 6.0.6002.18005, time stamp 0x49e03824, exception code 0xc0000135, fault offset 0x0006f04e, process id 0xf68, application start time 0x01ca08ba801ac5cf.
Версия 6.0.6002.18005?
@ Кирилл В. Лядвинский
Зависимость Уокер находит msvcr90d.dll
, используемый файлом qtwebkit4.dll
в
c: \ windows \ winsxs \ x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb \ MSVCR90D.DLL
, но не находит (другая версия?), связанная непосредственно файлом msvcr255d.dll
. Однако DW, похоже, нигде не показывает свою версию, не так ли?
Конкурс файла formExtractor.intermediate.manifest
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*' />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
Из файла манифеста похоже, что исполняемый файл связан с другой версией msvcr90d .dll
, чем qtwebkit4.dll
. Странно то, что обе версии msvcr90d.dll
присутствуют в c:
а также
x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb
Есть идеи?
@ knight666
Я использую платформу Qt, которую я скомпилировал с использованием именно компилятора mism, сейчас нет Вот. Кроме того, Dependency Walker показывает, что отсутствующий файл msvcr90d.dll
связан напрямую с исполняемым файлом, поэтому я думаю, это не ошибка какой-либо сторонней библиотеки.
Отказ от ответственности: я не настоящий мастер Win32 :)
Я никогда не использовал Qt Creator, но создает ли он соответствующий манифест для exe?
возможно, манифест предназначен для другой версии (например, SP1), а у вас только RTM-версия.
Вы используете Vista? вы можете попробовать запустить SxsTrace для диагностики параллельных проблем.
Возможно, у вас несовпадение версий? У меня было то же самое с Ogre, мне пришлось перекомпилировать SDK, используя последнюю версию сторонней библиотеки для его компиляции.
обновление: в моем случае я обнаружил, что vc ++ 2008 express имеет «Использовать обходной путь FAT32» (находится на странице «Инструмент манифеста» свойств конфигурации); это решает проблему. В справочной информации для этого параметра объясняется, что диски / разделы FAT32 имеют 2-секундную задержку в отметке времени, которая мешает правильной работе mt.exe. Кажется, это объясняет несколько случайное поведение проблемы.
У меня такая же проблема с msvcr90d.dll, не найденной в vs2008 c ++ express ed. Встроенный манифест в выходном .exe выглядит следующим образом, когда включена добавочная ссылка:
Xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
Неудивительно, что не удается найти msvcr90d.dll!
Я пробовал 2 вещи:
A. при использовании шестнадцатеричного редактора приведенное выше будет перезаписано содержимым
B. используйте mt.exe -manifest ./Debug/XXX.embed.manifest -outputresource: ./ Debug / XXX.exe
Оба метода работают. я использовал 2-й метод как команду события после сборки:
mt.exe -verbose -manifest ./$(ConfigurationName)/$(TargetFileName).embed.manifest -outputresource: ./$ (ConfigurationName) / $ ( TargetFileName)
Я не знаю, почему «неправильный» манифест встраивается на 1-е место, когда включена инкрементная ссылка. если кто знает почему, напишите.
Спасибо!
lex
Простая установка VS2008 Service Pack 1 решит проблему, если это ошибка, при которой Debug CRT полностью отсутствует в sxs папка.
Это случилось со мной при новой установке VS2008 на 64-битной Windows 7 и решении, содержащем проект VC ++. При загрузке сборки C ++ во время выполнения сборка отладки вылетала из строя с параллельной ошибкой.
В Vista и Win7 (но не в XP) ошибка SxS дает подробную информацию о том, какую сборку он пытался загрузить и не смог загрузить - в данном случае это была VC90.DebugCRT 9.0.22.19. Я проверил (встроенный) манифест для сборки VC и, конечно же, он включил ссылку на эту сборку и версию.
Проверка каталога sxs (% System Drive% \ Windows \ WinSxS) показала, что VC90 DebugCRT не был установлен параллельно! Я установил среду выполнения VC ++, но она не включает среду выполнения отладки. VS2008 предназначен для установки среды выполнения отладки, но ее там не было.
Оказывается, исходный выпуск VS2008 не устанавливает 64-битную версию VC ++ DebugCRT, но устанавливает SP1. Как только я это сделаю, больше никаких исключений времени выполнения и параллельных ошибок.