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


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 相关文章推荐
子窗口、父窗口和Silverlight之间的相互调用
Aug 16 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
Jun 05 Javascript
javascript设计模式--策略模式之输入验证
Nov 27 Javascript
angularjs封装bootstrap时间插件datetimepicker
Jun 20 Javascript
Angular路由简单学习
Dec 26 Javascript
详解打造 Vue.js 可复用组件
Mar 24 Javascript
Vue.js实现模拟微信朋友圈开发demo
Apr 20 Javascript
node.js操作MongoDB的实例详解
Oct 11 Javascript
Vue下路由History模式打包后页面空白的解决方法
Jun 29 Javascript
Vue实现自定义下拉菜单功能
Jul 16 Javascript
Jquery高级应用Deferred对象原理及使用实例
May 28 jQuery
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 Vue.js
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+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
php代码运行时间查看类代码分享
2011/08/06 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
Javascript 继承机制实例
2009/08/12 Javascript
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
Cookies 和 Session的详解及区别
2017/04/21 Javascript
bootstrap模态框远程示例代码分享
2017/05/22 Javascript
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
使用vue-cli脚手架工具搭建vue-webpack项目
2019/01/14 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
python 链接和操作 memcache方法
2017/03/04 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
澳大利亚排名第一的露营和户外设备在线零售商:Outbax
2020/05/06 全球购物
给校长的一封建议书
2014/03/12 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
感情真挚的毕业生求职信
2014/07/19 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
幼儿园教师培训心得体会
2016/01/21 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript