不影响子元素的CSS透明度

引用地址:http://younglab.blog.51cto.com/416652/258429

CSS透明度的问题

当我们像父元素中添加子元素的时候,就会发现子元素继承了父元素的透明度。而在某些情况下这是我们不希望发生的。即使你重新设置子元素的透明度为不透明,它仍然会继承父元素的透明度。
解决方法

要怎样解决这个问题呢?我们可以使用绝对定位来使这些元素看起来像父子关系。

查看Demo:http://www.impressivewebs.com/demo-files/css-opacity/css-opacity-demo.html
你会看到,在上面的Demo中左右两边的元素结构看起来好像是一样的。而其实并非如此。左边的例子是实实在在的父子元素关系,所以父元素的透明度会影响到子元素。而右边的例子其实是使用了绝对定位使它们看起来像父子关系,所以父元素的透明度并没有影响到子元素。

你可以向右边的那个例子中添加更多的元素,并且不会被“父元素”的透明度影响,因为他们根本就不是<div id=”alpha_2″></div>的子元素,而是它的兄弟节点,但是使用了绝对定位使它们看起来是它的子元素。

关键点就在设置透明度的元素并非拥有子元素,所以它的透明度属性不会影响到页面上的其他元素。但是,同其他hack方法一样,这种方法也有缺点。

缺点:

这种方法在试图移除父元素透明度对子元素影响的情况下是非常有用的。但是它的缺点限制了它在更多场合下的应用,所以有必要把他们列出来。

1.既然这个元素(设置透明度的元素)不包含任何内容,你必须设置确定的宽度和高度,并且在它所包含内容变化的时候调整尺寸。这个缺点使得在大多数情况下不使用这种hack方法。

2.由于绝对定位的元素并不是“父元素”(指设置了透明度的元素)真正的子元素,要维持这种状况会很困难,尤其是在一些需要继承的项目中。

3.绝对定位元素是在文档流之外的,所以在页面发生变化的时候会发生布局问题。

4.需要一个额外的<div>标签。

Discuz7.2在Firefox3.6不显示主题分类,源码,用户名的解决方法

解决discuz7.2论坛在firefox火狐3.6版本下分类信息和主题分类下拉框无法显示的问题
问题描述:
discuz7.2,在用Firefox/3.6版本发布主题时:
1.如果只开启了分类信息或主题分类,则不显示后面下拉选项。
2.如果同时开启了分类信息和主题分类,则只显示前面的分类信息选项。
3.还有,编辑器右侧的“源码”切换选项也不见了;

正解:
此问题为FF3.6的兼容问题。

修复方法:
在include\js\common.js中
找到 BROWSER.firefox 一行中的
document.getBoxObjectFor &&
去掉后,后台更新缓存。

js获取&设置cookie函数

设置cookie:

function setcookie(cookieName, cookieValue, seconds, path, domain, secure) {
	var expires = new Date();
	expires.setTime(expires.getTime() + seconds);
	document.cookie = escape(cookieName) + '=' + escape(cookieValue)
		+ (expires ? '; expires=' + expires.toGMTString() : '')
		+ (path ? '; path=' + path : '/')
		+ (domain ? '; domain=' + domain : '')
		+ (secure ? '; secure' : '');
}

读取cookie:

function getcookie(name) {
	var cookie_start = document.cookie.indexOf(name);
	var cookie_end = document.cookie.indexOf(";", cookie_start);
	return cookie_start == -1 ? '' : unescape(document.cookie.substring(cookie_start + name.length + 1, (cookie_end > cookie_start ? cookie_end : document.cookie.length)));
}

例:


兼容IE,FF,OP的添加收藏夹(兼容热点)






添加


js简繁体切换代码&javascript在IE和Firefo x中兼容性问题

页面简繁体切换问题,花了两天终于搞定。

网上有两个版本的js代码

1.最常见的那个js文件在ff下面会有问题,原因是ff对childNode属性的支持有问题。版本一:js文件下载

页面代码:<a href=”#nogo” id=”StranLink”>简体</a>

2.还有一个不容易找到的版本,兼容性比较好,推荐。版本二:js文件下载

页面代码:<a id=”st” href=”javascript:st();void 0;” style=”cursor:pointer”>简体中文</a>

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

附:《javascript在IE和Firefo x中兼容性问题》

-、元素查找问题

1. document.all[name]

  (1)现有问题:Firefox不支持document.all[name]

  (2)解决方法:使用getElementsByName(name),getElementById(id)等来替代。

  (3) 在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素(是否还有其它不能取的元素还不知道)。

2. 集合类对象问题

  (1)现有问题:IE中对许多集合类对象取用时可以用 (),但在Firefox只能用[]。

      如:IE中可以使用document.forms(“formName”)来返回名字为”formName”的Form,但在Firefox却行不通。

   (2)解决方法:使用[],上例中可以改为document.forms[“formName”]

3. HTML元素的ID在JavaScript可见

  (1)现有问题:IE中HTML元素中的ID可以作为document的下属对象变量名直接使用。在Firefox中不能。

  (2)解决方法:使用getElementById(“idName”)代替idName作为对象变量使用。

4. eval(idName)取得对象

  (1)现有问题:在IE中,利用eval(idName)可以取得ID为idName的HTML对象,在Firefox中不能。

  (2)解决方法:用 getElementById(idName) 代替 eval(idName)。

5. 变量名与某HTML对象ID相同

  (1)现有问题:在Firefox中,因为对象ID不作为HTML对象的名称,所以可以使用与HTML对象id相同的变量名,IE中不能。

  (2)解决方法:在声明变量时,一律加上var,以避免歧义,这样在IE中亦可正常运行。此外,最好不要取与HTML对象id相同的变量名,以减少错误。

 注:3、4和5都属于同一类的问题。

6. Frame

  (1)现有问题:在IE中可以用window.top.frameId和window.top.frameName来得到该Frame所代表的Window,Firefox中只能用window.top.frameName。

  (2)解决方法:将Frame的Id和Name设置成相同,使用window.top.frameName来访问Frame。

      另外,在mf和ie中都可以使用window.top.document.getElementById(“frameId”)来访问frame标签

并且可以通过window.top.document.getElementById(“testFrame”).src = ‘xx.htm’来切换frame的内容

也都可以通过window.top.frameName.location = ‘xx.htm’来切换frame的内容。

二、DOM操作

1. 设置元素的文本内容。

  (1)现有问题:IE使用innerText,而Firefox使用textContent来设置元素文本内容。

  (2)解决方法:如果文本内容不包含”<“和”>”等特殊字符,可以使用innerHTML。否则,可以使用:

        var child = elem.firstChild;

            if (child != null) elem.removeChild(child);

            elem.appendChild(document.createTextNode(content));

2. parentElement,parent.children

  (1)现有问题:IE可以使用parentElement获得父结点,parent.children得到结点的所有孩子结点。Firefox不支持。

  (2)解决方法:使用parentNode和parent.childNodes。

3. 对childNodes的解释。

  (1)现有问题:IE和Firefox中对childNodes的解释不同,IE不会包含空白文本结点,而Firefox会包含。

  (2)解决方法:使用childNodes过滤文本结点,如下:

      var children = elem.childNodes;

          for (i = 0; i < children.length; i++) {

            if (children[i].nodeType != 3) { // 过滤文本结点

              // …

            }

          }

4. 对document.getElementsByName的解释。

  (1)现有问题:IE中getElementsByName只会检查<input>和<img>元素,而在Firefox下会检查所有元素。

  (2)解决方法:不要使用getElementsByName检查除<input>和<img>之外的元素,如果要获得单个元素,尽量使用getElementById。如果是别的元素用getElementById也可以获得元素数组。

