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

HTMLElement属性

阅读更多
HTMLElement IE隐藏了这个属性
在DOM标准中,每个HTML元素都是继承自HTMLElement。比如有如下代码:

window.onload = function(){
    alert(document.body instanceof HTMLElement);
}

会弹出true,表明了HTML的元素是HTMLElement的实例

实际上HTMLElement继承自Element,Element继承自Node,如图:

知道了HTMLElement这个类,就可以很方便的用Prototype来扩展每个HTML元素的方法或者属性。

但是在IE中将这个类隐藏了,不能通过代码访问。为了达到同样的目的,可以通过如下代码来进行修复:

var DOMElement ={
    extend: function(name,fn){//添加名称为name的方法fn
   
        if(!document.all)//除了ie而外的浏览器都能够访问到HTMLElement这个类
            eval("HTMLElement.prototype." + name + " = fn");
        else{
            //    IE中不能访问HTMLElement这个类
            //    为了达到同样的目的,必须重写下面几个函数
            //    document.createElement
            //    document.getElementById
            //    document.getElementsByTagName
            //    这几个函数都是获得HTML元素的方法
            //    修改这些方法,使得通过这些方法获得的每个元素拥有名称为name的方法fn

            var _createElement = document.createElement;
            document.createElement = function(tag){
                var _elem = _createElement(tag);
                eval("_elem." + name + " = fn");//_elem[name] = fn;也可以达到同样的目的
                return _elem;
            }

            var _getElementById = document.getElementById;
            document.getElementById = function(id){
                var _elem = _getElementById(id);
                eval("_elem." + name + " = fn");
                return _elem;
            }

            var _getElementsByTagName = document.getElementsByTagName;
            document.getElementsByTagName = function(tag){
                var _arr = _getElementsByTagName(tag);
                for(var _elem=0;_elem<_arr.length;_elem++)
                    eval("_arr[_elem]." + name + " = fn");
                return _arr;
            }
        }
    }
};
//测试方法
DOMElement.extend("contents",function(){return this.innerHTML});



    在实际使用中,我个人最烦的事情就是在用childNodes的时候,FF下会有#text节点,让人感觉很麻烦,每次都需要手动来过滤一次,通过上面介绍的方法来扩展HTMLElement可以很简单的写出一个公用的方法,以后使用就很方便了:

DOMElement.extend("getSafeChildNodes",
function(){
    var tempNodes = [];
    for(var i=0;i<this.childNodes.length;i++){
        if(this.childNodes[i].nodeName=='#text')
            continue;
        tempNodes.push(this.childNodes[i]);
    }
    return tempNodes;
});

      另外,HTML元素的getElementsByTagName(sTagName)会把这个元素之下所有tagName为sTagName的节点返回, 无论是否是直接的子节点。但是在有些时候我们需要此节点直接的子节点并且满足tagName为sTagName,所以就扩展了一个方法getChildNodesByTagName:

DOMElement.extend("getChildNodesByTagName",
function(tagName){
    var tempNodes = [];
    for(var i=0;i<this.childNodes.length;i++){
        if(this.childNodes[i].nodeName.toLowerCase() == tagName){
            tempNodes.push(this.childNodes[i]);
        }
    }
    return tempNodes;
});

  

      测试这几个方法,有如下HTML代码:

<body>
    <div id="div1">div1</div>
    <div id="div2">
        <div id="div3">
            <div id="div4"></div>
        </div>
        <div id="div5"></div>
        <div id="div6"></div>
    </div>
</body>

      通过如下Javascript代码测试:

onload = function(){
    alert(document.getElementById("div1").contents());
    alert(document.getElementById("div2").getChildNodesByTagName("div").length);
    alert(document.getElementById("div2").getElementsByTagName("div").length);
    alert(document.getElementById("div2").getSafeChildNodes().length);
    alert(document.getElementById("div2").childNodes.length);
}

      第一个方法会相当于innerHTML属性,返回的值为"div1";

      第二个方法会获得子节点中tagName为div的节点的长度,返回值为3(不包括div4);

      第三个方法是返回子节点(包括间接的子节点)中tagName为div的节点的长度,返回值为4(包括div4);

      第四个方法是返回子节点,在ff中过滤掉"#text"节点,在各种浏览器中都返回3;

      第五种方法是js自带的子节点属性,在ff中返回7,在ie中返回3。
  • 大小: 14.7 KB
分享到:
评论

