Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / HTML, JavaScript, VBScript, CSS Новый топик    Ответить
 Как дождаться загрузки IFRAME?  [new]
ru_efim
Member

Откуда:
Сообщений: 127
Страничка содержит два IFRAME, необходимо определить загрузился ли первый и IFRAME и только после его загрузки загружать второй IFRAME. Как это реализовать?
10 июн 09, 10:06    [7284092]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
ShSerge
Member

Откуда: ʚонɔ dиw
Сообщений: 25210
У ифрейма есть событие onload.
10 июн 09, 10:07    [7284098]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
SergASh
Member

Откуда:
Сообщений: 167
ShSerge
У ифрейма есть событие onload.

Не во всех браузерах. По спецификации его вообще быть не должно. Так что приходится делать периодический опрос. Надо смотреть в iframe.contentWindow.document и если он доступен пытаться понять по структуре пришел ли правильный ответ. jQuery в таком анализе сильно помогает.
10 июн 09, 12:33    [7285141]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
SergASh
Member

Откуда:
Сообщений: 167
Вот пример. Тут много лишнего, но выдирать не хотелось. По крайней мере он 100% рабочий.
dlg - это див-контейнер, в котором живет форма и ифрейм. Форма настроена на загрузку результата в этот ифрейм. Сервер по сабмиту возвращает текст, то есть ContentType: text/plain. Сам по себе текст - это JSON. Браузеры для text/plain строят DOM, который выглядит как <body><pre></pre></body>, так что анализ в данном случае труда не составляет.
    var pollUploadStatus = function( dlg )
    {            
      var iframe = dlg.find( "IFRAME.target" ).get( 0 );
      
      var finallize = function( msg, error, result )
      {
        dlg.each( function() 
        { 
          var self = this;          
          self.unblock(); 
          self.displayMessage( { message : msg,          
                                 title : error ? "Ошибка" : "Сообщение",
                                 onclose : function()
                                 {
                                   if ( !error ) {
                                     dlg.find( "FORM" ).attr( "target", "" );
                                     dlg.find( "IFRAME.target" ).remove();
                                     closeDialog( dlg );                                     
                                     self.dialogOptions.onSuccess( result );                                     
                                   }
                                 }
                               } );
        } );        
      }
      var uploadSucceeded = function( data )
      {               
        finallize( dlg.get( 0 ).dialogOptions.successMessage, false, data );        
      }
      var uploadFailed = function( msg )
      {        
        finallize( dlg.get( 0 ).dialogOptions.failureMessage + msg, true );
      }                 

      var timeout = g_UploadTimeout;
      var enqueuePoll = function()
      {
        setTimeout( poll, g_PollInterval );
      }
      var poll = function()
      {
        // Check timeout
        timeout -= g_PollInterval;
        if ( timeout <= 0 ) {
          uploadFailed( "время ожидания окончания операции истекло" );
          return;
        }
        // Retrieve JSON content
        var json = undefined;
        try {
          json = $( iframe.contentWindow.document ).find( "BODY > PRE" ).html();
        } catch ( e ) {
          json = undefined;
        }
        if ( json == undefined || ( typeof( json ) == "string" && json.length == 0 ) ) {
          enqueuePoll();
          return;
        }    
        // Convert JSON to object
        var result;
        try {          
          eval( "result = " + json );
        } catch ( e ) {
          result = undefined;
        }
        if ( result == undefined || result.Success == undefined ) {
          uploadFailed( "неожиданный ответ от сервера" );
          return; 
        }
        // Check result
        if ( result.Success == true ) {          
          uploadSucceeded( result.Data );                    
        } else {
          var msg = "";
          var messages = result.ErrorMessages;
          if ( messages != undefined && messages.length != undefined && messages.length > 0 ) {
            if ( messages.length == 1 )
              msg = messages[0];
            else {
              for( var i = 0; i < messages.length; i++ )
                msg += "<li>" + messages[i] + "</li>";
              msg = "<ul>" + msg + "</ul>";
            }
          }          
          uploadFailed( msg );
        }
      }
      enqueuePoll();
    }
10 июн 09, 12:42    [7285189]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712

SergASh

Не во всех браузерах

Огласите, пожалуйста, весь список...
SergASh

По спецификации его вообще быть не должно

Ссылочку на сие утверждение можно?
SergASh

Так что приходится делать периодический опрос. Надо смотреть в iframe.contentWindow.document и если он доступен пытаться понять по структуре пришел ли правильный ответ.

А заюзать onload parent'а нельзя?
_________________
"Helo, word!" - 17 errors 56 warnings

Posted via ActualForum NNTP Server 1.4

10 июн 09, 12:52    [7285262]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
ru_efim
Member