5. 对document.getElementById的解释。

  (1)现有问题:IE中getElementById不仅检查Id属性,也会检查Name属性,当Name属性匹配参数时也会返回该元素。而在Firefox中只会检查Id属性。

  (2)解决方法:尽量保持Id和Name相同,不要让一个元素name属性和另一个元素的id属性相同。

三、事件

1. event.x与event.y问题

  (1)现有问题:在IE中,event对象有x,y 属性,Firefox中没有。

  (2)解决方法:在Firefox中,与event.x 等效的是 event.pageX。可以使用:

      mX = event.x ? event.x : event.pageX;

  (3) event.layerX 在 IE 与 MF 中都有,具体意义有无差别尚未试验。

2. window.event

  (1)现有问题:使用window.event无法在Firefox上运行

  (2)解决方法:原代码(可在IE中运行):

 <input type=”button” name=”someButton” value=”提交” onclick=”javascript:gotoSubmit()”/>

<script language=”javascript”>

function gotoSubmit() {

alert(window.event);    // use window.event

}

 </script>

 新代码(可在IE和Firefox中运行):

<input type=”button” name=”someButton” value=”提交” onclick=”javascript:gotoSubmit(event)”/>

<script language=”javascript”>

 function gotoSubmit(evt) {

 evt = evt ? evt : (window.event ? window.event : null);

  alert(evt);             // use evt

 }

 </script>

3. attachEvent和addEventListener

  (1)现有问题:IE中使用attachEvent来添加事件,Firefox中使用addEventListener。

  (2)解决方法:如下,注意事件参数的区别,一个是click,一个是onclick。

        if (document.attachEvent) document.attachEvent(“click”, clickHandler,false);

        else document.addEventListener(“onclick”,clickHandler);

四、语法

1. const

  (1)现有问题:在IE中不能使用const关键字。如const constVar = 32;在IE中这是语法错误。

  (2)解决方法:不使用const,以var代替。

2. 多余的逗号

  (1)现有问题:firefox中对象文字常量容许多余的逗号,在IE中不允许。下面语句在IE中非法。

      var obj = { ‘key’ : ‘aaa’, }

  (2)解决方法:去掉多余逗号。

五、XML

1. 创建XMLHttpRequest

  (1)现有问题:Firefox使用XMLHttpRequest,IE使用ActiveXObject。

  (2)解决方法:

      if (window.XMLHttpRequest) {

          req = new XMLHttpRequest();

      } else if (window.ActiveXObject) {

          req = new ActiveXObject(“Microsoft.XMLHTTP”);

      }

2. 创建DOM

  (1)现有问题:Firefox和IE创建DOM的方式不同。

  (2)解决方法:

        function createXmlDom() {

          var oXmlDom;

          if (Window.ActiveXObject) { // IE

            oXmlDom = new ActiveXObject(“Microsoft.XmlDom”);

          } else {  // Firefox

            oXmlDom = document.implementation.createDocument(“”, “”, null);

          }

        }

3. 加载XML

  (1)现有问题:如果要加载外部文件IE和Firefox都可以用:

          oXmlDom.async=false;      // 这在Firefox中是必须的

          oXmlDom.load(“test.xml”);

     但是它们加载xml字符串的方式不一样,IE中直接可以使用oXmlDom.loadXML(“<root><child/></root>”),而Firefox要使用DOMParser:

        var oParser = new DOMParser();

          var oXmlDom = oParser.parseFromString(“<root/>”, “text/xml”);

  (2)解决方法:比较好的方法是给Firefox产生的XMLDom加上loadXML方法:

        if (isFirefox) { // 需要浏览器检测

          Document.prototype.loadXML = function(sXml) {

            var oParser = new DOMParser();

            var oXmlDom = oParser.parseFromString(sXml, “text/xml”);

            while (this.firstChild) this.removeChild(this.firstChild);

            for (var i = 0; i < oXmlDom.childNodes.length; i++) {

              var oNewNode = this.importNode(oXmlDom.childNodes[i], true);

              this.appendChild(oNewNode);

            }

          }

        }

      这样在IE和Firefox就可以调用loadXML方法了。

