2011-03-05 119 views
6

是否有一種方法可以覆蓋window.location.reload的默認行爲 - 使其成爲無操作,用於調試目的?以編程方式禁用window.location.reload?

+0

我的第一個猜測是'window.location.reload = function(){}'但這不起作用,至少在Firefox上。 – 2011-03-05 15:12:20

+0

應該是可能的 - 參見[Javascript - 覆蓋或阻止執行](http://stackoverflow.com/questions/850090/javascript-override-or-prevent-execution) – 2011-03-05 15:12:36

+0

'window.location.reload = function(){} '適用於Firefox 4 – 2011-03-06 07:58:11

回答

7

問題是,由於某種原因,location.reload實際上不是Firefox和Chrome中的可寫屬性。這是我想出的一些瘋狂的方式在這些瀏覽器中覆蓋它(和其他)。它使用非標準的.__defineGetter__()方法,部分是爲了繞開window.location = "/home.html"的魔法干擾。

var _location = location; 
__defineGetter__('location', function() { 
    var s = new String(_location); 
    for(i in _location) (function(i) { 
     s.__defineGetter__(i, function() { 
      return typeof _location[i] == 'function' ? function(){} : _location[i]; 
     }); 
     s.__defineSetter__(i, function(){}); 
    })(i); 
    return s; 
}); 
__defineSetter__('location', function(){}); 

將所得模擬對象應防止任何函數調用(包括.reload)或分配(設定.href)從實際發生作用。或者,您可以將您的測試限制爲可以寫入.reload的IE,Safari和Opera。

+1

在Opera 11.60中無效:「'未處理的錯誤:__defineGetter__:無效修改不可配置的屬性「。 – XP1 2012-01-21 19:22:43

+7

在Chrome上靜默失敗 – 2013-02-19 23:11:41

+0

現在由於Chrome上的錯誤而失敗。 – MasterScrat 2018-02-15 08:49:29

3

您必須在自調用函數中調用此代碼,除非它不起作用。

(function(location){ 
    ... 
})(window.location); 
+0

這也在Chrome中靜默失敗 – 2016-12-12 17:51:47