图像替换新技术 状态域方法


Posted in Javascript onJanuary 28, 2010

参看Dave Shea's excellent summary ,Paul Young 在分析现存的所有方法的优缺点之后,提出了一种新的方法,并将其命名为“状态域方法”(The StateMethod),本文将详细介绍该方法的原理:

该方法检查图片是否禁用,并不是请求服务器上的图片,因为那样会导致一次额外的http请求。作者创建了一个巧妙的方法。

在大多数浏览器中,Image对象可以实例化并追溯到一个无效的URL(http://0),这样很容易检测Image的状态。如果禁用,onerror事件将触发,在js文件的开头,j建立一个新的图像对象:

var img = new Image();

但是,有两个古怪的浏览器对此方法并不兼容。在Gecko浏览器中,不论Image是否被禁用。Onerror事件总是 被触发。所幸的是,另外一种可行的方案可以解决此问题--给html元素附加一个无效的背景图片,然后通过getComputedStyle方法获得 style属性。如果Image禁用,其属性为none或url(invalid-url:):

 if (img.style.MozBinding != null)
 {
   img.style.backgroundImage = "url(" +document.location.protocol + "//0)";
   var bg = window.getComputedStyle(img,'').backgroundImage;

   if (bg != "none" && bg !="url(invalid-url:)" || document.URL.substr(0, 2) == "fi")
   {
    document.enableStateScope("images-on", true);
   }
 }

另外一个富有挑战性的浏览器是safari,如果请求是一个无效的URL,safari的状态栏将出现错误提示,但页面 布局不受任何影响。如果用户的状态栏处于开启状态,报错将一直持续,这很不专业,同样,作者研究了另外一种可行的方案。如果Image来自于1*1的 gif图像,且被数据编码。如果Image禁用,其宽度将为0,以下为在safari中测试的情况:

 else
 {
   img.style.cssText ="-webkit-opacity:0";
   if (img.style.webkitOpacity == 0)
   {
     img.onload = function()
     {
      document.enableStateScope("images-on", img.width > 0);
     }
     img.src = 
      "data:image/gif;base64," +
      "R0lGODlhAQABAIAAAP///wAAACH5BAE" +
      "AAAAALAAAAAABAAEAAAICRAEAOw==";
   }
}

最后,对于其它浏览器,在开始初始化Image对象时,仅仅需要测试onerror触发事件。

   else
   {
     img.onerror = function(e)
     {
      document.enableStateScope("images-on", true);
     }
     img.src = "about:blank";
   }

状态域是可以切换的

可以创建一个系统让用户在文本和替代图像之间切换。

翻译原文:http://www.denisdeng.com/?p=235

英文原文:http://www.sitepoint.com/article/image-replacement-state-scope/

Javascript 相关文章推荐
FormValid0.5版本发布,带ajax自定义验证例子
Aug 17 Javascript
javascript 关闭IE6、IE7
Jun 01 Javascript
关于juqery radio写法的兼容性问题(新老版本jquery)
Jun 14 Javascript
解析瀑布流布局:JS+绝对定位的实现
May 08 Javascript
Flexigrid在IE下不显示数据的有效处理方法
Sep 04 Javascript
JS判断字符串包含的方法
May 05 Javascript
JavaScript对Cookie进行读写操作实例
Jul 25 Javascript
深入理解react-router@4.0 使用和源码解析
May 23 Javascript
javascript ES6 新增了let命令使用介绍
Jul 07 Javascript
利用Vue实现移动端图片轮播组件的方法实例
Aug 23 Javascript
Angularjs使用过滤器完成排序功能
Sep 20 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
Aug 17 Javascript
javascript innerText和innerHtml应用
Jan 28 #Javascript
使用JavaScript库还是自己写代码?
Jan 28 #Javascript
js或css实现滚动广告的几种方案
Jan 28 #Javascript
jquery中的sortable排序之后的保存状态的解决方法
Jan 28 #Javascript
javascript面向对象的方式实现的弹出层效果代码
Jan 28 #Javascript
jquery 常用操作方法
Jan 28 #Javascript
jquery 经典动画菜单效果代码
Jan 26 #Javascript
You might like
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
php中设置index.php文件为只读的方法
2013/02/06 PHP
php中session使用示例
2014/03/29 PHP
Yii实现简单分页的方法
2016/04/29 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
微信自定义分享php代码分析
2016/11/24 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
2019/02/28 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
python简单获取数组元素个数的方法
2015/07/13 Python
Python 操作MySQL详解及实例
2017/04/30 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
2014年学校总务处工作总结
2014/12/08 职场文书
我的中国梦主题班会
2015/08/14 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书