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


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参考实例2.0 用jQuery选择元素
Apr 07 Javascript
JS控制阿拉伯数字转为中文大写示例代码
Sep 04 Javascript
深入理解JS中的变量及作用域、undefined与null
Mar 04 Javascript
三个js循环的关键字示例(for与while)
Feb 16 Javascript
jQuery实现的导航下拉菜单效果
Jul 04 Javascript
Java与JavaScript中判断两字符串是否相等的区别
Mar 13 Javascript
JS实现移动端实时监听输入框变化的实例代码
Apr 12 Javascript
利用JS hash制作单页Web应用的方法详解
Oct 10 Javascript
详解Vue组件之作用域插槽
Nov 22 Javascript
从0搭建vue-cli4脚手架
Jun 17 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
Jul 28 Javascript
详解ES6 中的Object.assign()的用法实例代码
Jan 11 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_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
JavaScript多线程详解
2015/08/12 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
使用PYTHON接收多播数据的代码
2012/03/01 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
杭州联环马网络笔试题面试题
2013/08/04 面试题
财务会计应届生求职信
2013/11/24 职场文书
自动化专业职业生涯规划书范文
2014/01/16 职场文书
大学生个人事迹材料
2014/01/21 职场文书
校长寄语大全
2014/04/09 职场文书
支部鉴定材料
2014/06/02 职场文书
2014年团支部工作总结
2014/11/17 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
redis限流的实际应用
2021/04/24 Redis
只用20行Python代码实现屏幕录制功能
2021/06/02 Python