通过jquery ajax调用评估脚本



有人能告诉我为什么下面的函数可能不起作用吗。get调用应该返回html和<script>的混合。我试图找到脚本元素,然后评估里面的内容。但它似乎不起作用。

有什么想法吗?

function showRecaptcha()
{
alert("test1");
var file = "recapatchatest.php";
$("div#commentWindow").get("../commentfiles/" + file, function(data)
{
  var script = data.getElementsByTagName("script");
  $("div#commentWindow").html(eval(script));
});
}

您没有使用正确的.get()方法。你必须区分这两个:

  • .get()-从jquery对象中匹配的元素中检索指定索引处的DOM元素。

  • jQuery.get()($.gt())-使用HTTP get 从服务器加载数据

所以你显然应该使用第二个。

请注意,data的内容将不是可以在其上调用getElementByTagName的DOM元素,它只是一个HTML数据字符串


如果您正试图将html加载到现有元素中,您应该考虑使用.load(),它正是您想要的:

.load(url[,data][,complete(responseText,textStatus,XMLHttpRequest)])返回:jQuery

描述:从服务器加载数据,并将返回的HTML放入匹配的元素中。

我认为您应该尝试$.get而不是$("div#commentWindow").get

通过AJAX加载HTML页面,解析出<script>标签,然后eval对其进行处理,听起来是个坏主意。

当添加到DOM时,<script>标记将自动运行。因此,只需将data附加到DOM,脚本就会运行。

或者,将脚本放在它们自己的文件中,并用$.getScript加载它们。

此外,$("div#commentWindow").get应更改为仅$.get

$.get("../commentfiles/" + file, function(data)

尝试更换

$("div#commentWindow").get("../commentfiles/" + file, function(data)
{
  var script = data.getElementsByTagName("script");
  $("div#commentWindow").html(eval(script));
});

带有

$.get("../commentfiles/" + file, function(data){
  var script = data.getElementsByTagName("script");
  $("div#commentWindow").html(eval(script));
});

您的原始代码实际上并没有发出ajax请求。

此外,要获得脚本,请尝试将其作为成功处理程序:

var $content = $("#commentWindow");
$.get("../commentfiles/" + file, function(data){
    var html = data;
    html = html.replace(/<script/ig, "<div class='script'").replace(/</script/ig, "</div>");
    var html = $(html);
    var scripts = html.filter("div.script").add($(html).find("div.script")).detach();
    $content.html(html);
    scripts.each(function(){
        var $this = $(this), s = document.createElement("script");
        if ($this.attr('src') != "") {
            s.src = $this.attr('src');
        } else {
            s.nodeValue = $this.text();
        }
        $content[0].appendChild(s);
    });
});

上面的代码已经根据注释进行了更新,现在可以正确地处理脚本包含和内联脚本标记。

jQuery的get方法将一个字符串传递给回调函数。data.getElementsByTagName不起作用,因为getElementsByTagName不是String对象实例的有效方法。

我不知道你为什么使用eval方法。该方法适用于JavaScript代码,即使忽略了对script变量的赋值存在缺陷,您的意图也是在HTML SCRIPT元素的数组上调用eval

最后一个问题是,jQuery的html方法会忽略您传递给它的任何HTML标记字符串中的SCRIPT标记

如果您想将SCRIPT标记添加到DOM中,则需要使用普通的JavaScript并完全绕过jQuery。

最新更新