相关推荐

    读jQuery之六 缓存数据功能介绍

    很多同学在项目中都喜欢将数据存储在HTMLElement属性上,如 代码如下: ”some&gt;Test&lt;/div&gt; [removed] div.getAttribute(‘data’); // some data [removed] 给页面中div添加了自定义属性“data”及值“some data”。...

    连续操作HTMLElement对象图文解决方法.docx

    - 利用CSS的`transition`和`animation`属性,可以为HTMLElement对象创建平滑的过渡效果。 - JavaScript库如jQuery提供`.animate()`方法,方便进行复杂的动画操作。 7. **DOM操作注意事项**: - 当在事件处理函数...

    连续操作HTMLElement对象图文解决方法

    在实际编程中,我们经常需要对`HTMLElement`对象进行一系列的操作,例如添加子元素、设置属性、修改样式等。然而,有些开发者可能尝试在`HTMLElement`对象上使用`Object.prototype`上的方法,却发现这些方法不起作用...

    如何判断元素是否为HTMLElement元素

    总的来说,判断一个对象是否为`HTMLElement`元素,我们需要结合`nodeType`属性和尝试操作DOM的手段来确保准确性。这样可以避免因自定义对象的干扰而产生的误判,同时也覆盖了`window`和`document`这两个特殊的DOM...

    将HTML格式的String转化为HTMLElement的实现方法

    然后,通过设置`el.innerHTML`属性,我们可以将HTML字符串赋值给这个元素,从而将其转化为包含HTML结构的HTMLElement。 ```javascript el.innerHTML = '&lt;html&gt;...&lt;/html&gt;'; ``` 在这个过程中,`innerHTML`属性将...

    javascript 三种方法实现获得和设置以及移除元素属性

    文章将介绍三种方法来实现这些操作,它们分别是通过HTMLElement对象的属性、通过getAttribute()、setAttribute()和removeAttribute()方法,以及通过attributes属性。 首先,通过HTMLElement类型(对象)的属性来...

    cypress-style-assertions:创建自定义Chai断言的游乐场我们可以与Cypress一起使用来断言HTMLElement的样式和尺寸属性

    为了解决这个问题,我们可以利用"Cypress-style-assertions"来创建自定义的Chai断言,以更方便地测试HTMLElement的样式和尺寸属性。 首先,让我们理解什么是Chai。Chai是一个流行的JavaScript断言库,提供了多种...

    OnEventMixin:自定义元素的老式内联事件处理程序属性和属性

    OnEventMixin 只需一个简单的mixin,即可... class MyFoo extends HTMLElement { // This just provides a way to trigger a custom event connectedCallback ( ) { this . addEventListener ( "click" , ( ) =&gt; {

    HTML5 元素通用DOM接口

    - `dataset`属性是一个只读属性,返回一个DOMStringMap对象,用于访问元素的数据属性。 ```javascript element.classList.add('active'); ``` #### 用户交互 - **`hidden`**、**`click()`** 和 **`...

    context-element:一个HTMLElement,可以轻松呈现html页面中的数据或数组

    可以直接使用context-element通过提供HTML页面上arrays or object的属性data到context-element元件。 您可以通过在context-element内部创建模板来确定数据的显示方式。 安装 从CDN &lt; script src =" ...

    HTML5 对各个标签的定义与规定:script

    `&lt;script&gt;`标签对应的DOM接口为`HTMLScriptElement`,继承自`HTMLElement`。其主要属性包括: - **`src`**: 字符串,表示脚本文件的URL。 - **`async`**: 布尔值,表示脚本是否异步加载。 - **`defer`**: 布尔值,...

    javascript学习笔记(二十) 获得和设置元素的特性(属性)

    首先,最直接的方式是通过HTMLElement对象的属性来获取和设置元素的标准特性。例如,使用document.getElementById()方法获取到具体的DOM元素后,可以直接通过这个元素对象的属性来访问或修改其属性值。如: - 获取...

    jQuery sortabletable

    - **禁用排序**:对于某些列,可以通过添加特定的类名或属性来禁用排序功能。 ### 性能优化 - 对于大数据量的表格,可以考虑使用虚拟滚动或分页技术,避免一次性加载所有数据导致性能下降。 - 如果表格数据是从...

    HTML5 对各个标签的定义与规定:meta

    这里的`HTMLMetaElement`继承自`HTMLElement`,并且包含了三个属性: 1. **`name`**:获取或设置`name`属性的值。 2. **`httpEquiv`**:获取或设置`http-equiv`属性的值。 3. **`content`**:获取或设置`content`...

    DOM — DOM对象继承关系1

    继承自 EventTarget 对象的还有 Node 对象,Node 对象是 DOM 树中的基本单元,表示文档中的一个节点,例如元素、属性、文本等。 Node 对象有多种类型,每种类型都有其特定的属性和方法。例如,Element 对象继承自 ...

    HTML5 对各个标签的定义与规定:base

    这里定义了`&lt;base&gt;`元素作为`HTMLElement`的子类,并且拥有`href`和`target`两个可读写属性。 #### 使用规则 1. **唯一性**:每个HTML文档只能包含一个`&lt;base&gt;`标签。如果存在多个`&lt;base&gt;`标签,则只有第一个会被...

    如何判断出一个js对象是否一个dom对象

    如果HTMLElement在某些浏览器中是函数类型,或者在不支持HTMLElement的浏览器中,就需要回退到使用属性检查的方法。通过这种方式,可以实现一个健壮的判断方法。 下面是一个示例代码段,展示了如何编写这样的函数:...

    [网络]WebBrowser网页操作(提取元素,自动填表)

    元素的属性,如文本内容、样式等,可以通过`_innerText`、`style`等属性获取或修改。 提取元素的具体步骤如下: 1. 确保网页已完全加载,通常在`WebBrowser.DocumentCompleted`事件处理程序中操作。 2. 使用`...

    web API- DOM.pdf

    ID属性在HTML文档中应当是唯一的,因此这个方法通常返回一个HTMLElement类型的对象。通过ID来选取元素是快速而直接的方法。 4. `document.getElementsByTagName(标签名)`:此方法返回的是一个HTMLCollection对象,...

Global site tag (gtag.js) - Google Analytics