Откуда:
Сообщений: 127
Да, я думал все проще. Пока я не в состоянии понять ваши ответы. Направте пожалуйста что почитать, про DOM как я понял?
11 июн 09, 09:30    [7288421]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
ru_efim
Member

Откуда:
Сообщений: 127
Забыл написать, мне достаточно чтоб в IE версии не ниже 6.5 работало. В первом IFARME загрузку которого надо отселживать, два календаря, пользователь выбирает нужные даты, даты сохраняются в переменных Session во время событий SelectionChanged календарей. Во второй IFRAME выводится выборка из базы данных за период ограниченный датами выбранными в первом IFRAME. Исходя из выше сказанного я и хотел отслеживать загрузку первого IFRAME. Может как то по проще можно в данном случае, чем SergASh предлагаете.
11 июн 09, 09:46    [7288512]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712

ru_efim

В первом IFARME загрузку которого надо отселживать, два календаря, пользователь выбирает нужные даты, даты сохраняются в переменных Session во время событий SelectionChanged календарей. Во второй IFRAME выводится выборка из базы данных за период ограниченный датами выбранными в первом IFRAME.

Т.е. у Вас ЭстЪ страничка:
<html>
	<head>
		<title>search</title>
	</head>
	<body>
		<iframe src="calendar.aspx"></iframe>
		<iframe id="result" src="result.aspx"></iframe>
	</body>
</html>
Вы грузите search.aspx. В calendar.aspx рихтуете дату и попадаете на сервак в calendar.aspx.cs. Там Вы сохраняете даты в Session и на PostBack'е добавляете
....
window.onload=function(){parent.document.getElementById("result").contentWindow.location.reload()}
....

P.S. А зачем Вам в этом случае вообще IFAME'ы? Для форсу бандитского? Разместите все на одной странице. А result заверните в div и рулите display: none/block... IMHO, так
ru_efim

как то по проще

_________________
"Helo, word!" - 17 errors 56 warnings

Posted via ActualForum NNTP Server 1.4

11 июн 09, 12:27    [7289600]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
ru_efim
Member

Откуда:
Сообщений: 127
....
window.onload=function(){parent.document.getElementById("result").contentWindow.location.reload()}
....
Извеняюсь за ламерский вопрос. Надо добавить, для того чтоб гарантировать перезагрузку страницы "result.aspx" после сохранения дат в session, я правильно понял?
А с IFRAME(который result) вынужден работать по той причине что в результате всей обработки туда PDF открывается при настройках AcrobatReader открывать в окне IE.
А первай IFRAME(который calendar.aspx), сделал для того чтоб при выборе дат и PostBack'ах, страницы Seach и Result не перезагружались и в результате визуально сосздается впечатление что ни чего не происходит.
12 июн 09, 11:36    [7293491]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712

ru_efim

Надо добавить, для того чтоб гарантировать перезагрузку страницы "result.aspx" после сохранения дат в session, я правильно понял?

