2011-03-05 117 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