Как проверить, загружен ли фрейм с помощью javascript? - не onload, не iframe
проблема: старое программное обеспечение базы знаний, которое по какой-либо причине имеет ссылки, которые сломаны. Это серия вложенных фреймов. Некоторые указывают на правильную цель, некоторые нет, и многие просто сломаны. Это делает использование базы знаний громоздким, когда она не работает гладко
что я пытаюсь acomplish: Я хочу определить, когда конкретный фрейм загрузился, а затем проанализировать документ фрейма, заменив теги привязки на правильный hrefs и цели.
ресурсы и ограничения: у меня есть доступ к некоторым из .страница ASPX. Я нацелился теперь содержит framset, который загружает документ в базе знаний. Src этого кадра, однако, не представляется фактическим .aspx page (physical file) - не уверен, как он генерируется и как хранятся документы. Я вижу список src, но не могу найти его на веб-сервере, к которому у меня есть доступ.
базовый info: страницы загружаются с помощью .aspx (я не понимаю части этого хорошо и не имею доступа ни к чему намного глубже). Этот.страница aspx имеет набор фреймов, который создается при загрузке страницы.
пример кода набора кадров из .файл aspx:
<FRAMESET id="FrameSetMainView" runat="server" border="0" framespacing="0" frameborder="0">
<!-- This frame set is defined and generated in the code -->
</FRAMESET>
Я попытался добавить onload в FRAMESET
тег (это приводит к ошибке страницы при попытке загрузки). Набор фреймов берет на себя тело, поэтому я не могу добавить встроенный скрипт в нижнюю часть страницы, чтобы запустить его после заряжаю тоже.
дополнительно, б / к возраста продукта-он принужден в режим совместимости. Поэтому должна использоваться эквивалентная поддержка IE7. (нет )
Текущая Стратегия: что я думаю, что я могу работать, но чувствует себя хитрым, как все - добавление скрипта в <head>
. Что-то вроде:
<SCRIPT>
function load(){
var frameset = window.frames;
if(frameset.length > 0){ // frames have loaded - commence replacement
}else{ // frames not loaded
setTimeout(load,1000); // wait 1 sec, try again
}
}
load();
</SCRIPT>
других решений?
1 ответов
используйте событие onreadystatechange
Да, есть надежный способ решить эту проблему, не прибегая к таймерам или другим ТИКам. При загрузке страницы назначьте обработчик каждому событию фрейма "onreadystatechange". И вы также должны вызвать его один раз, чтобы убедиться, что он применяется к фреймам, которые уже загружены. Приведенный ниже код был протестирован в режимах совместимости IE 5,7,8,9,10 и работал так, как ожидалось (сбой в IE11). Он также был испытан с медленными рамками нагрузки без проблема.
ссылки:
- Microsoft - onreadystatechange событие
- Microsoft-указание устаревших режимов документов
- w3.org -Frameset определение типа документа
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<title>Demo</title>
<script type="text/javascript">
window.onload = function() {
for (var i = 0; i < window.frames.length; i++) {
(function(frame) {
// called whenever a frame is loaded or reloaded
frame.onreadystatechange = function() {
if (frame.readyState === 'complete') {
updateLinks(frame);
}
}
// call once to apply to already loaded frames
frame.onreadystatechange();
})(window.frames[i].frameElement);
}
}
// modify the links within the frame
function updateLinks(frame) {
var i, links, doc;
doc = frame.contentDocument || frame.contentWindow.document;
links = doc.getElementsByTagName('A');
for (i = 0; i < links.length; i++) {
// modify the links here
links[i].href += '?time=' + (new Date()).getTime();
}
console.info('modified ' + links.length + ' links in frame ' + frame.src);
}
</script>
</head>
<frameset cols="*,*">
<frame src="frameLeft.html">
<frame src="frameRight.html">
</frameset>
</html>