为什么要重置文档getter函数
Why are the document getter functions being reset?
我正在尝试创建一个小的chrome扩展,以帮助查找cookie在网站中的使用位置。通过设置文档上cookie的getter方法,SUPPOSE扩展可以工作。像这样:
document.__defineGetter__('cookie',function(){
alert("test");
});
当手动将其放入网站上chrome的javascript控制台,然后尝试访问cookie(只需键入"document.cookie
")时,会产生预期的行为,并弹出测试提示。
然而,当我把它放在chrome扩展中,并在页面的其余部分之前加载它时,它将无法工作。
这是manifest.json(我刚刚使用soundcloud作为测试网站):
{
"name": "Cookie Auditor",
"version": "0.1",
"manifest_version": 2,
"description": "An extension to help examine where cookies are being used in websites.",
"content_scripts": [
{
"matches": ["*://*.soundcloud.com/*"],
"js": ["content.js"],
"run_at": "document_start"
}
]
}
这是内容.js:
console.log(document.location);
document.__defineGetter__('cookie',function(){
alert("test");
});
console.log(document.__lookupGetter__('cookie'));
当尝试手动触发它(document.cookie
)时,它只是返回正常值,并且无法执行javascript。当它在这里失败时,我检查了文档的位置,以确保它在正确的域上执行,甚至正在加载。奇怪的是,当你用这个扩展加载页面时,它会打印出它在正确的域上,甚至会显示cookie getter方法被正确覆盖(它在控制台中打印函数)。但是,当您查找getter方法时,它已被重置(document.__lookupGetter__('cookie')
)。
我的最后一个想法是,在运行content.js脚本和初始化页面其余部分之间的某个时间,它会被重置。然而,当我将manifest.json文件中的"run_at"字段更改为"document_end",试图在对文档进行任何形式的重新初始化后使其稍后运行时,soundcloud的内容将开始在控制台上打印,表明它已经正确加载了页面,但我的脚本仍然没有产生效果。
编辑:建议之前。我不能使用chrome的cookie API,因为当cookie被检索时,它没有提供一种实际监听的方式,这是我最关心的事情。
经过一番挖掘,我发现了它失败的原因。Chrome扩展在它们自己的javascript空间中执行,但使用与它们运行的站点相同的DOM。请参阅https://developer.chrome.com/extensions/content_scripts#execution-环境。这导致它们有单独的全局变量,因此我的脚本试图更改它们只会影响它自己。对于任何想了解如何绕过这一限制的人来说,你所要做的就是从扩展中在文档中添加一个带有代码的脚本标记。
- 传递参数时如何避免模块模式中的 getter/setter 函数
- 使用特权Getter/Setter函数的JavaScript原型函数
- 调用Typescript setter don't返回函数,尽管关联的getter可以工作
- 使用getter和setter实现函数链接的方法
- 为什么要重置文档getter函数
- 函数的 setter/Getter 在调用函数时将函数转换为字符串
- 如何定义一个构造函数,该函数使用 getter 和 setter 创建对象
- Angular Isolate scope 的 & Binding 返回 getter 函数而不是 value
- JavaScript从函数中调用getter
- 来自defineProperty的Getter函数没有't返回选择器
- OOP getter函数应该返回私有属性的值或引用
- 使用Getter函数暴露Angular服务中的对象,返回undefined
- 对象getter/setter与新构造函数的比较-测试结果
- 在Javascript代码中共享getter/setter函数
- 作为类的函数-为私有属性创建getter和setter
- 我不能直接访问对象中的字段,也不能使用getter函数访问
- 对象.在构造函数中赋值getter和setter
- 构造函数、getter和setter方法中的Object.defineProperty
- 如何从ES6类中的getter函数返回构造函数参数值
- 如何在HTMLElement原型上覆盖getter函数