2011-03-10 66 views
6

如果我有这样的HTML如何将alpha过滤器添加到任何HTML元素并将其他过滤器保留在IE中?

<img src="aaa.png" id="a" style="filter: alpha(opacity=100)"/> 

那么这在IE6

document.getElementById("a").filters.alpha.opacity = 60; 

JavaScript的工作,但如果没有样式设置

<img src="aaa.png" id="a" style=""/> 

的JavaScript抛出一个错误“filters.alpha为空或不是对象

This code works

document.getElementById("a").style.filter = "alpha(opacity=60)"; 

但是随后应用于图像的其他滤镜被覆盖。所以问题是:如何将alpha过滤器添加到任何HTML元素并将其他过滤器保留在IE中?

编辑我想纯JavaScript(jQuery的不)解决方案

回答

8

不幸的是,在我看来,你只能通过style.filter属性添加新的元素,与filters你只能操纵已有的。

filter是一个集合对象,你可以在这里找到文档:filters Collection。它给你一个很好的和简单的方式与您现有过滤器玩,你可以把他们和关闭(enabled),等等。

例如,你可以使用

obj.filters.item("DXImageTransform.Microsoft.Alpha").opacity=20; 

或者(如果阿尔法是你第一滤波器声明)

obj.filters.item(0).opacity=20; 

CLASSES

大多数时候,你最好将过滤器声明存储在CSS中的某些类下,并且只使用JS来分配正确的类而不是操作style值直接。

+0

不是。如果没有设置Alpha过滤器并且没有任何反应(至少在我的IE6测试中),那么您建议的代码会引发异常。你可以使用style.filter + = ... - 但在这种情况下,字符串越来越多。 – 2011-03-10 17:51:50

+0

哦,误解了......我刚刚给出了一个很好的方式来访问当前的过滤器,但我也强调,使用过滤器不能添加新过滤器。 – kapa 2011-03-10 17:56:24

+0

让我换一下这个... – kapa 2011-03-10 17:57:12

2

你可以给你想要的过滤器n多,但只要保持他们追加一个接一个用空格隔开后。例如,

STYLE="filter:progid:DXImageTransform.Microsoft.MotionBlur(strength=50) 
     progid:DXImageTransform.Microsoft.Alpha(opacity=60);" 

检查此链接更多:http://msdn.microsoft.com/en-us/library/ms532847%28v=vs.85%29.aspx

我希望这能回答你的问题。

+0

是的,这很有用。但如何通过JavaScript添加过滤器? – 2011-03-10 14:29:13

4

一些测试后,我带着这个解决方案

var filter = function(obj,f,params) { 
    var found, nf, dx = "DXImageTransform.Microsoft."; 

    // check if DXImageTransform.Microsoft.[Filter] or [Filter] filter is set 
    try { nf = obj.filters.item(dx+f); found = true; } catch(e) {} 
    if(!found) try { nf = obj.filters.item(f); found = true; } catch(e) {} 

    // filter is set - change existing one 
    if(found) { 
    nf.Enabled = true; // if exists, it might be disabled 
    if(params) for(var i in params) nf[i] = params[i]; 
    } 

    // filter is not set - apply new one 
    else { 
    nf = ""; 
    if(params) for(var i in params) nf+= i.toLowerCase()+"="+params[i]+","; 
    if(params) nf = "("+nf.substr(0,nf.length-1)+")"; 
    obj.style.filter+= "progid:"+dx+f+nf+" "; 
    } 

    // hasLayout property hack 
    if(!obj.style.zoom) obj.style.zoom = 1; 
}; 

var obj = document.getElementById("a"); 
if(document.body.filters) filter(obj,"Alpha",{Opacity:50}); 

我希望这个作品,如果有人发现问题,请告诉我。

来源

obj.filters财产http://msdn.microsoft.com/en-us/library/ms537452(VS.85).aspx

filter.Alpha http://msdn.microsoft.com/en-us/library/ms532967(VS.85).aspx

+0

不错的编码规则。我几乎认为你的代码样本被混淆了! – StefanNch 2014-05-01 08:53:41

相关问题