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(){}
別の関数内で定義すると、最初のコードスニペットが機能しないのはなぜですか?
CDATA
XHTMLを使用していないのに、回避策として使用する必要があるのはなぜですか?
<>
</>
また、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);
質問:なぜですか?