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


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 相关文章推荐
使用js正则控制input标签只允许输入的值
Jul 29 Javascript
JavaScript设置首页和收藏页面的小例子
Nov 11 Javascript
js单独获取一个checkbox看其是否被选中
Sep 22 Javascript
JQuery中$.each 和$(selector).each()的区别详解
Mar 13 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
Nov 25 Javascript
轻松学习Javascript闭包
Mar 01 Javascript
Node.js安装配置图文教程
May 10 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
Oct 26 Javascript
Vue项目查看当前使用的elementUI版本的方法
Sep 27 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
May 16 Javascript
基于Vue实现电商SKU组合算法问题
May 29 Javascript
请求时token过期自动刷新token操作
Sep 11 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
PHP伪静态页面函数附使用方法
2008/06/20 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
Textarea输入字数限制实例(兼容iOS&安卓)
2017/07/06 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Python基于DES算法加密解密实例
2015/06/03 Python
Python中的条件判断语句基础学习教程
2016/02/07 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
国际领先的学术出版商:Springer
2017/01/11 全球购物
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
马云的职业生涯规划之路
2014/01/01 职场文书
二年级评语大全
2014/04/23 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
我收到了德劲DE1107
2022/04/05 无线电
golang操作rocketmq的示例代码
2022/04/06 Golang