在卸载页面之前拦截新的URL

问题描述 投票:0回答:1

问题:我是一个需要使用具有href="javascript://"锚点列表的Web应用程序的用户。当我点击其中任何一个时,脚本执行一些东西(这里不相关),最后导航到一个新页面。

我的问题是我希望将这个新页面加载到新选项卡上,而不是让我当前的选项卡导航到不同的页面。由于链接指向无处,我无法右键单击它并在新选项卡中打开它。

(我想要这个的原因是因为我必须总是来回走动,所以如果每个项目都可以加载到不同的标签中,那么我将节省大量的时间)

问题:是否可以在窗口卸载之前拦截要加载的新URL?或者,如果没有浏览器扩展,这是不可能的,即使使用控制台执行脚本?

解决方案的想法:如果window.onbeforeunload可以捕获新的URL,分配给window.location,我可以window.open(newURL,'_blank')然后防止导航到新URL的默认行为。


  • 更新:将window.openwindow.history.pushSatereplaceStatewindow.location.assignreplace更改为null没有任何区别,因此没有一个被称为。它最有可能使用window.location。是否可以收听对window.location的任何电话?或者我可以添加一些东西到location,以便location = newURLlocation.href = newURL不重定向,但只是打开一个新的选项卡与此newURL
  • 第二次更新:我通过反转预期的行为解决了我的问题。我没有能够打开新选项卡中的每个项目,而是在导航到新页面之前,在新选项卡中单击上一个URL打开的项目。也就是说,我在每个项目中添加了一个eventListener,当它被点击时它会运行:myNewTab = window.open(originalURL, '_blank'); myScript = document.createElement('script'), myScript.innerHTML = "/*eventual custom script goes here*/"; myNewTab.document.body.appendChild(myScript);。我仍然想知道是否可以拦截新的URL,因为这仍然是最好的解决方案
javascript html5
1个回答
1
投票

既然你已经将问题(显然)与location=location.href=的实例隔离开来,那么你应该能够从全局命名空间中破解所有这些问题。你可以从定义开始

var location = {};  

现在,所有违规的赋值语句都应该变得无害。

如果这意味着继承代码的其他部分失败,或者您只是想要一个更彻底的解决方案,则可以将整个客户端代码库(除了自定义location对象)包装在一个函数中,该函数会在您的对象发生更改时作出反应。一个有用的反应是用atarget="_blank"或类似的东西创建一个href=" ${location.href} || ${location} || #标签。


或者,您可以使自定义位置对象不可变(未经测试):

const location = {};
Object.defineProperty( location, "href", {
  value: "whatever",
  writable: false,
  enumerable: true,
  configurable: true
});

现在任何分配给locationlocation.href的尝试都会引发错误,例如[Invalid_const_assignment][1]。如果你的包装函数使用try / catch来执行其余的源代码,你可以捕获这些错误以保持应用程序运行,看看分配试图发送给你的url,并希望用它做一些有用的事情。


最后,如果原始开发者明确使用window.location而不是location,那是一条更大的鱼,但你有几个选择。

一种是找到并替换前者的所有实例,以使上述建议适用。实现这一目标的一种方法是使用Sublime Text中的“find in folder”菜单选项(在用Sublime打开你的src文件夹之后。)显然,在制作这样的文件之前,你需要做一个可靠的备份(比如git commit)。鲁莽的全球变化。

另一种方法是尝试破解窗口对象。这开始超越鲁莽,并且应该被任何受人尊敬的浏览器阻止,但是可能是浏览器不知道的包装函数(如上所述)可以模拟这个。

也就是说,如果你的应用程序的源代码的执行上下文是一个包装函数,它有自己的“本地”window对象,那么与window.somePropertywindow.someMethod的任何交互都应该找到你的自定义版本,它可以作为一个看门人为一些属性添加自定义处理(如location)将所有其他赋值和方法调用转发到“真实”窗口对象。

这种转发可能是困难的部分,取决于应用程序尝试与window进行的具体交互。如果担心的交互很少,你可以根据具体情况抢先处理每种类型,但我们已经超出了我的知识范围,并为这种情况提供了动态解决方案(可能使用代理对象? )是我甚至不会进一步推测的东西。

相反,这里有someone else's (related?) thoughts使用jQuery,但如果你必须走这么远,编写一个小的浏览器扩展来处理自动复制和删除其他选项卡可能是一个更简单的解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.