2

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

- 例子 -

我使用 AJAX 加载在我的页面上我有这个脚本:

<script type="text/javascript">
        function go(){
            alert('1');
        }
    </script>
<a href="javascript:void();" onClick="go();">GO!!!</a>

没发生什么事。

- 编辑 -

如果我打开 Google Chrome 的调试器:“Uncaught ReferenceError: go is not defined” 并且 <script> 标签找不到

4

3 回答 3

2

浏览器似乎不会解析<script>通过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>

服务器上的文档ajax.json如下所示:

{
  "js": "window.bar = function (){ console.log(\"bar\"); return false; }",
  "html": "<p><a href=\"#\" onclick=\"bar();\">Log a message</a></p>"
}

如果您选择此路线,您必须:

  • 命名你的函数:MyApp.foo = function (){ ... };,或
  • 将您的函数显式添加到全局命名空间:window.foo = function (){ ... };.

这是因为eval在当前范围内执行,因此您的函数定义继承了该范围并且不会全局可用。在我的示例中,我选择了后一个选项,因为它只是一个简单的示例,但您应该知道为什么这是必要的。

请务必阅读JavaScript 的 eval() 何时不邪恶?如果您决定自己实施。

于 2012-02-11T18:24:06.457 回答
0

我认为了解更多关于如何进行 Ajax 调用和加载内容的细节会很有帮助。也就是说,有几点需要注意:

  • javascript:void() 的语法无效。它应该是 javascript:void(0)。就此而言,在锚标记的 href 上使用 javascript:void() 通常是不好的做法。有些浏览器不支持它。如果必须使用标签,请将 href 设置为 # 并添加“return false;” 到点击事件。
  • 在这种情况下,无论如何您都应该使用按钮标签而不是 a 标签。
  • 鉴于您提供的内容,它应该可以工作(除了 void() 的语法错误)
于 2012-02-11T18:18:09.343 回答
0

如果我要这样做,我会使用 jquery 的加载调用。这负责进行 ajax 调用,并为脚本/无脚本元素解析标签。

如果您不想使用 jquery,我建议您上网查找 jquery load 方法的作用,并为您的 ajax 调用实现与事件处理程序相同的功能。

于 2012-02-11T18:40:18.553 回答