4. XPath支持

  (1)现有问题:IE中可以直接用XmlDOM的selectNodes来根据XPath表示式来选择结点,Firefox则比较复杂,需要使用XPathEvaluator。

     IE:

        var lstNodes = oXmlDom.documentElement.selectNodes(“employee/name”);

        for (var i = 0; i < lstNodes.length; i++) {

          alert(lstNodes[i].firstChild.nodeValue);

        }

     Firefox:

          var oEvaluator = new XPathEvaluator();

          var oResult = oEvaluator.evaluate(“employee/name”, oXmlDom.documentElement, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

          var oElement = oResult.iterateNext();

          while (oElement) {

            alert(oElement.firstChild.nodeValue);

            oElement = oResult.iterateNext();

          }

  (2)解决方法:比较好的方法给Firefox的Element添加selectNodes方法。

        if (isFirefox) { // 需要浏览器检测

            Element.prototype.selectNodes = function(sXPath) {

            var oEvaluator = new XPathEvaluator();

              var oResult = oEvaluator.evaluate(sXPath, this, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

              var aNodes = new Array();

              if (oResult != null) {

                var oElement = oResult.iterateNext();

                while (oElement) {

                  aNodes.push(oElement);

                  oElement = oResult.iterateNext();

                }

              }

              return aNodes;

           }

      }

   这样在IE和Firefox中就都可以调用selectNodes方法了。

5. XSLT支持

  (1)现有问题:IE中可以使用XmlDOM的transferNode方法将其转换成html,而Firefox需要使用XSLTProcessor。

  IE:

        oXmlDom.load(“employee.xml”);

        oXslDom.load(“employee.xslt”);

        var sResult=oXmlDom.transformNode(oXslDom);

    Firefox:

        var oProcessor = new XSLTProcessor();

        oProcessor.importStylesheet(oXslDom);

        var oResultDom = oProcessor.transformToDocument(oXmlDom);       

        var oSerializer = new XMLSerializer();

        var sXml = oSerializer.serializeToString(oResultDom, “text/xml”);

        alert(sXml);

  (2)解决方法:比较好的方法给Firefox的Node添加transferNode方法。

        if (isFirefox) { // 需要浏览器检测

          Node.prototype.transformNode = function(oXslDom) {

          var oProcessor = new XSLTProcessor();

            oProcessor.importStylesheet(oXslDom);

            var oResultDom = oProcessor.transformToDocument(oXmlDom);

            var oSerializer = new XMLSerializer();

            var sXml = oSerializer.serializeToString(oResultDom, “text/xml”);

            return sXml;

          }

        }

   这样在IE和Firefox中就都可以调用transferNode方法了。

6. 在Firefox中,自己定义的属性必须getAttribute()取得

7.在Firefox中没有  parentElement parement.children  而用

               parentNode parentNode.childNodes

   childNodes的下标的含义在IE和MF中不同,Firefox使用DOM规范,childNodes中会插入空白文本节点。

  一般可以通过node.getElementsByTagName()来回避这个问题。

   当html中节点缺失时,IE和Firefox对parentNode的解释不同,例如

   <form>

   <table>

        <input/>

   </table>

   </form>

   Firefox中input.parentNode的值为form, 而IE中input.parentNode的值为空节点

 Firefox中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)

8. body 对象

   Firefox的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在

9. url encoding

在js中如果书写url就直接写&不要写&amp;例如var url = ‘xx.jsp?objectName=xx&amp;objectEvent=xxx’;

frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器

一般会服务器报错参数没有找到

当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&amp;

一般Firefox无法识别js中的&amp;

10. nodeName 和 tagName 问题

  (1)现有问题:

     在Firefox中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象

     有问题(具体情况没有测试,但我的IE已经死了好几次)。

  (2)解决方法:

     使用 tagName,但应检测其是否为空。

11. 元素属性

   IE下 input.type属性为只读,但是Firefox下可以修改