2014-02-05 26 views
6

對於已經解決類​​似問題的SO有幾個問題,但沒有人回答我確切類型的問題。大多數的答案涉及到運行一個JS代碼片段和超載警報方法,因此:window.alert = function() {};如何在渲染完成之前阻止UIWebView中的Javascript alert | confirm | promt?

我遇到的問題是,網頁加載(我無法控制的內容)在渲染之前打開一個警報整個頁面完成。

因此,我不能使用:- (void)webViewDidFinishLoad:(UIWebView *)webView委託方法來運行JS片段。另外在- (void)webViewDidStartLoad:(UIWebView *)webView中運行相同的代碼片段不會對我有任何好處,因爲它在DOM加載之前執行。

類似的問題:

對此有何指針?

+0

您可以將創建警報的腳本移動到以上的一行嗎? – DrogoNevets

+0

您是否建議我預加載HTML並解析出警報代碼並將其移動?我正在尋找更強大的解決方案。 – ABeanSits

+0

如果你沒有其他任何控制權是的,我猜我是,不能看你如何可以做到這一點,如果你不重覆警報 – DrogoNevets

回答

9

在嘗試了一下建議的有關注入Javascript的解決方案之後,我又回到了本地平臺。

由於UIWebView將所有Javascript警報轉換爲本地UIAlertViews,因此在本機端進行阻止相當簡單。縱觀UIAlertView.h,只有一種顯示警報的公開方法,方便地稱爲:- (void)show;

該方法可以輕鬆地在子類中或通過類別重寫。我最終使用了一個類別,因爲the documentation提到了UIAlertView的子類化警告。

@interface UIAlertView (Blocker) 
@end 

#import "UIAlertView+Blocker.h" 

@implementation UIAlertView (Blocker) 

- (void)show { 
    return; 
} 
@end 

該類別中的視圖控制器保持所述UIWebView將阻塞的UIAlertView並且反過來也所有JS警報所有實例導入。

我覺得這個解決方案更強大,因爲它不依賴注入JavaScript,更改HTML或使用第三方庫。它也與時間無關(JS警報代碼可以在標題,正文或某些第三方庫中)。

+0

使用類別覆蓋方法[Apple強烈建議](http://stackoverflow.com/a/5272612/404321) –

0

看來,結果可能會因渲染引擎,有幾個方法,什麼似乎爲我工作的這是什麼:

alert("something"); 
alert = function(){}; 
alert("awesome"); 

http://jsfiddle.net/g5S5M/ 我知道的V8引擎,Chrome瀏覽器使用與Firefox或IE使用的不一樣,所以在製作複雜的Web應用程序時,必須真正開始思考,因爲並非所有的瀏覽器都以相同的方式插入JavaScript。

你可能想要看的一件事是第三方庫重寫這個函數,如果你告訴alert是空白的並且在另一個腳本告訴它不是空白之後,那麼ether會刪除那個庫,改變執行順序或修改該庫。

+0

我可以確認,顯示其警報_after_整個頁面已加載(webViewDidFinishLoad:已被調用)這種解決方法確實有效。但是現在我遇到的問題是,在呈現所有內容之前打開警報。 你是否建議我注入某種JS-lib來處理這個問題? – ABeanSits

+0

您可以將其包裝在isReady函數中http://learn.jquery.com/using-jquery-core/document-ready/ –

+0

我最終使用本機解決方案來解決此問題。它感覺更健壯,更多在我自己的舒適區域內。 – ABeanSits

相關問題