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


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 相关文章推荐
用JavaScript编写COM组件的步骤
Mar 17 Javascript
Prototype PeriodicalExecuter对象 学习
Jul 19 Javascript
js获取浏览器的可视区域尺寸的实现代码
Nov 30 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
Oct 29 Javascript
基于javascript实现九宫格大转盘效果
May 28 Javascript
JavaScript之Vue.js【入门基础】
Dec 06 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
Mar 26 Javascript
详解vue的diff算法原理
May 20 Javascript
vue 中swiper的使用教程
May 22 Javascript
微信小程序实现人脸检测功能
May 25 Javascript
通过js示例讲解时间复杂度与空间复杂度
Aug 06 Javascript
创建nuxt.js项目流程图解
Mar 13 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数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
js前端导出Excel的方法
2017/11/01 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
Python爬取读者并制作成PDF
2015/03/10 Python
如何在Python中编写并发程序
2016/02/27 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
Python flask框架post接口调用示例
2019/07/03 Python
python二进制文件的转译详解
2019/07/03 Python
python区块及区块链的开发详解
2019/07/03 Python
python实现布隆过滤器及原理解析
2019/12/08 Python
音频处理 windows10下python三方库librosa安装教程
2020/06/20 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
*p++ 自增p 还是p所指向的变量
2016/07/16 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
实习自我鉴定
2013/12/15 职场文书
淘宝活动总结范文
2014/06/26 职场文书
趵突泉导游词
2015/02/03 职场文书
装修公司管理制度
2015/08/05 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技