我通过ajax将html内容加载到div上(如果重要的话,请使用mootools 1.11和squeezebox)。
在我加载的内容中,我有一些JS操作一些已加载的HTML对象。
一切在FF中都可以正常工作,但是当我在IE中加载它(目前已在IE7上测试)时,代码将失败,并且“null”为null或不是对象。
快速测试表明,由AJAX加载的新元素不在IE DOM中。加载了一个ID为'test'的div,当我运行document.getElementById('test')时,我得到了null。不用说在原始元素上运行getElementById效果很好。
有谁知道如何解决/解决这个问题?
更多信息:
我将代码“准备就绪”放入窗口中。尝试使用“加载”事件,但是IE从未调用它。UPDATE
按照建议,我在IE8上检查了相同的脚本,它具有更好的调试功能。
看来问题确实在时机上。我在Windows的domReady上运行我的代码,它似乎可以立即运行,而无需真正等待DOM准备就绪(在弹出窗口中)。整个页面加载完成后,使用调试器运行相同的脚本即可毫无问题地找到元素。
因此,我想现在的问题是如何使脚本在适当的时间运行。
有任何想法吗?
最佳答案
没有什么可以阻止IE将元素加载到dom中。更新innerHTML属性后也没有“domready”之类的东西。考虑一下:
new Ajax("someurl", {
method: "get",
evalScripts: true,
onComplete: function() {
$("someid").setHTML(this.response.text); // load content.
}
}).request();
现在,这里的问题是,evalScripts是否在onComplete之前或之后运行。我认为您发回的脚本与您用来更新的标记有关吗?
1.11的源代码为:
onComplete: function(){
if (this.options.update) $(this.options.update).empty().setHTML(this.response.text);
if (this.options.evalScripts || this.options.evalResponse) this.evalScripts();
this.fireEvent('onComplete', [this.response.text, this.response.xml], 20);
},
这表示在更新之后和onComplete之前评估脚本,因此使用:
update: $('somediv'),
evalScripts: true
应该工作。如果没有,那么我建议尝试:
new Ajax("someurl", {
method: "get",
onComplete: function() {
$("someid").setHTML(this.response.text); // load content.
this.evalScripts();
// or if it fails still, delay it:
/*
if (window.ie)
(function() {
this.evalScripts();
}).delay(100, this);
*/
}
}).request();