`
ycyk_168
  • 浏览: 100631 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

【转】關於 IE6/7 不支援 Element 自訂方法屬性繼承的可行解決方案

阅读更多

由 prototype 談起

物件導向語言,支援「繼承」的概念,也就是父物件有的方法及屬性,物件本身也一應具備。於是設計人員可以直接在上層物件定義好一堆自己專屬或改良的方法和屬性,這比設計副程式庫還要來得方便許多。

舉個例子,Array 是 Javascript 中的原型物件,任何需要使用到陣列時,只要宣告:

  1. var ay=new Array();
  2. ay=[];

 

就可以使用陣列所有的方法和屬性,例如 ay.push()。

 

不僅如此,如果你嫌原生 Array 物件方法或屬性不夠時,你還可以自訂,例如:

  1. Array.prototype.sayHello='Hello World';

 

那麼,以下語法的測試結果就會跳出一個 Hello World

  1. Array.prototype.sayHello='Hello World';
  2. var ay=new Array();
  3. alert(ay.sayHello);

 

上例是簡單加了個名為 sayHello 的屬性到 Array 物件中。所以,你就可以用同樣方法,設計出一套屬於自己的,或是你也願意開放出來給大家使用的自訂方法。

自訂物件

同樣的,你也可以自訂物件,並讓物件擁有自己的屬性及方法,如:

  1. myObj=function(){
  2.     this.version='1.0';
  3. }
  4. myObj.prototype.sayHello=function(){
  5.     alert('Hello');
  6. }
  7. var myTest=new myObj();
  8. myTest.sayHello();

 

那麼,有沒有什麼方法,可以一次為所有 HTML 中的元件,加上自定的方法和屬性呢?這時就要來了解一下,瀏覽器對於 HTML 是怎麼對待的。

Element 物件

在使用 DOM 操作處理時,經常會用到一個指令,叫作 createElement(),這個指令相當於在 HTML 文件中加上新的標籤,所以,這些標籤,在瀏覽器眼中,統稱為「Element」,例如:

document.getElementById(node) 這是一個 HTMLDivElement
document.getElementsByTagName('li')[0] 這是一個 HTMLLiElement
document.getElementsByTagName('li') 這是一個 HTMLCollection (由一群 <li> 組成的集合)

注意上列三則,瀏覽器的行為,第三則,是一個集合,而非 Element。

所以,這時就產生一個有趣的物件,叫作 Element,由 id 取得的物件,就是 HTMLxxxElement,xxx 就是標籤種類,如果 xxx 是表單 <form> 那就是 HTMLFormElement,如果是段落 <p> 那就是 HTMLParagraphElement,依此類推。

這些物件中,共同特性就是全部都是 Element,所以,如果能在 Element 上加上自己的方法及屬性,那不就很完美?

是的!如果你腦筋動得快,jQuery 和 ptototype 都是這麼搞的!

然而,世上仍存在數量龐大的 IE6/7

很不幸的,在 IE6/7 (IE8 已經把 Element 列為物件)把前述所有項目都視為 [object],但是是什麼 object 也看不出來,因此,在 IE 6/7 中,沒有辦法對 Element 自訂方法和屬性,如果你在 IE 中測試:

alert(window.Element); 得到的結論是 undefined。

這就造成相當大困擾了。例如,現在想把圖層的高度回傳值,不要帶有 px 單位,一般是這麼寫:

  1. parseInt(document.getElementById(node).style.height);

 

每次都要寫這麼長一串,不太經濟,於是有了快取函式(Cached Function)寫法,也就是 jQuery 和 prototype 的寫法,簡化如下:

  1. $=function(node){
  2.     return document.getElementById(node);
  3. }
  4. Element.prototype.height=function(){
  5.     return parseInt(this.style.height);
  6. }

 

注意:上述只是原理例,並不嚴謹。

如此一來,就可以簡單使用以下語法取得不帶單位的圖層高度:

  1. var h=$(node).height();

 

可惜,這樣的語法,IE6/7 完全不能接受!除非你和我一樣,可以要求客戶不准用 IE,那就不用再看下去了。

解決方案

IE6/7 仍支援繼承(inheritance)只不過不支援 window.Element 而已,如果多花點功夫這麼寫:

  1. $=function(node){
  2.     var elm=document.getElementById(node);
  3.     elm.height=function(){
  4.         return parseInt(this.style.height);
  5.     }
  6.     return elm;
  7. }

 

那就一樣可以用 $(node).height() 來取得物件高度。這個方法,在 FireFox、Safari、Opera、Chrome 也都適用。

原理就是先定義好物件,然後在每個物件加上自訂的方法和屬性。

上例中,只有一個自定方法,效能上就沒太大差別,如果你自定了一大堆方法和屬性,每次呼叫 $(node),就要把這個物件套上一堆辺法和屬性,效能上就差了,如果瀏覽器處理 Javascript 的功力上不足,那執行起來就鈍鈍的。

但如果是直接定義在 Element 的 prototype 中,就不一樣了,透過繼承的特性,每個 $(node ) 被定義出來就自動包含了這些方法和屬性,其效能,便利性自是不可同日而語。

不過,也沒辦法,暫時只能這樣,完整的範例如下:

  1. window.$=function (node){
  2.     if (typeof node == 'string'){
  3.         //如果是字串,取得以 id 為識別的物件
  4.         node=document.getElementById(node);
  5.     }
  6.     if(node!=null &amp;&amp; !node.test){
  7.         //如果不支援 Element 時,就逐一加上自訂方法
  8.         if (!window.Element) {
  9.             __addMethod(node,__methods);
  10.         }
  11.     }
  12.     return node;
  13. }
  14. function __addMethod(elm,obj){
  15.     for (var key in obj) {
  16.         if (typeof elm[key]=='undefined'){
  17.             elm[key]=obj[key];
  18.         }
  19.     }
  20. }
  21. if (window.Element) {
  22.     //支援 Element 的瀏覽器, 直接把方法和屬性加到 Element 中
  23.     __addMethod(Element.prototype,__methods);
  24. }
  25. var __methods={
  26.     //這裡就是自訂方法和屬性了,如
  27.     test:true,
  28.     version:'1.0',
  29.     height:function(){return parseInt(this.style.height);},
  30.     width:function(){return parseInt(this.style.width);}
  31. }

 

上例的自訂屬性中,加了一個 test 屬性,這是一個簡單判別,當 IE 同一 id 再被定義時,如果物件已經存在,就不需要再執行一次宣告自訂方法和屬性的動作。

建議事項

如果你明白了解決方案的原理,再仔細思考,就會發現,每次呼叫 $(node),在 IE 中就要套一堆內容。因此,為避免對瀏覽器消耗過甚,建議這麼寫:

  1. var div=$(node);
  2. div.function1();
  3. div.function2();
  4. div.function3();
  5. .....

Enjoy !

以下為文章回應區

<script type="text/javascript"> <!-- function Check(){ var errorStr; errorstr="strcheck(document.sign.name.value,'姓名')" + strcheck(document.sign.memo.value,'內容') ; if (errorStr.length > 0 ){ alert('發生下列錯誤\n\n'+errorStr); }else{ //alert(document.sign.memo); document.sign.pagetitle.value=top.document.title; document.sign.submit(); } } function strcheck(strvalue,strname){ if (strvalue.length==0){ return strname+'必填!\n'; } else{ return ''; } } function delReply(ID){ var delcode=prompt('Delete Code'); window.location='/Blog/delReply.asp?ID='+ID+'&delcode='+delcode+'&url=/Blog/JavaScript/javascript.element.ie.asp'; } //--> </script>
分享到:
评论

相关推荐

    eWebEditor不支持IE8/IE7的解决方法

    ### eWebEditor不支持IE8/IE7的解决方法 #### 背景与问题描述 eWebEditor是一款广泛应用于网页开发的富文本编辑器,它提供了丰富的功能以帮助开发者轻松实现在线编辑文档的需求。然而,在某些情况下,尤其是在面对...

    IE6/7/8中使用innerHTML清空元素,其子元素也被清空

    本文将深入探讨一个特定的问题,即在Internet Explorer 6、7和8(以下简称IE6/7/8)浏览器中使用`innerHTML`属性清空元素时,其子元素也会被一并清空的特性。这个现象在其他现代浏览器中并不常见,因此了解这一问题...

    div错位解决IE6IE7IE8样式不兼容问题

    本文将详细介绍如何解决div错位问题以及针对IE6、IE7和IE8的样式不兼容解决方案。 #### 一、理解IE6、IE7、IE8的CSS渲染差异 1. **IE6的盒模型问题**:IE6在处理CSS盒模型时存在bug,导致元素的宽度计算出现问题。...

    element-plus(element-plus@2.8.1/element-plus-2.8.1) 本地离线资源

    /npm/element-plus@2.8.1/dist 37.2K /npm/element-plus@2.8.1/es 36.4K /npm/element-plus@2.8.1/lib /npm/element-plus@2.8.1/theme-chalk 394 /npm/element-plus@2.8.1/attributes.json /npm/element-...

    IE6/7/8中Option元素未设value时Select将获取空字符串

    在IE6、IE7和IE8中,如果`&lt;option&gt;`没有`value`属性,它们在用户做出选择后,`&lt;select&gt;`的`value`获取到的是空字符串,这显然与W3C标准不一致。标准规定,如果`&lt;option&gt;`没有`value`,那么`value`应该等于选项的文本...

    CSS完美兼容IE6_IE7_FF的通用方法

    ### CSS完美兼容IE6_IE7_FF的通用方法 在网页设计与开发过程中,浏览器兼容性问题一直是前端开发者面临的重要挑战之一。特别是在早期的Web开发中,如何让网站同时兼容Internet Explorer 6(简称IE6)、Internet ...

    完美解决IE6不支持hover的方法

    然而,通过一些技巧和解决方案,我们确实可以“完美”地解决IE6不支持`hover`的问题。 首先,我们可以使用条件注释来针对IE6提供特定的CSS样式。条件注释是微软在IE5.5至IE9之间引入的一种特有的HTML注释,允许...

    垂直居中布局 Vertical-aligned 应用测试:兼容IE6/8/FF

    在网页设计中,实现元素的垂直居中布局一直是一个常见的挑战,尤其是在需要兼容不同浏览器,尤其是老版本的 Internet Explorer(如 IE6、IE8)时。"垂直居中布局 Vertical-aligned 应用测试:兼容IE6/8/FF"这个主题...

    element-plus(element-plus@2.5.5) 本地离线资源

    element-plus@2.5.5 本地离线资源,适用于没有网络连接、搭建自己的cdn等用途。 All files(包含文件) /npm/element-plus@2.5.5/dist /npm/element-plus@2.5.5/es /npm/element-plus@2.5.5/lib /npm/element-...

    本地引入element不显示图标问题.doc

    ### 本地引入Element UI图标不显示问题解析及解决方法 #### 一、问题背景与概述 在使用Element UI框架进行前端开发时,可能会遇到从特定链接(如:`...

    element-ui@2.15.7.zip

    Element UI 是一个基于 Vue.js 的开源 UI 组件库,它为开发者提供了丰富的组件,用于构建美观、可扩展的用户界面。...总的来说,Element UI@2.15.7 提供了一套完整的前端解决方案,为 Vue.js 开发者带来了极大的便利。

    div错位解决IE6、IE7、IE8样式不兼容问题IE6里DIV错位的问题.doc

    ### DIV错位及IE6/7/8样式不兼容问题详解 #### 一、问题概述 在Web开发中,浏览器兼容性一直是一个重要的考虑因素。不同的浏览器(尤其是早期版本的Internet Explorer)对CSS的支持程度不一,导致同一段代码在不同...

    管理系统系列--vue3-element-admin后台管理系统前端解决方案.zip

    【标题】:“管理系统系列--vue3-element-admin后台管理系统前端解决方案.zip”揭示了这是一个基于Vue3和Element UI构建的后台管理系统的前端实现。Vue3是Vue.js框架的最新版本,提供了性能优化、更好的类型支持和更...

    解决IE6、IE7、IE8、Firefox兼容的两种方案

    标题与描述均提到了“解决IE6、IE7、IE8、Firefox兼容的两种方案”,这指向了在Web开发中一个常见的挑战:如何使网站在不同的浏览器版本间保持一致的表现。尤其是在IE6至IE8这样的老旧浏览器上,由于其对CSS的支持...

    IE6,Ie7,ie8 ,和火狐下的图片上传预览 解决方案

    针对“IE6, IE7, IE8, 和火狐下的图片上传预览解决方案”这一主题,我们将深入探讨如何在这些浏览器中实现一致的图片上传预览功能。 首先,IE6、IE7和IE8是微软Internet Explorer的早期版本,它们对于现代Web标准的...

    javascript DOM Element方法和属性

    DOM Element常用方法和属性,如getElementByID(id)、getElementsByName(name)等等

    IE678个人总结的式样问题

    根据提供的信息,我们可以总结出以下IT知识要点,主要聚焦于IE6、IE7与IE8浏览器中的样式兼容性问题及解决方案: ### 一、IE6/IE7/IE8 浏览器兼容性概述 #### 1. **文档声明与X-UA-Compatible** - 在网页头部加入...

    Element-UI本地引入

    7. **图标处理**:Element-UI使用Web字体图标,因此需要确保浏览器能正确加载`element-icons.ttf`和`element-icons.woff`。通常,这些字体文件的路径也需要在CSS中正确设置。确保你的`index.css`已经处理好这个问题...

    IE8的JavaScript点击事件(onclick)不兼容的解决方法

    为了确保兼容性,通常推荐使用`addEventListener`方法为元素添加事件监听器,但由于IE8不支持`addEventListener`,需要采取其他方法。 根据提供的内容,文章介绍了一种解决该问题的方法,即通过`document....

    开箱即用的前后端一体化解决方案,前端基于Vue3+Element Plus.zip

    标题中的“开箱即用的前后端一体化解决方案”是指一种高度集成的开发框架或模板,旨在简化开发流程,使得开发者能够快速构建功能完备的Web应用。这种解决方案通常包含前后端的所有必要组件,允许开发者在无需从零...

Global site tag (gtag.js) - Google Analytics