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


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 相关文章推荐
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
jQuery绑定事件不执行但alert后可以正常执行
Jun 03 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
Oct 09 Javascript
javascript中new关键字详解
Dec 14 Javascript
AngularJS表格添加序号的方法
Mar 03 Javascript
jQuery插件开发发送短信倒计时功能代码
May 09 jQuery
js自定义瀑布流布局插件
May 16 Javascript
详解从新建vue项目到引入组件Element的方法
Aug 29 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
Sep 01 Javascript
inquirer.js一个用户与命令行交互的工具详解
May 18 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
May 29 Javascript
JavaScript实现PC端横向轮播图
Feb 07 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
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
多个$(document).ready()的执行顺序实例分析
2014/07/26 Javascript
javascript 数组操作详解
2015/01/29 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
常用的javascript设计模式
2017/01/11 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
js断点调试经验分享
2017/12/08 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
python支持断点续传的多线程下载示例
2014/01/16 Python
Python 创建子进程模块subprocess详解
2015/04/08 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
基于OpenCV python3实现证件照换背景的方法
2019/03/22 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
基于Python实现扑克牌面试题
2019/12/11 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
用pandas划分数据集实现训练集和测试集
2020/07/20 Python
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
2019年Java面试必问之经典试题
2012/09/12 面试题
2014群众路线学习笔记
2014/11/06 职场文书
python缺失值的解决方法总结
2021/06/09 Python