2012-01-24 53 views
2

我使用下面的jquery hijaxing。它非常整洁,因为它假定大多数链接“想要”拼接,但让那些不通过“nohijax”类别“退出”的链接。 它为什么偶尔会失败?尼斯hijax偶尔失败

$("#content a:not(.nohijax), #footer a:not(.nohijax)").live("click", function() { 
    $.get($(this).attr("href"), function (response) { 
     $("#content").replaceWith($("#content", response));    
    }); 
    return false; 
}); 

它可以在Chrome 100%,100%,在IE9中我的机器上,但在IE经常出现故障的其他机器。失败并不一致。即使在一台“失败”的机器上,hijaxing大部分时间都在工作,但突然间一个点击链接会出现“无所事事”,因为旧内容不会被新的内容取代。 “在新标签中打开”始终有效,表明新内容确实已发送。

我试着在这里研究这个问题。必须小心使用.not()和.live(),但我相信我有这个权利。另外,被替换的元素(这里是一个带有id =“content”的div)不能是body元素的直接子元素。它不是(其间还有另一个div)。

如果没有明显的吼叫者,我该如何追踪发生了什么? (我是JavaScript和浏览器开发的新手)。谢谢。

回答

1

它很好用console.log();找出你要返回的数据。例如,console.log(response)将在浏览器的开发工具控制台中显示数据。

前。

$("#content a:not(.nohijax), #footer a:not(.nohijax)").live("click", function() { 
    $.get($(this).attr("href"), function (response) { 

     console.log(response); 

     $("#content").replaceWith($("#content", response));    
    }); 
    return false; 
}); 

至于.live功能不能正常工作,我觉得可能是IE 8及以下具有该功能的问题。使用.click()可能会更好,除非要在页面加载后填充要使用的html锚点。

如果您使用的是最新版本的jquery 1.7,不赞成使用.live()方法,但如果您不使用1.7,建议您使用.delegate()代替。 http://api.jquery.com/live/

+1

感谢您的快速反应安德烈,它已经把我在正确的轨道上,我已经做了使用.on()代替.live()的小测试,它取代了jquery 1.7。很好地工作,但我没有时间在原始上下文中检查它;我会报告它是否解决了这个问题。还要感谢console.log提示。对不起,我不能投票回复你的回复,因为我是新人。 – EyeNine

0

这似乎是一个缓存问题,我已经用these techniques之一解决了。

我用了console.log,发现新鲜的内容和旧的一样。在清除浏览器缓存后,hijaxing工作。话虽如此,但它在Chrome中从未出错,我看不到IE如何认为缓存内容与请求的URL匹配。无论如何它现在工作。

在情况下,它是非常有用的,这里是我的脚本更新为使用jQuery的1.7和。对():

$(document).on("click", "#content a:not(.nohijax), #footer a:not(.nohijax)", function() { 
    $.get($(this).attr("href"), function (response) { 
     $("#content").replaceWith($("#content", response)); }); 
    return false; }); 
+0

非常好看 –