钩窗口。位置。*赋值和window.location.assign

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了钩窗口。位置。*赋值和window.location.assign相关的知识,希望对你有一定的参考价值。

我试图拦截window.location.*分配和window.location.assign调用更改分配前的URL是否可能?当我尝试重新定义属性设置器时,我得到一个错误,我无法重新定义它。我唯一的选择是代理页面并使用字符串替换静态替换window.location的所有赋值吗?虽然我宁愿避免它,因为javascript很时髦,这样的东西也可以有效,所以我必须跟踪所有的任务:

var l = window.location;
var c = l;
var t = c.assign;
t('...');
答案

一种解决方案是创建自己的位置更改提供程序,您可以在其中拦截URL并相应地进行更改。然后,您的代码可以始终调用您的更改提供程序而不是标准的window.location属性。

如果您处于设置location属性的代码不受控制的情况下,这将不起作用。

如果位置设置代码不受控制,请查看使用Javascript: How to intercept window.location change事件的beforeunload

另一答案

不幸的是,我不认为你能做到这一点。正如您所发现的,location上的window属性是不可配置的(至少在Chrome和Firefox中)。如你所知,它非常特别:如果你试图写它(例如,用你自己的自定义对象替换它),而不是以正常方式替换属性,它将把你给它的东西转换为字符串和试图在那里导航。因此,你无法用你自己的东西替换window.locationObject.defineProperty不会让你(因为它是不可配置的),并且赋值将不起作用。

这使您无需在页面上的JavaScript代码中识别对window.location的所有写入,这在一般情况下是不可能的。虽然你可以找到所有window.locationlocation参考,静态分析会告诉你(缺少evalnew Function)这些windowlocation变量是否是全局变量,你需要逐步评估代码来找到那种东西你在问题中提到过,甚至是一些简单的事情:

(function(w) {
    w.location = "https://stackoverflow.com";
})(this);

完全改变解决方案的体系结构,您可以运行无头浏览器服务器端并将其DOM更改回客户端,拦截所有点击并将其转发到服务器端代码以传递到无头浏览器。这可能有其自身的重大挑战。

以上是关于钩窗口。位置。*赋值和window.location.assign的主要内容,如果未能解决你的问题,请参考以下文章

将目标添加到 window.location [重复]

JavaScript实现页面重载 - 535种方式

php 改变商店循环功能的动作钩位置并在Finale倒数计时器或计数器栏中挂钩

window.location.href=window.location.href 和 window.location.reload() 的区别

JS之BOM的几个对象

arcgis软件arcmap属性窗口总字段计算器统一赋值操作错了能撤回吗?