「ウィンドウ」または「ドキュメント」オブジェクトを置き換える方法はありますか?私が基本的に望んでいるのは、ある種のJavaScriptプロキシを提供することです。ユーザーがページ上に「いくつか」(一部のみ!これは重要です)のDOM要素を取得しないようにします。「ユーザー」とは、3番目のパティスクリプトを意味します。
私がすることができます:
document.getElementsByTagName("a")
//NodeList[129]
document.getElementsByTagName = function(){}
//function (){}
document.getElementsByTagName("a")
//undefined
しかし、document.all
DOMオブジェクトフィールドを置き換えて、DOM要素の「一部」のみを返すようにするにはどうすればよいですか?
UPD:'document'オブジェクトをJavaScriptオブジェクトに置き換える方法がある場合、これははるかに優れています
UPD2:あなたのメソッドが「古い」ブラウザで動作しないかどうかは気にしません。だから私は「A」の採点者で動作するすべてのソリューションで良いです
UPD3:JavaScriptには100%のセキュリティが存在しないことを知っています。ハッカーが「ハッキング」するのを防ぎたくありません。それは不可能です。開発者が、私の「自家製」に「プラグイン」を書くのを防ぎたいのです。フレームワーク、愚かなことをするために..
UPD4:わかりました、ドキュメントもウィンドウも置き換えることはできませんが、少なくとも「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);
しかし、彼の解決策には1つの大きな問題があります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);