在 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 脚本也可以。
现在,如果想在 Firefox/Chrome 控制台和 Greasemonkey 脚本中添加“私有方法” do()
,test()
它不再起作用:
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 控制台引发错误。我不明白为什么我应该使用CDATA
标签,因为我没有使用 XHTML,所以这里没有要遵守的 XML 规则。
为了使它在 Firefox 控制台(或 Firebug)中工作,我需要CDATA
放入标签,如<>
and </>
:
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和其他浏览器的解决方案是什么?
编辑:
我的错,我从来没有在 JS 中使用过 do-while 并且我在一个简单的文本编辑器中创建了这个示例,所以我没有看到“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);
问:为什么?