我正在尝试拦截Dim sfrm As Subform
Select Case mainForm.tabLists.value
Case List1.PageIndex
Set sfrm = Me!subForm1
Case List2.PageIndex
Set sfrm = Me!subForm2
Case List3.PageIndex
Set sfrm = Me!subForm3
End Select
sfrm.SetFocus
分配和window.location.*
调用,以在离开前更改分配的url,这可能吗?
当我尝试重新定义属性设置器时,出现错误,我无法重新定义它。
我唯一的选择是代理页面并将所有对window.location的分配静态替换为字符串替换吗?
尽管我宁愿避免这样做,因为javascript很时髦,类似的东西也可能有效,所以我必须跟踪所有分配:
window.location.assign
答案 0 :(得分:1)
一种解决方案是创建您自己的位置更改提供程序,您可以在其中拦截URL并进行相应的更改。然后,您的代码可以始终调用更改提供者,而不是标准的window.location属性。
粗略地说,如果您无法设置位置属性的代码在您的控制范围之内,则无法使用。
如果您无法控制位置设置代码,请查看使用beforeunload
事件的Javascript: How to intercept window.location change。
答案 1 :(得分:1)
不幸的是,我认为您无法做到这一点。如您所见,location
的{{1}}属性是不可配置的(至少在Chrome和Firefox中)。如您所知,它非常特殊:如果您尝试对其进行写入(例如,用您自己的自定义对象替换它),而不是以常规方式替换该属性,它将把您给它的内容转换为字符串并尝试导航到那里。因此,您无法用自己的东西替换window
:window.location
不会让您(因为它是不可配置的),并且分配将无法进行。
这使您承担了识别页面上JavaScript代码中对Object.defineProperty
的所有写操作的任务,这在通常情况下是不可能的。尽管您可以找到所有window.location
和window.location
引用,并且静态分析会告诉您(缺少location
或eval
时,new Function
和{{1} }变量是全局变量,您需要逐步评估代码以查找问题中提到的东西,甚至是简单的东西:
window
完全改变解决方案的体系结构,您可以在服务器端运行无头浏览器,并将对DOM的更改回显给客户端,拦截所有单击并将它们转发到服务器端代码,以传递给无头浏览器。可能有自己的重大挑战。