2009-11-13 57 views
188

有沒有人有重寫JavaScript中的alert()函數的經驗?JavaScript:重寫提醒()

  • 哪些瀏覽器支持此功能?
  • 哪個瀏覽器版本支持?
  • 重寫函數有什麼危險?
+10

如果你倒票,解釋原因。這可能只是因爲我有一個完全合理的理由來做這件事。 – roosteronacid 2009-11-13 14:31:52

+20

我不明白這裏的倒票。 – 2009-11-13 14:32:43

+0

這不是一個無限循環嗎? – Pool 2009-11-13 14:39:40

回答

188

這絕對是「支持」。這是你的網頁,你可以隨心所欲地做任何事情。

我已經做到了這一點,不用修改庫而是通過潛入事件來跟蹤分析事件。

使用代理模式:

(function(proxied) { 
    window.alert = function() { 
    // do something here 
    return proxied.apply(this, arguments); 
    }; 
})(window.alert); 

您還可以繞過原來的函數調用,如果你想要的(代理)

此處瞭解詳情:JQuery Types #Proxy Pattern

+0

絕妙的回答!我完全忘記了那個模式:) – roosteronacid 2009-11-13 15:00:28

+0

沒問題!我也對此分享喬什斯托多拉的觀點,太棒了。 – 2009-11-13 15:03:01

+0

是的。已經提出了他的答案。你的情況更加明確。它帶有一個例子。這總是一個人羣,pleaser :) – roosteronacid 2009-11-13 15:06:08

2

它確實在firefox和ie8中有效。我看不到有什麼瀏覽器不能工作。這對於javascript的工作原理來說非常重要,即使人們不經常看到它與本機功能一起使用=)

+1

專門針對IE瀏覽器將是IE6的其他人可能會好起來。 – AnthonyWJones 2009-11-13 14:29:40

13

我認爲每個Javascript實現都會支持這一點,並且不存在任何危險。通常使用HTML/CSS來替換普通的OS風格的警報框更優雅。這樣做意味着您不必更改現有代碼!這是可能的事實使JavaScript真棒。

2

現代瀏覽器中的所有JavaScript實現都支持覆蓋。

危險很簡單,你可以通過重寫alert()等常用函數來讓其他團隊成員完全瘋狂。

因此,除非您將函數重寫爲可能以某種方式調試或破解現有代碼的工具,否則我認爲沒有理由這樣做。只需創建一個新功能。

-1

當談到js的瀏覽器功能window.alert是傑出和最知名的,人們不知道誰JS知道alert() - 放心它在所有的瀏覽器目前使用支持,您的代碼段是以及。然而,我不會覆蓋(這更像是重構而不是覆蓋在OOP意義上)alert()作爲你的特定用例,因爲當你實際上需要使用alert()而沒有模板,並且你可能會,我需要另一個非警報功能來做到這一點。

4

我與壓倒一切的警報經驗()函數是我們曾經用它來「黑客」試用版的JavaScript庫,顯示「請註冊!」通過警報時間的嘮叨屏幕。

我們剛剛定義了我們自己的alert()函數和voila。

這是僅用於測試目的,我們後來又買了完整版,所以沒有什麼不道德的事情在這裏;-)

14

有在Overring報警功能沒有危險。每個瀏覽器都會支持它。

例如:

// function over riding. Redirecting to Console with Firebug installed. 
function alert(message) { 
    console.info(message); 
} 

alert('This is an override.'); 
+7

上拋出異常,如果您的替換是非阻塞的,則可能會有危險。例如,調用alert(「重新加載」)並重新加載網頁的代碼。警報文本可能永遠不會被用戶看到。 – Darien 2014-01-22 23:26:25

22

雖然大多數瀏覽器都支持覆蓋它,小心你用它做什麼。

由於默認警告框會阻止執行線程,因此一些依賴此行爲的庫可能無法工作(最好)。

你應該是一個好公民,並避免觸及本地API。如果你這樣做,當使用第三方代碼時,你可能會分手。

但是,如果要重新定義在特定環境警報的行爲,你可以用一個匿名函數括起來,就像這樣:

/* new funky alert */ 
function myFunkyAlert(msg) { 
    /* here goes your funky alert implementation */ 
    alert("Look ma!\n" + msg); 
} 

(function(alert) { // anonymous function redefining the "alert" 

    /* sample code */ 
    alert("Hello World!"); 

})(myFunkyAlert); 
7

拉吉斯拉夫。
對於IE8可以像這樣重新定義警報()

/** 
* Definition of global attached to window properties <br/> 
*/ 
    (function() { 
     nalert = window.alert; 
     Type = { 
      native: 'native', 
      custom: 'custom' 
     }; 
    })(); 

/** 
* Factory method for calling alert(). 
* It will be call a native alert() or a custom redefined alert() by a Type param. 
* This defeinition need for IE 
*/ 
    (function(proxy) { 

      proxy.alert = function() { 
      var message = (!arguments[0]) ? 'null': arguments[0]; 
      var type = (!arguments[1]) ? '': arguments[1]; 

      if(type && type == 'native') { 
      nalert(message); 
      } 
      else { 
       document.write('<h1>I am redefiend alert()<br/>Alert say: '+message+'</h1>'); 
      }  
     }; 
    })(this); 

,並呼籲爲

alert('Hello, hacker!'); 
nalert('I am native alert'); 
alert('Hello, user!', Type.custom); 
9

正如在許多其他的答案說,你可以只覆蓋函數

window.alert = null 

window.alert = function(){} 

然而,這並不必然覆蓋在Window構造函數的原型功能(注意是大寫W),所以黑客仍然可以鍵入:

Window.prototype.alert.apply(window, ["You were hacked!"]); 

因此,您還需要重寫函數:

Window.prototype.alert = null 

Window.prototype.alert = function(){} 
+0

這不一定會覆蓋其他框架中的功能。見http://jsfiddle.net/18znqbjd/1/ – Robert 2014-08-12 06:58:37

+0

羅伯特:是的,有很好的理由。不同的框架基本上是不同的HTML文檔,每個都有自己的Javascript實例。 – Rolf 2015-10-21 10:37:08

+0

你確定Window.prototype.alert在2017年仍然是一個函數嗎? :P – iplus26 2017-02-22 12:10:33

1

快速黑客,我做尋找到警報s來自,是去控制檯,然後輸入這個

function alert(message) { 
    console.info(message); 
    debugger; 
}