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
分享到:
相关推荐
很多同学在项目中都喜欢将数据存储在HTMLElement属性上,如 代码如下: ”some>Test</div> [removed] div.getAttribute(‘data’); // some data [removed] 给页面中div添加了自定义属性“data”及值“some data”。...
- 利用CSS的`transition`和`animation`属性,可以为HTMLElement对象创建平滑的过渡效果。 - JavaScript库如jQuery提供`.animate()`方法,方便进行复杂的动画操作。 7. **DOM操作注意事项**: - 当在事件处理函数...
在实际编程中,我们经常需要对`HTMLElement`对象进行一系列的操作,例如添加子元素、设置属性、修改样式等。然而,有些开发者可能尝试在`HTMLElement`对象上使用`Object.prototype`上的方法,却发现这些方法不起作用...
总的来说,判断一个对象是否为`HTMLElement`元素,我们需要结合`nodeType`属性和尝试操作DOM的手段来确保准确性。这样可以避免因自定义对象的干扰而产生的误判,同时也覆盖了`window`和`document`这两个特殊的DOM...
然后,通过设置`el.innerHTML`属性,我们可以将HTML字符串赋值给这个元素,从而将其转化为包含HTML结构的HTMLElement。 ```javascript el.innerHTML = '<html>...</html>'; ``` 在这个过程中,`innerHTML`属性将...
文章将介绍三种方法来实现这些操作,它们分别是通过HTMLElement对象的属性、通过getAttribute()、setAttribute()和removeAttribute()方法,以及通过attributes属性。 首先,通过HTMLElement类型(对象)的属性来...
为了解决这个问题,我们可以利用"Cypress-style-assertions"来创建自定义的Chai断言,以更方便地测试HTMLElement的样式和尺寸属性。 首先,让我们理解什么是Chai。Chai是一个流行的JavaScript断言库,提供了多种...
OnEventMixin 只需一个简单的mixin,即可... class MyFoo extends HTMLElement { // This just provides a way to trigger a custom event connectedCallback ( ) { this . addEventListener ( "click" , ( ) => {
- `dataset`属性是一个只读属性,返回一个DOMStringMap对象,用于访问元素的数据属性。 ```javascript element.classList.add('active'); ``` #### 用户交互 - **`hidden`**、**`click()`** 和 **`...
可以直接使用context-element通过提供HTML页面上arrays or object的属性data到context-element元件。 您可以通过在context-element内部创建模板来确定数据的显示方式。 安装 从CDN < script src =" ...
`<script>`标签对应的DOM接口为`HTMLScriptElement`,继承自`HTMLElement`。其主要属性包括: - **`src`**: 字符串,表示脚本文件的URL。 - **`async`**: 布尔值,表示脚本是否异步加载。 - **`defer`**: 布尔值,...
首先,最直接的方式是通过HTMLElement对象的属性来获取和设置元素的标准特性。例如,使用document.getElementById()方法获取到具体的DOM元素后,可以直接通过这个元素对象的属性来访问或修改其属性值。如: - 获取...
- **禁用排序**:对于某些列,可以通过添加特定的类名或属性来禁用排序功能。 ### 性能优化 - 对于大数据量的表格,可以考虑使用虚拟滚动或分页技术,避免一次性加载所有数据导致性能下降。 - 如果表格数据是从...
在WebBrowser控件加载页面后,使用WebBrowser的Document属性来获取HtmlDocument对象,然后通过该对象的All属性查找特定的HtmlElement对象。找到对应元素后,可以为其click事件添加一个HtmlElementEventHandler类型的...
这里的`HTMLMetaElement`继承自`HTMLElement`,并且包含了三个属性: 1. **`name`**:获取或设置`name`属性的值。 2. **`httpEquiv`**:获取或设置`http-equiv`属性的值。 3. **`content`**:获取或设置`content`...
继承自 EventTarget 对象的还有 Node 对象,Node 对象是 DOM 树中的基本单元,表示文档中的一个节点,例如元素、属性、文本等。 Node 对象有多种类型,每种类型都有其特定的属性和方法。例如,Element 对象继承自 ...
这里定义了`<base>`元素作为`HTMLElement`的子类,并且拥有`href`和`target`两个可读写属性。 #### 使用规则 1. **唯一性**:每个HTML文档只能包含一个`<base>`标签。如果存在多个`<base>`标签,则只有第一个会被...
如果HTMLElement在某些浏览器中是函数类型,或者在不支持HTMLElement的浏览器中,就需要回退到使用属性检查的方法。通过这种方式,可以实现一个健壮的判断方法。 下面是一个示例代码段,展示了如何编写这样的函数:...
元素的属性,如文本内容、样式等,可以通过`_innerText`、`style`等属性获取或修改。 提取元素的具体步骤如下: 1. 确保网页已完全加载,通常在`WebBrowser.DocumentCompleted`事件处理程序中操作。 2. 使用`...