有没有办法替换“窗口”或“文档”对象?我基本上想要的是提供某种 JavaScript 代理,我想防止用户在页面上获得“一些”(只有一些!这很重要)DOM 元素。“用户”是指任何第三个 patty 脚本。
我可以做这个:
document.getElementsByTagName("a")
//NodeList[129]
document.getElementsByTagName = function(){}
//function (){}
document.getElementsByTagName("a")
//undefined
但是我可以做些什么document.all
来替换 DOM 对象字段以使其仅返回 DOM 元素的“某些”?
UPD:如果有办法用一些 JavaScript 对象替换“文档”对象,这会更好
UPD2:我不在乎您的方法是否不适用于“旧”浏览器。所以我对任何适用于“A”分级机的解决方案都很满意
UPD3:我知道 JavaScript 中不存在 100% 的安全性,我不想阻止黑客“HACKING”,我知道这是不可能的,我想阻止开发人员为我的“自制”编写“插件”框架,做愚蠢的事情..
UPD4:好的,我无法替换 Document 或 Window,但我至少可以替换所有可用于返回“DOM”元素的“字段”或“函数”吗?像“document.getElementById”或“document.all”?
UPD5:用户@pebbl
建议的东西“接近”我想要的东西
function a(window, document){
/// in here window and document should be numerics
alert(window);
alert(document);
}
a(123,456);
但他的解决方案有一个大问题http://jsfiddle.net/kRLax/
UPD6-7:这是“完美”的一个(至少对我来说)
function Fx(){return function(){}}
function SafeThis(that){
if (that == window) {
return fakeWindow;
} else if (that = document) {
return fakeDocument;
} else {
return that;
}
}
var fakeDocument = {
write: function(a){ document.write(a) }
}
var fakeWindow = {
document: fakeDocument
}
var moduleA = function(Function, window, document, eval){
document.write(window + "<br>");
var f = new Function("return this");
document.write(f() + "<br>");
var win = (function(){return this;})();
document.write(win + "<br>");
var e = eval("this");
document.write(e + "<br>");
document.write(this + "<br>");
document.write(window + "<br>");
document.write(document + "<br>");
this.a = 1;
document.write(JSON.stringify(this));
};
var moduleA_Fx = '!' +
moduleA.toString().replace(/\bthis\b/g,"SafeThis(this)") +
'(Fx,fakeWindow,fakeDocument,Fx)';
document.write(moduleA_Fx + "<br><br>");
eval(moduleA_Fx);