运行AJAX调用的javascript代码
我的网站使用pushState加载页面。我有一个问题,我想在其中一个页面上使用javascript,但不能,因为它用AJAX加载所有内容。那我该怎么办?有人告诉我一些关于“parseScript”的事情,但我找不到足够的信息 --范例-- 我使用AJAX加载 在我的页面上,我有以下脚本:运行AJAX调用的javascript代码,javascript,ajax,parsing,pushstate,Javascript,Ajax,Parsing,Pushstate,我的网站使用pushState加载页面。我有一个问题,我想在其中一个页面上使用javascript,但不能,因为它用AJAX加载所有内容。那我该怎么办?有人告诉我一些关于“parseScript”的事情,但我找不到足够的信息 --范例-- 我使用AJAX加载 在我的页面上,我有以下脚本: <script type="text/javascript"> function go(){ alert('1'); } </s
<script type="text/javascript">
function go(){
alert('1');
}
</script>
<a href="javascript:void();" onClick="go();">GO!!!</a>
函数go(){
警报(“1”);
}
什么也没发生
--编辑--
如果我打开Google Chrome的调试器:
“未捕获引用错误:未定义go”
而且标签不在哪里可以找到我认为,关于如何进行Ajax调用和加载内容,有一点更详细的信息会有所帮助。也就是说,有几件事值得注意:
- javascript:void()的语法无效。它应该是javascript:void(0)。因此,在锚定标记的href上使用javascript:void()通常是不好的做法。有些浏览器不支持它。如果必须使用标记,请将href设置为#,并在单击事件中添加“return false;”李>
- 无论如何,在这种情况下,您应该使用按钮标记而不是标记
- 根据您提供的内容,它应该可以工作(除了void()的语法错误)
targetElement.innerHTML添加到文档中的
元素内容。这可能就是你遇到的
最好的解决方案是使用经过良好测试的框架(如jQuery)来解决此类问题。他们已经知道了如何安全、正确地将脚本注入DOM。除非你绝对不能为图书馆腾出带宽,否则重新发明轮子是没有意义的
解决这个问题的一种方法是在Ajax响应中将JavaScript与HTML分离,或者发出两个请求(可能较慢),或者在JSON对象中构造JavaScript和HTML(可能更难维护)
下面是一个例子:
<script>
function load_content(){
var req = new XMLHttpRequest();
req.open("GET", "ajax.json", true);
req.onreadystatechange = function (e){
if (req.readyState === 4){
if (req.status === 200){
// these three lines inject your JavaScript and
// HTML content into the DOM
var json = JSON.parse(req.responseText);
document.getElementById("target").innerHTML = json.html;
eval(json.js);
} else {
console.log("Error", req.statusText);
}
}
};
req.send(null);
}
</script>
<a href="#" onclick="load_content()">Load more stuff</a>
<div id="target"></div>
如果选择此路线,您必须:
- 为函数命名名称空间:
MyApp.foo=function(){…}代码>,或
- 显式地将函数添加到全局命名空间:
window.foo=function(){…}代码>
这是因为eval
在当前范围内执行,因此您的函数定义将继承该范围,并且不会全局可用。在我的示例中,我选择了后一个选项,因为这只是一个微不足道的示例,但是您应该知道为什么这是必要的
如果您决定自己实现,请务必阅读。如果我要这样做,我将使用jquery的加载调用。
这将负责放置ajax调用,并解析脚本/无脚本元素的标记
如果您不想使用jquery,我建议您联机查找jquery加载方法的功能,并实现与ajax调用事件处理程序相同的功能。它认为您正在寻找eval(),我不确定您为什么不能在通过ajax加载的内容上使用JavaScript。您能更具体地说明您遇到的问题吗?千万不要使用eval()。这是等待中的安全噩梦。相反,构建系统,使客户端函数处理json结果。事实上,json是一种轻量级数据传输语言。它不是JavaScript,也不打算这样使用。“从不”有点激进。jQuery和Prototype在某种程度上都依赖于eval
,这正是为了达到这个目的。是否有其他方法将脚本注入DOM?或者你是指我使用eval
将JSON字符串解析为本机对象吗?肯定不是将JSON解析为函数。再说一次,这是个坏习惯。坦白地说,我从来没有使用过它,而且我在做一些相当复杂的事情。向dom添加脚本肯定还有其他选择。从使用src引用附加脚本元素,到使用jsonp,再到使用可怕的document.write(使用编写开始和结束脚本标记的已知技巧。您甚至可以使用服务器端代码生成js输出,只要其内容类型返回为application/javascript或text/javascript。@MadManMoon我更新了我的示例,以使用JSON.parse
,并包含有关eval
和rollin的其他注意事项我使用这个$.get('files/'+url+'.php',函数(data,textStatus,xhr)
{
"js": "window.bar = function (){ console.log(\"bar\"); return false; }",
"html": "<p><a href=\"#\" onclick=\"bar();\">Log a message</a></p>"
}