替换Javascript代码并运行它

替换Javascript代码并运行它,javascript,Javascript,假设我有以下代码: my_script_data = document.getElementById("id_php_defer__core"); if (my_script_data == undefined) { Alert(request.responseText); // all looks good! my_script_data = document.createElement("script"); my_script_data.setAttribute("id", "i

假设我有以下代码:

my_script_data = document.getElementById("id_php_defer__core");
if (my_script_data == undefined) {
  Alert(request.responseText); // all looks good!
  my_script_data = document.createElement("script");
  my_script_data.setAttribute("id", "id_php_defer__core");
  my_script_data.innerHTML = 'function myinitfunc() { ' + "\n" + request.responseText + "\n" + ' }';
  to = document.head;
  if (to != undefined) {
    to.appendChild(my_script_data);
  }
}
else {
  Alert(request.responseText); // all looks good!
  my_script_data.innerHTML = 'function myinitfunc() { ' + "\n" + request.responseText + "\n" + ' }';
  eval(my_script_data.innerHTML);
}
“request.responseText”实际上是一个Javascript数组声明,设置了很多值

在上面的代码之后,稍后将调用“myinitfunc”

(由于它应该只包含“request.responseText”,所以应该更新全局(!)值数组。)

然而,虽然代码在第一次运行时有效,但后续的运行似乎没有任何作用,所以我做错了什么,但是什么呢?:)

是否每次调用myinitfunc()时都尝试eval()?

标记无法回收。为了解决这个问题,您决定使用
eval

但是(当然是在严格模式下),
eval
。因此,声明的函数不会显示

我强烈反对为此目的使用
eval
。您说过
responseText
包含一个数组。通过稍微调整,您可以使用来处理数据

还可以通过以下方式插入和删除脚本元素:

var s = document.createElement('script');
s.appendChild(document.createTextNode(request.responseText));
// ^ Equivalent to a "global eval"
(document.head || document.getElementsByTagName('head')[0]).appendChild(s);
s.parentNode.removeChild(s);

最初我插入了新标签。这似乎也不起作用。(可能是因为它一次又一次地重新定义了同一个函数?)?这样行吗?(追加新脚本时会运行代码吗?)虽然responseText当前只包含数组中的数据,但将来可能会返回更多数据。但是,我认为目前的问题是,我需要用通过AJAX检索的新数据替换现有数据。(JSON还是没有JSON,我想问题还是一样的?)我也更喜欢保留现有的JS代码,因为它是为接受/使用而构建的:没有延迟的数据/代码加载(都内置在一个大的脚本文件中)、纯JS延迟的数据/代码加载、通过服务器端的JS+PHP延迟的数据/代码加载。(但事实上,我现在得到的只是延迟的数据,而不是代码。)嗨,罗布,太棒了!我回家后第一件事就是试试你的解决方案!谢谢:)@Tom当你以这种方式注入数组时,上一个数组将被覆盖。如果您不想这样做,您可以创建一个自定义函数来解析输入。嗨,Rob,这就是我想要的,替换旧值。理想情况下,我希望在插入/删除脚本元素时也能插入函数。目前这似乎不起作用。明天我将再试一次。正如前面的例子所示,我在检索响应文本时进行评估。您是否建议我尝试innerHTML=eval(…)?我实际上并没有尝试您的代码,但在我看来它只在第一次工作,因为您实际计算了表达式一次,但每次之后它只是函数中的一些随机文本,没有任何意义。对不起,我的回答可能完全不正确,但这是我想到的第一件事。