FirefoxおよびChromeのコンソールでは、これは機能します(スクリプトの内容を警告します)。
var script = document.createElement("script");
script.textContent = (
function test() {
var a = 1;
}
);
document.getElementsByTagName("head")[0].appendChild(script);
alert(document.getElementsByTagName("head")[0].lastChild.textContent);
このコードをFirefoxのGreasemonkeyスクリプトとして使用することもできます。
ここで、「プライベートメソッド」を追加したい場合do()はtest()、Firefox / ChromeコンソールでもGreasemonkeyスクリプトでも、機能しなくなります。
var script = document.createElement("script");
script.textContent = (
function test() {
var a = 1;
var do = function () {
var b = 2;
};
}
);
document.getElementsByTagName("head")[0].appendChild(script);
alert(document.getElementsByTagName("head")[0].lastChild.textContent);
これをGreasemonkeyスクリプトで機能させるには、すべてのコードをCDATA タグブロックに配置する必要があります。
var script = document.createElement("script");
script.textContent = (<![CDATA[
function test() {
var a = 1;
var do = function() {
var b = 2;
};
}
]]>);
document.getElementsByTagName("head")[0].appendChild(script);
alert(document.getElementsByTagName("head")[0].lastChild.textContent);
これはGreasemonkeyスクリプトでのみ機能します。Firefox/Chromeコンソールからエラーがスローされます。タグを使用する理由がわかりません。XHTMLを使用していないCDATAため、ここで尊重するXMLルールはありません。
Firefoxコンソール(またはFirebug)で機能させるには、次CDATAのようなタグを付ける必要が<>あり</>ます。
var script = document.createElement("script");
script.textContent = (<><![CDATA[
function test() {
var a = 1;
var do = function() {
var b = 2;
};
}
]]></>);
document.getElementsByTagName("head")[0].appendChild(script);
alert(document.getElementsByTagName("head")[0].lastChild.textContent);
これはChromeコンソールからは機能しません。.toString()多くの人がやっているように()最後に追加してみました]]></>).toString();が、ダメです。
<>と</>をタグ名に置き換えようとしました<foo> </foo>が、それも機能しませんでした。
var do = function(){}別の関数内で定義すると、最初のコードスニペットが機能しないのはなぜですか?
CDATAXHTMLを使用していないのに、回避策として使用する必要があるのはなぜですか?
<> </>また、Greasemonkeyスクリプトを使用せずに動作している場合、Firefoxコンソールに追加する必要があるのはなぜですか?
最後に、Chromeやその他のブラウザのソリューションは何ですか?
編集:
私の悪いことに、私はdoを使用したことがありません-JSにいる間、この例を単純なテキストエディタで作成したので、「do」が予約キーワードであることがわかりませんでした:p
しかし、問題はまだここにあります。私の例ではJavascriptクラスを初期化していません。この新しい例でCDATAは、Greasemonkeyに必要ですがCDATA、E4X<> </>とChromeの間のFirefoxの必要性は失敗します。
var script = document.createElement("script");
script.textContent = (
<><![CDATA[var aClass = new AClass();
function AClass() {
var a = 1;
var aPrivateMethod = function() {
var b = 2;
alert(b);
};
this.aPublicMethod = function() {
var c = 3;
alert(c);
};
}
aClass.aPublicMethod();]]></>
);
document.getElementsByTagName("head")[0].appendChild(script);
質問:なぜですか?