有人能告诉我为什么下面的函数可能不起作用吗。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);
});
});
上面的代码已经根据注释进行了更新,现在可以正确地处理脚本包含和内联脚本标记。
get
方法将一个字符串传递给回调函数。data.getElementsByTagName
不起作用,因为getElementsByTagName
不是String
对象实例的有效方法。
我不知道你为什么使用eval
方法。该方法适用于JavaScript代码,即使忽略了对script
变量的赋值存在缺陷,您的意图也是在HTML SCRIPT
元素的数组上调用eval
。
最后一个问题是,jQuery的html
方法会忽略您传递给它的任何HTML标记字符串中的SCRIPT
标记
如果您想将SCRIPT
标记添加到DOM中,则需要使用普通的JavaScript并完全绕过jQuery。