【问题标题】:JavaScript not executing on Ajax loaded content (no jQuery)JavaScript 没有在 Ajax 加载的内容上执行(没有 jQuery)
【发布时间】:2012-12-12 21:28:48
【问题描述】:

我遇到了一个问题,我正在使用 JavaScript 将 ajax HTML 内容加载到我的页面上的元素中,并尝试在加载的内容中执行 JavaScript,这不起作用。

我没有(也不能)在这个项目中使用 jQuery。

我用来加载 ajax 内容的 JavaScript 如下所示:

var loadedobjects = "";
var rootDomain = "http://" + window.location.hostname;

function ajaxPage(url, containerId){
    var pageRequest = false;
    pageRequest = new XMLHttpRequest();

    pageRequest.onreadystatechange = function(){
        loadpage(pageRequest, containerId);
    }

    preventCache = (url.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime();
    pageRequest.open('GET', url+preventCache, true);
    pageRequest.send(null);
}

function loadpage(pageRequest, containerId){
    if (pageRequest.readyState == 4 && (pageRequest.status==200 || window.location.href.indexOf("http") == -1)){
        document.getElementById(containerId).innerHTML = pageRequest.responseText;
    }
}

如您所见,我将(HTML 页面的)URL 传递给函数ajaxPage()

ajaxPage() 函数在单独的 .js 文件中被调用,如下所示:

ajaxPage('test.html', 'ajax-wrapper');

哪个有效,test.html 正在加载到 id 为“ajax-wrapper”的元素中,但 test.html 页面正在运行。

这是 test.html 页面的样子(只是纯 HTML):

<div class="t-page-title">
    View Thread
</div>

<script>
    alert('hello');
</script>

即使是加载的 HTML 上的简单 alert('hello'); 也不会触发。该页面没有被缓存,所以这不是问题。如果我使用 jQuery,我会知道该怎么做,但我对找到仅 JavaScript 的解决方案感到有些困惑。有什么建议吗?

【问题讨论】:

  • 这段代码实际上是如何调用的?现在它实际上并没有任何事情。
  • 在单独的 .js 文件 ajaxPage('test.html', 'ajax-wrapper'); 中调用 ajaxPage 函数,该文件正在工作,正在加载 test.html 内容,但加载的内容中没有 javascript 工作内容
  • test.html 中的具体内容是什么?
  • test.html 只是 html 内容,没什么花哨的

标签: javascript ajax


【解决方案1】:

当您使用 innerHTML 时,标签会被复制到目标元素,但不会执行脚本。您需要额外的 eval 步骤来执行脚本。

jQuery 有一个名为 globalEval 的函数,如果没有 jQuery,你需要自己编写。

[更新] 以下是 iframe 的变体,可能有助于解决您的问题:http://jsfiddle.net/JCpgY/

在你的情况下:

ifr.src="javascript:'"+pageRequest.responseText+"'";

div 的标准行为:http://jsfiddle.net/JCpgY/1/

【讨论】:

  • globalEval jQuery 函数是否在所有 jQuery ajax 函数(get/ajax/load 等)上调用?我假设它使用 eval() 的名称,如果可能的话,我宁愿远离...
  • 不是在每个 ajax 函数上,而是在 $.load 上调用它,它完全符合您的要求。没有 eval 就很难执行脚本。
  • 谢谢,我确实使用eval() 让它工作了,但现在我在使用innerHTML 之类的东西时遇到了问题,因为当eval() 被触发时,HTML 内容还不存在(无法将属性“innerHTML”设置为 null)
  • 好吧,看看我的更新是否有帮助。使用eval,我认为您需要在html加载后提取脚本标签并对其进行逐个评估。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多