В консолях 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);
Использование этого кода в качестве скрипта Greasemonkey для Firefox также работает.
Теперь, если вы хотите добавить «частный метод» 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
tag:
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. Я не понимаю, почему я должен использовать тег CDATA
, у меня нет здесь правил XML, которые нужно соблюдать, потому что я не использую XHTML.
Чтобы это работало в консоли 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?
И зачем мне добавлять <>
</>
для консоли Firefox, если она работает без скрипта Greasemonkey?
Наконец, какое решение для Chrome и других браузеров?
ИЗМЕНИТЬ:
Плохо, я никогда не использовал do-while в JS, и я создал этот пример в простом текстовом редакторе, поэтому я не видел, что «делать» было зарезервированным ключевым словом: p
Но проблема все еще здесь, я не инициализировал класс Javascript в своих примерах. В этом новом примере CDATA
требуется для Greasemonkey, Firefox требуется CDATA
между E4X <>
</>
, а Chrome не работает:
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);
Вопрос: почему?