通过jquery ajax调用来评估脚本

时间:2012-02-23 20:20:53

标签: 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));
});
}

5 个答案:

答案 0 :(得分:2)

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

  • .get()(您正在使用的那个) - 从jquery对象中匹配的元素检索指定索引处的DOM元素。

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

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

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


如果您尝试将html加载到现有元素中,则应考虑使用.load(),它完全符合您的要求:

  

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

     

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

答案 1 :(得分:1)

通过AJAX加载HTML页面,解析出<script>标签,eval这些标签听起来不错。

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

或者,将脚本放在他们自己的文件中,然后使用$.getScript加载他们。

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

尝试替换

$("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);
    });
});

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

答案 4 :(得分:0)

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

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

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

如果你想将SCRIPT标签添加到DOM,你将需要使用普通的'vanilla JavaScript并完全绕过jQuery。