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


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 写类方式之五
Jul 05 Javascript
前台js调用后台方法示例
Dec 02 Javascript
javascript数组随机排序实例分析
Jul 22 Javascript
第七章之菜单按钮图标组件
Apr 25 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
Jul 22 Javascript
Angularjs 实现分页功能及示例代码
Sep 14 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
Sep 29 Javascript
jQuery阻止移动端遮罩层后页面滚动
Mar 15 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
Nov 14 Javascript
使用express搭建一个简单的查询服务器的方法
Feb 09 Javascript
layui 实现自动选择radio单选框(checked)的方法
Sep 03 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
May 18 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
模拟OICQ的实现思路和核心程序(二)
2006/10/09 PHP
php基础知识:控制结构
2006/12/13 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
javascript两段代码,两个小技巧
2010/02/04 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
jQuery实现的进度条效果
2015/07/15 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
js实现点击按钮弹出上传文件的窗口
2016/12/23 Javascript
Vue中的vue-resource示例详解
2018/11/02 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
在Python中使用mongoengine操作MongoDB教程
2015/04/24 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
Python入门之后再看点什么好?
2018/03/05 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
用python读取xlsx文件
2020/12/17 Python
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
HTML5 客户端数据库简易使用:IndexedDB
2019/12/19 HTML / CSS
德国电子商城:ComputerUniverse
2017/04/21 全球购物
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
比较一下entity bean和session bean
2013/12/27 面试题
十佳大学生事迹材料
2014/01/29 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
小学毕业感言200字
2015/07/30 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL