2009-12-01 62 views
3

我的頁面上有一個外部javascript,例如例如:通過UpdatePanel在異步回發後重新加載外部javascript

<script src="http://foo.com/script.js" type="text/javascript"></script> 

和某個UpdatePanel。該腳本編寫了一些內容,並在js文件中的匿名JavaScript函數中執行此操作。即,有這樣的腳本:

(function(){document.write('content');})(); 

每當在UpdatePanel通過異步回更新,一切的劇本做了(或我的網頁上任何JavaScript,爲此事)由百廢待興。 對於普通的JavaScript,我只想用:

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(myFunction) 

重做一切,但因爲腳本源文件中的函數是匿名的,並呼籲定義,我SOL!有任何想法嗎?

注意:外部js源來自另一個域,並且其內容超出了我的控制範圍。

+0

不要緊,你的函數是匿名的。你可以命名它並在全球範圍內調用它。真正的問題將是'document.write'。在頁面加載後調用它意味着整個靜態頁面內容將被擦除。 – 2009-12-01 21:08:59

+0

其實,我甚至不確定外部的javascript是否執行document.write。它可能只是創建一個新的文檔節點並將其附加到頁面。該腳本是一個混亂的大混亂,實際上有不止一個。 問題是,我無法控制這些腳本的內容。他們有匿名稱爲功能,我只需要處理它。 – 2009-12-02 12:42:49

+0

我剛剛證實它確實做了一個document.write,剛剛遇到'擦'Crescent預言。聖潔的廢話猴子球。 – 2009-12-03 13:01:03

回答

2

確定,「解決方案」(「骯髒醜陋的黑客攻擊」,如果你喜歡),我想出了:

不是加載JS文件直接的,我通過一個封裝器,讀取文件加載它,包裹自定義JavaScript中的結果將匿名函數放入全局數組中,並在加載時以及每次異步回發之後調用所述數組中的所有函數。

請不要在任何選美比賽中輸入此解決方案。

+1

這是什麼樣子? – 2015-08-11 23:19:53

1

這裏真正的問題是我沒有正確使用UpdatePanels。如果頁面上所有UpdatePanel的UpdateMode設置爲Conditional,並且ScriptManager已啓用部分更新,那麼它確實不應該「[撤消]腳本所做的所有事情」。

3

在你的Page_Load試試這個

private string _myScript = @"(function(){ 
          var ys = document.createElement('script'); 
          ys.type='text/javascript'; ys.async=true; 
          ys.src='http://foo.com/script.js'; 
          var s = document.getElementsByTagName('script')[0]; 
          s.parentNode.insertBefore(ys,s); 
          });"; 

然後

ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "myScript", _myScript , true); 
+0

這不適合我,我的來源是'ys.src ='https://addthisevent.com/libs/1.6.0/ate.min.js';' – 2015-08-11 23:18:19

相關問題