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


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 相关文章推荐
jQuery中add实现同时选择两个id对象
Oct 22 Javascript
javascript中日期转换成时间戳的小例子
Mar 21 Javascript
JS获取和修改元素样式的实例代码
Aug 06 Javascript
微信小程序获取用户openId的实现方法
May 23 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
Sep 14 Javascript
浅谈Vue 数据响应式原理
May 07 Javascript
详解webpack2异步加载套路
Sep 14 Javascript
React SSR样式及SEO的实践
Oct 22 Javascript
移动端(微信等使用vConsole调试console的方法
Mar 05 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
Sep 05 Javascript
vue3为什么要用proxy替代defineProperty
Oct 19 Javascript
详解JavaScript中Arguments对象用途
Aug 30 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
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
PHP中将数组转成XML格式的实现代码
2011/08/08 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
CSS常用网站布局实例
2008/04/03 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
HTTP 304错误的详细讲解
2013/11/13 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
jquery表单验证插件formValidator使用方法
2016/04/01 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
使用Python的Supervisor进行进程监控以及自动启动
2014/05/29 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
python路径的写法及目录的获取方式
2019/12/26 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
python 常见的排序算法实现汇总
2020/08/21 Python
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
学校七一活动方案
2014/01/19 职场文书
初三班主任寄语大全
2014/04/04 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
怎样写离婚协议书
2015/01/26 职场文书
新闻稿怎么写
2015/07/18 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