一。Pixy方法受到IE的cache bug影响会闪烁。其实并没有说清楚这个问题,但其实该bug是有条件的,即IE的cache设置为Every visit to the page,而不是默认的Automatically。基本上,只有开发者才会把cache设置为每次访问检查更新,所以这个bug其实不会影响真正的用户 (根据在winxpsp2的ie6下测试,虽然可能仍然调用了一次网络存取的api,但是并没有发生实际的请求,症状就是鼠标有极短时间的抖动,但是图像 不会闪烁)。此外有人发现了一个未公开的方法来让IE对背景图进行缓存: document.execCommand("BackgroundImageCache",false,true)

用这种方法甚至避免了api调用,貌似是直接缓存在IE内存中。

IE6下设置背景图片是不会被真正cache住的,就算服务器做了cache,如果想cache住只能~~~

做过UI设计和开发的人一定知道,IE(不包括IE7)会经常从服务器端重新载入背景图片,好端端的UI界面在IE(不包括IE7)中就这样被折腾着......

Erik发现了一个简单的解决办法(针对IE7以下的IE有效,其实在IE7中已经修复了这个Bug)

程序代码
document.execCommand("BackgroundImageCache", false, true);


今天阅读Ext的源码时发现Jack Slocum已经考虑到了这一点,在Ext.js中给出了他的实现,在其它Ajax框架中应该还没有这种类似的代码,从这一个细节上就能看出Ext的全面~

程序代码
var isIE = ua.indexOf("msie") > -1, isIE7 = ua.indexOf("msie 7") > -1;
// remove css p_w_picpath flicker
if(isIE && !isIE7){
     try{
         document.execCommand("BackgroundImageCache", false, true);
     }catch(e){}
}


今 天阅读幻宇的dreamplayer播放器源码时发现幻宇也针对IE的背景缓存进行了修复,只是他并没考虑到IE7中已经不存在这个现象了,这是 evml.js中的一段相关代码~(顺便嘀咕两句:这家伙,写JS从来不加分号的,以前是这样,现在还是这样,这样的话怎么进行压缩呀,汗~下面的代码按 照我的习惯都已加上分号,哪怕只有两三句而已~)

程序代码
windows.isIE=navigator.appName.indexOf("Microsoft")==0;
if(isIE){
     document.documentElement.addBehavior("#default#userdata");
     document.execCommand("BackgroundImageCache",false,true);
}


A while back a lot of people where covering how to work around the bug that IE always
reloads background p_w_picpaths from the server, leading to your UI flickering.
Dean wrote one and lots of others wrote the same thing. Today, I saw this simple workaround
(from a fellow Googler who worked at Microsoft before):

document.execCommand("BackgroundImageCache", false, true)

Much simpler but makes me wonder why this is not the default setting?


I’ve actually wondered about this “bug” for a while.
I’m sure somewhere along the line this decision was made for a logical reason…
maybe they didn’t anticipate how much background p_w_picpaths would be used, or maybe they thought
there was some use case under which it would be desirable not to cache the background p_w_picpath.
I’m generally not big on overriding things that seem to be design decisions (which this seems to be).
I’ve never really thought this was a “bug”…bugs don’t usually have switches that say “turn off bug”.

转至:http://hi.baidu.com/pplboy/blog/item/af40442604a193128b82a12a.html

(function(){

二。

(function(){   
try{
var userAgent = navigator.userAgent.toLowerCase();
var env = null;
var ver = 0;
env = userAgent.match(/msie ([\d.]+)/);
ver = env ? parseInt(env[1], 10) : 0;
if(ver == 6){
try{
document.execCommand("BackgroundImageCache", false, true);
}catch(e){}
}
}catch(e){}
})();

三。如何判断浏览器的版本号
function Get_IE_Version()      {        var v;        if(navigator.userAgent.indexOf("MSIE 6.0")>0)//IE 6.0        {           v=6;        }         else if(navigator.userAgent.indexOf("MSIE 7.0")>0)//IE 7.0         {          v=7        }        else if(navigator.userAgent.indexOf("MSIE 8.0")>0)//IE 8.0        {          v=8;        }        return v;      } 
或者
通过userAgent获取浏览器信息,主要获取浏览器的类型和版本。 先通过判断特有字符来判断浏览器类型:  var b = {     msie: /msie/.test(ua) && !/opera/.test(ua),     opera: /opera/.test(ua),     safari: /webkit/.test(ua) && !/chrome/.test(ua),     firefox: /firefox/.test(ua),     chrome: /chrome/.test(ua) };  获取版本信息就比较麻烦,有啊Browser的方法就比较巧妙(有修改):  var vMark = ""; for (var i in b) {     if (b[i]) { vMark = "safari" == i ? "version" : i; break; } } b.version = vMark && RegExp("(?:" + vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0";