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


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 相关文章推荐
Valerio 发布了 Mootools
Sep 23 Javascript
比较全面的event对像在IE与FF中的区别 推荐
Sep 21 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
Dec 31 Javascript
深入探秘jquery瀑布流的实现
Jan 30 Javascript
微信小程序中hidden不生效原因的解决办法
Apr 26 Javascript
浅谈React组件之性能优化
Mar 02 Javascript
javascript闭包的使用之按钮切换功能
Aug 30 Javascript
Vue中的methods、watch、computed的区别
Nov 26 Javascript
js中的数组对象排序分析
Dec 11 Javascript
jquery 验证用户名是否重复代码实例
May 14 jQuery
详解javascript void(0)
Jul 13 Javascript
canvas多重阴影发光效果实现
Apr 20 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中的Memcache详解
2014/04/05 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
利用Jquery实现可多选的下拉框
2014/02/21 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
用Python配平化学方程式的方法
2019/07/20 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
学点简单的Django之第一个Django程序的实现
2021/02/24 Python
华为c/c++笔试题
2016/01/25 面试题
laravel使用redis队列实例讲解
2021/03/23 PHP
企业安全生产目标责任书
2014/07/23 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
二十年同学聚会致辞
2015/07/28 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript