通过 AJAX 加载脚本标签

9

我有一个div标签,通过ajax调用填充了脚本,但是脚本没有执行。

有没有办法让脚本执行?


有关这个问题是否有可用的代码? - miku
非常模糊的问题。请提供代码和示例。 - mauris
<script>alert('works');</script> -- 被转储到客户端的 div 标签中。 - Ian Vink
ASP.NET 2.0 更新面板是一项技术。 - Ian Vink
更新面板是吗?你需要通过ScriptManager.RegisterClientScriptBlock来添加这些脚本。框架会在将它们插入到DOM中时专门发送,以便客户端可以对其进行eval操作。 - Crescent Fresh
5个回答

10
如果你使用 jQuery 的 .html 方法,它会解析脚本标签并对其进行评估:
$("div").html('<script type="text/javascript">alert("This should work")</script>');

如果不能使用jQuery,你可以使用以下方法之一自己编写代码:(1)使用正则表达式,或者(2)解析DOM树并查找脚本标签。(#2是jQuery的实现方式)


jQuery需要被触发,如果我将其包含在发送回客户端的有效负载中,它将无法运行,因为ajax下载的脚本不会启动。例外情况:我可以在脚本标记中设置defer标签,IE将运行它,但这只适用于x%的用户。 - Ian Vink
这也是为什么 AJAX 请求中的脚本标签不会以响应的 HTML 中它们所在的位置结束的原因。 - Ikke

3

将内容与代码分离始终是一个好主意。通过 AJAX 加载内容,通过插入 <script> 标签加载代码。如果您正在使用 jQuery,则可以使用 $.getScript() 动态加载脚本。


2
我猜,你正在直接将脚本标签写入innerHTML中。
这样做是行不通的。
document.body.innerHTML+="<script>alert(1)</scr"+"ipt>"; 

你需要像这样使用DOM函数编写代码

var tag = document.createElement("script");
tag.innerHTML="alert(1)";
document.body.appendChild(tag); //can be append to any object other than body

或者更好地使用jQuery


问题在于脚本被包含在 Ajax 载荷中,并在 DIV 内发送到客户端。我无法让脚本在到达客户端后启动,因此存在一个鸡生蛋的问题。 - Ian Vink
嗨,在Ajax返回中,是什么类型的结果?只有JavaScript代码吗?还是包括script标签?如果只有JavaScript代码,你可以使用eval;如果包括script标签,你可以使用我在帖子中提供的示例,并将document.body更改为你的div标签,然后添加到那里。 - YOU
能否更新您的帖子,提供更多信息,例如您的网站和更多解释?因为人们会注意到并且他们也可以找出您当前的问题。敬礼 - YOU

1

make a callback after ajax load completes like:

function load_scripts(element_id) {

    if (!document.getElementById) return;

    var elmt = document.getElementById(element_id);
    if (!elmt) return;

    var scripts = elmt.getElementsByTagName('script');
    if (!scripts) return;

    var file = null;
    var fileref = null;
    for (var i = 0; i < scripts.length; i++) {
        file = scripts[i].getAttribute('src');
        if (file) {
            fileref = document.createElement('script');
            fileref.setAttribute('type', 'text/javascript');
            fileref.setAttribute('src', file);
            document.getElementsByTagName('head').item(0).appendChild(fileref);
        } else {
            eval(scripts[i].innerHTML);
        }
    }
}

1
如果您设置 div 的 innerHtml,则应执行脚本标记。我正在使用 $(“#divid”).load()加载动态内容,并且脚本标记确实会执行。
如果使用纯 JavaScript 无法解决问题,请尝试使用 JQuery。

遗憾的是,情况并非如此。在通过Ajax传递到客户端的html有效载荷中的脚本不会被执行。 - Ian Vink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接