Причем будет достаточно в calendar.aspx даже:
private void Page_Load(object sender, System.EventArgs e)
{
	if(IsPostBack)
	{
		string
			JSString="\n<script type=\"text/javascript\">\n<!--\nparent.document.getElementById(\"result\").contentWindow.location.reload();\n// -->\n</script>";

			//Response.Write(JSString);
			// ||
			// LiteralJS.Text=JSString;
			// ||
			if(!IsStartupScriptRegistered("OnLoad"))
				RegisterStartupScript("OnLoad",JSString);
	}
}
т.е. без привязки к onload... Правда, по хорошему, нуна бы проверить parent.document.getElementById(\"result\") на не null...
_________________
"Helo, word!" - 17 errors 56 warnings

Posted via ActualForum NNTP Server 1.4

12 июн 09, 12:30    [7293631]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
SergASh
Member

Откуда:
Сообщений: 167
Жаль, что вы с самого начала не написали подробней как оно должно работать. Тогда бы я вас не путал этой кучей джаваскрипта.
При таком раскладе, на мой взгляд, от ифрейма с календарями и от хранения в дат в сеансе можно избавиться. Вы на клиентской стороне в состоянии получить пару дат из календаря не делая при этом постбека? Если не сможете со стандартным asp.net-ным календарём, то можно взять другой, их много фришных.
Дальше нужна будет скрытая HTML форма. Форма при помощи атрибута target может быть нацелена на обновление не всей страницы, а произвольного ифрейма. В эту форму можно будет положить пару hidden-полей и задать для них значения выбранных дат. После этого сделать сабмит формы. Тогда обработчик result.aspx сможет получить эти значения уже не из сеанса, а из запроса (Request.Form["dateFrom"] например). Ну и далее выдавать тот результат, который вам нужен. Результат приедет прямо в ифрейм.
Единственная проблема тут, которую придётся решать, это то, что форма в ASP.NET может быть только одна. Но это решаемо, ее можно создать динамически на клиентской стороне. С помощью jQuery так вообще несколько строчек.
12 июн 09, 13:13    [7293763]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712

SergASh

Вы на клиентской стороне в состоянии получить пару дат из календаря не делая при этом постбека?
....
Дальше нужна будет скрытая HTML форма. Форма при помощи атрибута target может быть нацелена на обновление не всей страницы, а произвольного ифрейма. В эту форму можно будет положить пару hidden-полей и задать для них значения выбранных дат. После этого сделать сабмит формы. Тогда обработчик result.aspx сможет получить эти значения уже не из сеанса, а из запроса (Request.Form["dateFrom"] например).

/me думает: "Нам солнца не надо-нам партия светит!Нам хлеба не надо - работу давай!"
parent.document.getElementById(\"result\").src="result.aspx?datebegin"+datebegin+"&dateend="+dateend;
Картинка с другого сайта.
_________________
"Helo, word!" - 17 errors 56 warnings

Posted via ActualForum NNTP Server 1.4

12 июн 09, 13:58    [7293895]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
ShSerge
Member

Откуда: ʚонɔ dиw
Сообщений: 25210
Ex_Soft

/me думает: "Нам солнца не надо-нам партия светит!Нам хлеба не надо - работу давай!"

Ме (т.е. Ex_Soft) правильно думает (только в первоисточнике слово "Партия" писалась с большой буквы). Я вот прочитал несколько раз весь топик (с начала и до конца). Кроме смешных штучек, типа "не все браузеры поддерживают" ничего не понял. А что они поддерживают? На онлоад обработчик не добавить (любой страницы, хоть в ифрейме, хоть в Африке)?
Кстати, при чём здесь жквери - тоже не понятно. Пару строк для "ее можно создать динамически"?!!! Голый яваскрипт - одной строчкой делает (два криэйта и два аппендчилда - без проблем в одной строчке), только здесь этого не надо совсем.
12 июн 09, 15:26    [7294154]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712
/me думает: дело было вечером - делать было нечего... Картинка с другого сайта.
_________________
"Helo, word!" - 17 errors 56 warnings

К сообщению приложен файл (TestRelatedIFrame.rar - 7Kb) cкачать
12 июн 09, 17:05    [7294403]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
ru_efim
Member

Откуда:
Сообщений: 127
Спасибо, буду седеть разбираться.
12 июн 09, 18:26    [7294565]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
69
Guest
Ex_Soft

SergASh

Не во всех браузерах

Огласите, пожалуйста, весь список...
SergASh

По спецификации его вообще быть не должно

Ссылочку на сие утверждение можно?
SergASh

Так что приходится делать периодический опрос. Надо смотреть в iframe.contentWindow.document и если он доступен пытаться понять по структуре пришел ли правильный ответ.

А заюзать onload parent'а нельзя?
_________________
"Helo, word!" - 17 errors 56 warnings


Млин, читай спцификацию. onload есть у body & frameset.
Ясный пень, что в iframe загружается body и событие обработать можно.
Но чье собыитие - фрейма?
13 июн 09, 01:38    [7295350]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712

Во-первых: не занимайтесь оверквотингом
Во-вторых:
69

onload есть у body & frameset

тынць, тынць
_________________
"Helo, word!" - 17 errors 56 warnings

Posted via ActualForum NNTP Server 1.4

14 июн 09, 15:28    [7297398]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
69
Guest
DOM-3?
Ну и какие же браузеры поддерживают его?
И ссылка на школу w3c?
По HTML4.1 только body & frame.
Если уважаешь школу Тынць-Пынць
14 июн 09, 16:41    [7297512]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
Ex_Soft
Member

Откуда:
Сообщений: 7712

69

По HTML4.1 только body & frame.

/me думает: гм... Получается, что onload у того же img со времен царя Гороха - "...против всех законов физики..."?
_________________
"Helo, word!" - 17 errors 56 warnings

Posted via ActualForum NNTP Server 1.4

14 июн 09, 17:38    [7297617]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
69
Guest
Разговор шел за спецификацию - там событий onload у img, script, iframe нет.
Реально - да есть.
14 июн 09, 21:41    [7297985]     Ответить | Цитировать Сообщить модератору
 Re: Как дождаться загрузки IFRAME?  [new]
69
Guest
...имеются в виду спецификации, которые 100 пудов поддерживаются веб-браузерами, то есть DOM-1 & HTML4.1
14 июн 09, 21:43    [7297989]     Ответить | Цитировать Сообщить модератору
Все форумы / HTML, JavaScript, VBScript, CSS Ответить