我已经写了这个javascript来阻止页面上所有其他javascript创建cookie(我在页面上也有jquery):
jQuery(document).ready(function () {
Object.defineProperty(document, 'cookie', {
get: function () {
return '';
},
set: function (value) {
}
});
});
现在我需要更进一步。我需要选择性地阻止cookie,如下所示:
jQuery(document).ready(function () {
Object.defineProperty(document, 'cookie', {
get: function () {
if (value == ...) {
//call to "parent" function here
} else {
return '';
}
},
set: function (value) {
if (value == ...) {
//call to "parent" function here
//document.cookie ???
}
}
});
});
是否可以致电"父母" /"本地"功能?我尝试过使用document.cookie,但浏览器启动循环,再次调用我的函数(这是正确的)。
提前致谢
玛丽艾拉·
答案 0 :(得分:1)
当你的getter / setter代理处于活动状态时,你不能这样做。
问题是document.cookie
不使用JavaScript getter和setter,但是(可能是)本机的,我们无法访问。
您可以通过调用Object.getOwnPropertyDescriptor
:
JSON.stringify(Object.getOwnPropertyDescriptor(document, 'cookie'));
(我无法将其作为摘录,因为代码段无法访问Cookie。)
在Chrome中:
{
"value": "...",
"writable": true,
"enumerable": true,
"configurable": true
}
在Firefox中:
undefined
如果没有掌握处理赋值的函数,你就无法调用它。
但是,如果您delete document.cookie
, Jon Skeet将其 自动恢复恢复正常。
所以你可以做的是将作业存储在某个地方,最后删除你的代理(最终window.onunload
)并将所有内容重新分配给document.cookie
,例如
function getCookies()
{
var cookies = {};
var list = document.cookie.split(';');
for(var i = 0; i < list.length; i++)
{
var split = list[i].split('=');
cookies[split[0].trim()] = split[1];
}
return cookies;
}
function hijackCookies()
{
var cookies = getCookies();
Object.defineProperty(document, 'cookie',
{
configurable: true,
enumerable: true,
get: function()
{
var list = [];
for(var key in cookies)
{
list.push(key + '=' + cookies[key]);
}
return list.join('; ');
},
set: function(value)
{
var split = value.split('=');
var key = split[0].trim();
if(/* YOUR FILTER HERE */)
{
return;
}
cookies[key] = split[1];
}
});
return function()
{
delete document.cookie;
for(var key in cookies)
{
document.cookie = key + '=' + cookies[key];
}
};
}
var detach = hijackCookies();
// Do something with cookies or let 3rd party code run
// ...
detach();
[Fiddle](注意:重新加载整个页面并点击“运行”不相同!)
在Firefox 38.0.1和Chrome 42.0.2311.152中进行了测试。