运行AJAX调用的javascript代码

运行AJAX调用的javascript代码,javascript,ajax,parsing,pushstate,Javascript,Ajax,Parsing,Pushstate,我的网站使用pushState加载页面。我有一个问题,我想在其中一个页面上使用javascript,但不能,因为它用AJAX加载所有内容。那我该怎么办?有人告诉我一些关于“parseScript”的事情,但我找不到足够的信息 --范例-- 我使用AJAX加载 在我的页面上,我有以下脚本: <script type="text/javascript"> function go(){ alert('1'); } </s

我的网站使用pushState加载页面。我有一个问题,我想在其中一个页面上使用javascript,但不能,因为它用AJAX加载所有内容。那我该怎么办?有人告诉我一些关于“parseScript”的事情,但我找不到足够的信息

--范例--

我使用AJAX加载 在我的页面上,我有以下脚本:

<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>"
}