2011-02-09 40 views
0

我們有一個函數,可以在window.onload事件中更改iframe的高度,以便我們可以將其調整爲頁面內容。問題是,點擊一個asp:菜單後,其高度恢復爲默認值,並且window.onload事件不會觸發......所以我們需要在後續加載時觸發的事件(試過window.unload但沒有觸發)JavaScript事件像window.onload隨後加載

大小功能不能被稱爲關於ASP:點擊菜單,因爲窗口不會必須完成加載,因此高度計算會失敗......

任何想法?

回答

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

1

ASPNet使用通過AJAX的後臺調用,然後更新接口。 你應該使用服務器端代碼。檢查您使用的AJAX解析器並查找其聲明的事件。我確信在更新網頁後會觸發一個事件,並且您可以附加一個eventListener。

+0

我們可以使用updatepanel_load()在服務器端代碼,但在我們的解決方案中,您需要將它與隱藏字段結合起來,以便先前保存計算出的高度......但是,事件在負載開始時上升,而不是在完成時不能用於大小寫你想重新計算高度... – VSP 2011-02-09 14:40:52

0

在我們使用我們保存在在window.onload

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

計算出的高度...然後在Menu1_MenuItemClick一個hiddenfield結束(對象發件人,MenuEventArgs e)我們重新分配的高度的IFRAME :iframex.Attributes["height"] = iframeheight.Value;

這對我們很有用(因爲在我們的例子中,幸運的是頁面高度並沒有改變每個選項的選擇),但沒有解決有關在後續加載後觸發window.onload事件或類似的問題以重新計算新的高度...

我們將等待有人可以給出這個問題的最佳答案...

1

我在2年前有過類似腳本的同樣的問題。我在新加載的頁面的window.onload中使用JavaScript解決了它,調用父文檔並執行腳本。在子頁面,我們有這個腳本:

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)和extern的問題al pages ...至少它是一個有效的選項,所以我們的投票^^ – VSP 2011-02-09 14:35:08

+0

@ ase69s - 這可以在很多方面添加。我們選擇將它作爲包含添加到現有包含的某個包含中,以便將此腳本事後添加到所有頁面中。如果你能找到一種方法來消除這種冗餘,那麼它可能也會起作用。如果你的解決方案能夠充分發揮作用,我會說去解決它。我知道我們的想法遇到了問題,因爲我們有3個頁面加載速度慢,所以menu_click在頁面加載完成之前完成了大小調整。 – 2011-02-09 14:38:51