1

我想通过 XMLHttpRequest 在另一个页面中加载此代码 (1)

<input type="text" onkeypress="info(event)"/>
<script>
  function info(e) { console.log(e.keyCode); }
</script>

这(2)是我尝试过的方式......

<div id="x"></div>
<script>
  var xhr = new XMLHttpRequest();
  xhr.onload = handleResponse.bind(xhr);
  xhr.open("POST","test.php",true);
  xhr.send();

  function handleResponse() {
    var x = document.getElementById("x");
    x.innerHTML = this.responseText;
    var js = x.getElementsByTagName("script")[0];
    eval(js.innerText);
  }
</script>

...这是我在按键时遇到的错误:

Uncaught ReferenceError: info is not defined

为什么info()自从它的定义被评估后就找不到了?如果(2)不知道(1),如何在按键上触发信息?没有 jQuery。

按照 Mike 的建议,我创建了这个问题来解决导致对这个问题的解释的分离问题。

4

1 回答 1

2

(为 es202020 编辑,因为 JS 自 2013 年以来发生了巨大变化,而旧答案现在是反模式。不要使用eval


范围。您没有对其进行评估window,而是将其添加到该函数的范围内,handleResponse因此它不会存在于 handleResponse 之外。此外,在这种情况下,您根本不需要eval,只需创建一个脚本元素并添加:

function handleResponse(evt) {
  const s = document.createElement(`script`);
  s.textContent = evt.responseText;
  document.head.appendChild(s);

}

浏览器已经知道如何解释脚本,但是head如果您希望它们执行而不是在页面加载后作为非活动 DOM 节点插入,则需要将元素添加到 。

不要使用eval().

于 2013-06-22T14:09:06.410 回答