MSIE:jQuery';s append()/html()不起作用,求助于getElementById().innerHTML

MSIE:jQuery';s append()/html()不起作用,求助于getElementById().innerHTML,jquery,internet-explorer,append,innerhtml,getelementbyid,Jquery,Internet Explorer,Append,Innerhtml,Getelementbyid,这是一个很长的 前提 他被叫去帮助一个客户修复他们当前项目中的一些错误。需要修复的是一个作业列表页面。您有一个作业列表,单击其中一个,如果激活了JavaScript,就会发出一个AJAX调用,将作业的详细信息动态加载到现有元素(DIV#emploi_details)中。如果没有激活JS,它只需重新加载包含作业详细信息的页面(不太重要) 我跳上他们的实验室服务器去开发网站 问题 基本上,IE7(起初)没有显示通过$().load()加载的内容。IE6在innerHTML中工作顺利。请求被发送,我每

这是一个很长的

前提 他被叫去帮助一个客户修复他们当前项目中的一些错误。需要修复的是一个作业列表页面。您有一个作业列表,单击其中一个,如果激活了JavaScript,就会发出一个AJAX调用,将作业的详细信息动态加载到现有元素(DIV#emploi_details)中。如果没有激活JS,它只需重新加载包含作业详细信息的页面(不太重要)

我跳上他们的实验室服务器去开发网站

问题 基本上,IE7(起初)没有显示通过$().load()加载的内容。IE6在innerHTML中工作顺利。请求被发送,我每次都得到回复。我收到数据,我可以提醒它并看到它,但实际的内容转储不起作用。Safari,Firefox,没问题。我正在加载信息的DIV#emploi#u details元素有一个CSS显示:none;在样式表中,并在加载内容后显示(其他不太重要的细节)

show\u emploi=函数(id,成功id)
{
$('emploi_details')。淡出(800,函数(){
变量$$=$(此);
$$.load('emploi_uu.php',{job_udetails:1,ajax:1,id:id,suc:suc_uid,random:(new Date().getTime())},函数(数据,状态){
if(isIE6)document.getElementById('emploi_details')。innerHTML=data;
$$.show();
});
$('#bgContent').fadeOut();
});
}
解决方案 起初我的印象是,$().load()可能只是出了问题,所以我将它改为$.get(),以便更好地控制加载内容的操作

$.get('emploi_<?php echo $data['lang']; ?>.php', { job_details: 1, ajax: 1, id: id, succ: succ_id, random: (new Date().getTime()) }, function(data, status){
    $$.empty().append(data).show();
});
$.get('emploi_uu.php',{job_udetails:1,ajax:1,id:id,suc:suc_uid,random:(new Date().getTime())},函数(数据,状态){
$$.empty().append(data.show();
});
这很有效。在所有浏览器中,包括IE6和IE7。没问题。很奇怪,但是你知道如果它有效并且是完全可靠的,不要问问题

情节扭曲 这就是狗屎变怪的地方。我认为错误已经修复,并将解决方案应用到了实时网站上。。。它不起作用。我就是不喜欢。在尝试了$.ajax和所有其他类型的东西后,我感到困惑,最终在live网站上使用了以下内容:

$.get('emploi_<?php echo $data['lang']; ?>.php', { job_details: 1, ajax: 1, id: id, succ: succ_id, random: (new Date().getTime()) }, function(data, status){
    document.getElementById('emploi_details').innerHTML = data;
    $$.show();
});
$.get('emploi_uu.php',{job_udetails:1,ajax:1,id:id,suc:suc_uid,random:(new Date().getTime())},函数(数据,状态){
document.getElementById('emploi_details')。innerHTML=数据;
$$.show();
});
而且它可以在所有浏览器上运行,因为没有什么比barebones JS更能完成任务了。当然,此修复程序也适用于开发人员网站

“待续” 在嵌入内容的功能中,有一点并不是针对所有浏览器(显然是服务器)的

总而言之,我的问题是WTF的问题。我不明白为什么一个在一边工作,而另一边却不工作,甚至不明白为什么一开始它就不能正常工作($().load())。很明显,jQuery版本(1.2.6)并没有什么不同,因为验证框架版本是我的第一反应

不管怎样,我觉得很有趣

希望斯塔克兰的人能得到上帝赐予的答案


谢谢

我想你一定要去。以下是一些可能的故障点:

  • jQuery.clean:生成添加到DOM中的片段的函数

    如果doctype不正确,或者如果响应HTML在某些方面有缺陷,则可能出现这种情况 使clean函数失败的方法,因此没有任何东西可以插入DOM

  • jQuery.fn.append:将呈现的响应片段添加到DOM中

    比方说,因为jQuery使用appendChild而不是appendChild向DOM添加内容 innerHTML,一个错误导致IE不知道DOM已经更改并且没有呈现 信号改变了。当您使用innerHTML时,这将被忽略

    您的问题不清楚您是否验证了注入的HTML确实是正确的 那里这可以通过以下方式进行测试:

    $$.empty().append(data);
    alert( $$.parent()[0].innerHTML );
    $$.show();
    
  • jQuery.fn.show():显示结果

    你的问题不清楚最终的失败是否是因为内容 没有被放入DOM中,或者只是没有被显示?如果 容器有填充物和背景,你们看到了吗

    show函数比仅仅在屏幕上添加
    .style.display='block'
    更复杂 元素。如果它认为该元素是隐藏的,它将不会显示该元素,即有时可能会显示该元素 有奇怪的想法。将show()替换为手动设置display是否会更改 有什么事吗

很明显,IE对待stage/dev页面和live站点的方式存在差异。我的第一步是试图发现它们之间的区别。HTTP标题、编码、doctype、额外脚本、额外css,甚至空白。。。一些看似微小的差异是导致此错误的原因


在任何情况下,您都应该准备一个简化的测试用例,其中只包含复制此bug所需的基本需求。即使您没有找到一种您满意的治疗方法,测试用例也应该随您的邮件一起发送。

我已经解开了这个谜!这是我的问题的一个有效例子。 诀窍是在第一次成功后调用另一个AJAX,这将以某种方式覆盖innerHTML的问题。 谢谢你们帮我找到了正确的方向

我希望这将帮助一些人,因为到目前为止,我还没有看到一个有效的解决方案。 我还将联系jQuery以获取以下信息:P

$.ajax({
url:'modifyarticle.php',
type:'POST',
data:{
 id:this.id,
 article:'something',
 mode:'single',
 action:'delete'},
cache:false,
success:function(msg) {
 alert(msg);$.ajax({
  url:'getall.php',
  type:'GET',
  cache: false, 
  success: function(data) {
   $('#output').html(data);
  }
 });
}});

敬礼

感谢您的详细回复。事实上,我忘了提到我在将内容附加到DOM之后执行了测试(您建议的警报调用),IE会显示元素为空。我也尝试过不使用jQuery.fn.show()(它只是在左侧添加了一个虚线边框),并在默认情况下保持元素的显示,但仍然没有内容可以显示
$.ajax({
url:'modifyarticle.php',
type:'POST',
data:{
 id:this.id,
 article:'something',
 mode:'single',
 action:'delete'},
cache:false,
success:function(msg) {
 alert(msg);$.ajax({
  url:'getall.php',
  type:'GET',
  cache: false, 
  success: function(data) {
   $('#output').html(data);
  }
 });
}});