这是一个很长的,
被要求帮助客户修复他们当前项目的一些错误。需要修复的是一份工作清单页面。您有一个作业列表,单击一个,如果激活了JavaScript,则会调用AJAX来将作业的详细信息动态加载到现有元素中(DIV#emploi_details)。如果没有激活JS,它只需重新加载包含作业详细信息的页面(不太重要)。
我跳到他们的实验室服务器上,在开发网站上工作。
基本上,IE7(起初)没有显示通过$()。load()加载的内容。 IE6与innerHTML一起工作顺利。请求已发送,我每次都会收到回复。我收到数据,我可以提醒()它并看到它,但实际的内容转储不起作用。 Safari,Firefox,没问题。我正在加载信息的DIV#emploi_details元素有一个CSS显示:none;在其样式表中,并在加载内容后显示(其他不是那么重要的细节)。
show_emploi = function(id, succ_id)
{
$('#emploi_details').fadeOut(800, function() {
var $$ = $(this);
$$.load('emploi_<?php echo $data['lang']; ?>.php', { job_details: 1, ajax: 1, id: id, succ: succ_id, random: (new Date().getTime()) }, function(data, status){
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();
});
这很有效。在所有浏览器中包括IE6和IE7。没问题。很奇怪,但你知道它是否有效并且全面防范,不要问问题。
现在这里的狗屎很奇怪。我认为修复了这个错误并将解决方案应用到了实时网站上......它不起作用。 IE就是不喜欢它。在尝试$ .ajax和所有其他类型的东西后,我最终在实时网站上使用它,感到困惑:
$.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();
});
它适用于所有浏览器,因为没有像准系统JS那样完成任务。必要的是,此修复程序也适用于开发网站。
嵌入内容的功能有些不是针对所有浏览器(显然是服务器)的点击。
总而言之,我的问题是WTF问题。我无法理解为什么一方在一方工作而另一方方面不起作用,甚至为什么它在开始时从未正常工作($()。load())。它显然没有不同的jQuery版本(1.2.6),因为这是我第一次验证框架版本的本能。
无论如何,有趣的神秘IMO。
希望Stackland的人有上帝给出的答案。
由于
答案 0 :(得分:2)
我已经解开了这个谜语!这是我的问题的一个工作示例。 诀窍是在第一次成功后调用另一个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);
}
});
}});
萨吕
答案 1 :(得分:1)
我想你必须在那里。以下是一些可能的失误点:
jQuery.clean:使片段加入DOM的函数。
如果doctype不好,或者某些内容中的响应HTML存在缺陷,则可能会出现这种情况 使clean函数失败的方法,因此不会将任何内容插入到DOM中。
jQuery.fn.append:将呈现的响应片段添加到DOM。
让我们说,因为jQuery使用appendChild而不是将内容添加到DOM innerHTML,一个错误导致IE不知道DOM已经改变而不是渲染 发出信号的变化。当您使用innerHTML时,这将被绕过。
您的问题并不清楚您是否确认注入的HTML确实存在 那里。这可以通过以下方式测试:
$$.empty().append(data);
alert( $$.parent()[0].innerHTML );
$$.show();
jQuery.fn.show():显示结果。
从你的问题中不清楚最终的失败是因为内容 没有被放入DOM,或者它是否只是没有显示?如果 容器有填充和背景,你看到了吗?
show函数比仅添加.style.display='block'
更复杂
元件。如果它认为隐藏了元素,它将不会显示该元素,有时IE可能会显示
有奇怪的想法。用手动设置显示更改替换show()
什么?
很明显,IE处理舞台/开发页面和实际网站的方式有所不同。我的第一步是尝试发现它们之间的区别。 HTTP标题,编码,doctypes,额外的脚本,额外的css,甚至是空格......一些看似微不足道的差异就是这个bug的原因。
在任何情况下,你应该准备一个简化的测试用例,只包含复制这个bug所需的必需品。即使您没有找到适合自己的治疗方法,测试用例也应与bug report to jQuery一起发送。