2012-08-04 75 views
7

即使如果我在另一個腳本像調用本地瀏覽器功能,它已被重寫

alert = 0; 

這是在另一個腳本是和我的代碼無法加載該腳本之前。

如何在腳本中調用原始alert方法?

+0

如果是有用的Javascript確認對話框可用於顯示消息,如果yes/no按鈕可以被忽略。 – Ekim 2012-08-04 06:04:17

回答

14

在覆蓋原始的alert之前,請保存它。

var origAlert = alert; 
alert = 0; 
origAlert("foo"); 

演示:http://jsfiddle.net/jfriend00/tnNE7/


如果不能保存原來的價值,我所知道的唯一的其他方式來訪問它是在iframe。這裏有一個例子:

alert = 0; 
var iframe = document.createElement("iframe"); 
iframe.height = 0; 
iframe.width = 0; 
document.body.appendChild(iframe); 
iframe.contentWindow.alert.call(window, "foo");​ 

工作例如:http://jsfiddle.net/jfriend00/waMEV/

我還沒有在所有的瀏覽器嘗試這樣做,但它在Chrome,IE和Firefox的作​​品,我認爲它應該在其他瀏覽器。

+0

對不起,我忘了提。我不是最重要的警報。另一個腳本是。 – Dogbert 2012-08-04 05:33:15

+0

我正在現有網站上運行此操作。我的代碼總是在稍後加載:) – Dogbert 2012-08-04 05:34:42

+0

@AnkitGautam用例:我不希望網站知道我稱爲函數。他們可以從腳本中修改該功能,因此它的行爲與舊腳本完全相同,但是在某處使用該功能的日誌。 – Dogbert 2012-08-04 05:42:24

6

好吧,我是第一個承認這是一個醜陋的答案,但它似乎工作:

alert = 0; 

var win = window.open(), 
    method = win.alert; 
win.close(); 

method.call(window, "my message"); 

Fiddle here.從本質上講,你犯了一個新的窗口實例並竊取其alert方法。缺點是你實際上不得不打開一個新的瀏覽器窗口,儘管很簡單。我懷疑這實際上是對您的問題的實際解決方案 - 取決於您嘗試使用的其他網站,以及您關心解決方案對最終用戶的看法。

編輯:這是上述答案和jfriend00的答案的組合,它解決了「打開新窗口」的問題。我認爲這是一個更好的選擇,因爲a)當你需要調用該方法時,它不依賴於仍在DOM中的iframe,並且b)它應該可推廣到任何window方法,jfriend00的答案可能不是「T。

alert = 0; 

// make a new window instance in an iframe 
var iframe = document.createElement("iframe"); 
iframe.height = iframe.width = 0; 
document.body.appendChild(iframe); 
// steal the method 
var method = iframe.contentWindow.alert; 
// remove the evidence 
document.body.removeChild(iframe); 

// now use the method for your own purposes 
function myAlert(message) { 
    method.call(window, message); 
} 
myAlert("foo"); 
+0

爲什麼你把'this'設置爲'window'而不是'win'是'win''''''' alert? – icktoofay 2012-08-04 06:10:56

+0

我已經關閉了'win',所以它無法工作。 – nrabinowitz 2012-08-04 06:14:01

+0

如何從新創建的iframe中竊取fn?結果將是相同的,只是你不會彈出一個新窗口 – 2012-08-04 06:16:27