当前位置: 首页 > 图文教程 > 网络编程 > Javascript > 图像替换新技术 状态域方法

Javascript
javascript IFrame 强制刷新代码
JQuery 学习笔记 选择器之一
JQuery 学习笔记 选择器之二
JQuery 学习笔记 选择器之三
JQuery 学习笔记 element属性控制
Prototype 工具函数 学习
Prototype Selector对象学习
用JQuery 实现AJAX加载XML并解析的脚本
jquery 表单下所有元素的隐藏
javascript 动态table添加colspan\rowspan 参数的方法
利用javascript/jquery对上传文件格式过滤的方法
javaScript 判断字符串是否为数字的简单方法
jquery 将disabled的元素置为enabled的三种方法
javascript 解析后的xml对象的读取方法细解
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
javascript 一个函数对同一元素的多个事件响应
对象特征检测法判断浏览器对javascript对象的支持
javaScript Array(数组)相关方法简述
js 字符串操作函数
JavaScript中null与undefined分析

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-02-27   浏览: 280 ::
收藏到网摘: n/a

熟悉css的开发者一定知道图像替换技术,也深知它的意义,Dave Shea 曾在他的一篇文章对此做了详细的总结 参看Dave Shea's excellent summaryPaul 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";
}

状态域是可以切换的

可以创建一个系统让用户在文本和替代图像之间切换。

查看示例(示例文件由Paul Young提供)

class属性添加到html之上而不是body或其它子元素之上,主要原因在于在图像替换之前,body需要全面加载。如果“image-on”不添加到html之上。当状态域启用时,将会出现闪动。

图像替换技术是css中相当重要的一部分。鉴于现存图像替换技术的缺点,作者花大量时间另辟蹊径,方法独到,值得借鉴。

示例下载tate-scope-image-replacement.zip

翻译原文:http://www.denisdeng.com/?p=235

英文原文http://www.sitepoint.com/article/image-replacement-state-scope/