2011-02-09 2 views
0

У нас есть функция, которая изменяет высоту iframe в событии window.onload, чтобы мы могли настроить ее на содержимое страницы. Проблема заключается в том, что после нажатия в asp: menu высота восстанавливается по умолчанию и событие window.onload не срабатывает ... поэтому нам нужно событие, которое будет срабатывать при последующих загрузках (попробовал window.unload, но не запускал)Javascript, например window.onload для последующих нагрузок

функция изменения размера не могу назвать на жереха: меню нажмите, потому что окно не имели бы закончили загрузку поэтому расчет высоты потерпит неудачу ...

Любые идеи ??

ответ

1

ASP.Net AJAX предоставляет модель событий клиента.Для выполнения кода после того, как содержимое обновляется, использовать это, чтобы привязать к pageLoaded событие:

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoadedFunction); 

Узнайте больше обо всех событиях ASP.Net AJAX JavaScript здесь: http://msdn.microsoft.com/en-us/library/bb386417.aspx

+0

Спасибо, что я искал ... как насчет случая, когда у вас не было ajax на странице? с только «простым» javascript? – VSP

+0

@ ase69s - В этом случае 'window.onload' будет работать нормально. ASP.Net AJAX позволяет обновлять контент без перезагрузки страницы. Если вы должны отключить AJAX, страница должна будет перезагрузиться, чтобы обновить контент (если вы не полностью переработали свой код). – gilly3

1

ASPNet использует фоновые вызовы через AJAX, а затем обновляет интерфейс. Вы должны использовать серв-код. Осмотрите распознаватель AJAX, который вы используете, и найдите его объявленные события. Я уверен, что есть одно событие, которое запускается после обновления веб-страницы, и вы можете присоединить к нему eventListener.

+0

Мы могли бы использовать updatepanel_load() в серверный код, но, как и в нашем решении, вам нужно объединить его со скрытым полем, чтобы сохранить вычисленную высоту ранее ... Тем не менее, событие возрастает в начале загрузки не тогда, когда оно завершено, поэтому его нельзя использовать в случае вы хотели пересчитать высоту ... – VSP

0

В конце концов, мы использовали скрытое где мы сохранили высоту вычисленный в window.onload

document.getElementById("iframex").value = document.getElementById("iframeheight").height; 

... затем в Menu1_MenuItemClick (объект отправителя, MenuEventArgs е) мы переназначить высоту в IFRAME : iframex.Attributes["height"] = iframeheight.Value;

Это работает для нас (потому что в нашем случае, высота страницы не изменяется при каждом выбранном параметре), но не разрешает исходный вопрос о том, как запустить событие window.onload или что-то подобное после последующих нагрузок, чтобы пересчитать новая высота ...

Мы подождем, так что кто-то может дать лучший ответ на эту проблему ...

1

У меня была эта проблема с похожим сценарием 2 года назад. Я решил это с помощью JavaScript в окне загруженной страницы new.onload, чтобы вызвать родительский документ и выполнить скрипт. На странице ребенка мы имели этот скрипт:

function goSetHeight(){ 
    if (parent == window) return; 
    else parent.setIframeHeight('iframe_name'); 
} 

// Edit: Forgot to add the window.onload call 
window.onload = goSetHeight; 

Этот скрипт до родительской страницы, где у нас были файл включен сценарий, который имел эту функцию:

function setIframeHeight(iframename) { 
    var iframeEl = document.all[iframename]; 
    var iframeWin = window.frames[iframename]; 
    if(iframeEl && iframeWin) { 
     //var docHt = getDocHeight(iframeWin.document); 
     //if(docHt) iframeEl.style.height = docHt + 30 + "px"; 
     iframeEl.style.height = iframeWin.document.body.offsetHeight + 30 + "px"; 
    } 
} 

Обратите внимание, что данная функция была написанный исключительно с учетом IE (это была спецификация приложения), поэтому для использования кросс-браузера потребуется модификация. Единственная проблема, которую мы столкнулись с ним были 2 частные случаи:

  1. У нас было несколько случаев, когда страницы, которые были загружены в IFRAME были из другого домена, чем страницы, держащего IFRAME. Это вызывает ошибку безопасности JavaScript, потому что браузер считает, что это атака XSS и ее отрицает.
  2. Мы также столкнулись с несколькими ситуациями, когда iframe был вложен в 2 глубины. Это была трудная работа, с которой я столкнулся с тем, что я был крайне недоволен, но это сработало, когда мы реорганизовали классический asp на .Net. С тех пор я потерял скрипт, который использовался для выполнения прохода, но он не был сложным, он просто выполнял аналогичную родительскую проверку и продолжал идти.
+0

Мы тоже подумали об этой опции, но, как вы сказали, вам нужно поместить скрипт на каждую дочернюю страницу (больше избыточности для изменений: S) и проблема внешнего al pages ... по крайней мере, его действительный вариант, так что идет наш голос ^^ – VSP

+0

@ ase69s - Это можно было бы добавить разными способами. Мы решили добавить его в качестве включенного в один из существующих, поэтому этот скрипт был добавлен ко всем страницам ex post facto. Если бы вы могли найти способ устранить такую ​​избыточность, это, вероятно, сработало бы так же хорошо. Если ваше решение работает адекватно, я скажу, что идите с ним. Я знаю, что у нас возникли проблемы с вашей идеей, потому что у нас было 3 страницы с медленным временем загрузки, так что menu_click закончил изменение размера до того, как страница закончила загрузку. –

Смежные вопросы