javascript之DOM技术(二)

简介:
javascript之DOM技术(一)

一。样式编程
1.页面中的每一个元素都具有一个style对象,此对象管理元素的CSS样式。这是在IE4.0引入的,后来作为DOM标准被接受。使用方法:
var oDiv=document.getElementById("div1");
alert(oDiv.style.backgroundColor);
style对象拥有一个cssText属性,返回描述元素样式的CSS字符串。

2.样式对象style的方法(IE6并不支持这些方法):
(1)getPropertyValue(propertyName)——返回CSS特性propertName的字符串值,比如this.style.getPropertyValue("background-color");这里的propertyName必须按照CSS的样式定义。

(2)getPropertyPriority()——返回important字符串或者为空
(3)item(index)——返回给定索引处的CSS特性名称
(4)removeProperty(propertyName)——移除某CSS特性
(5)setProperty(propertyName,value,priorty)——按照执行优先级设定CSS特性的值

3.通过隐藏层实现自定义鼠标提示的例子:
< html >
    
< head >
        
< title > Style Example </ title >
          
< script  type ="text/javascript"  src ="detect.js" ></ script >
        
< script  type ="text/javascript"  src ="eventutil.js" ></ script >
        
< script  type ="text/javascript" >
            
function  showTip() {
                
var  oDiv  =  document.getElementById( " divTip1 " );
                oDiv.style.visibility 
=   " visible " ;
                
var  oEvent = EventUtil.getEvent();
                oDiv.style.left 
=  oEvent.clientX  +   5 ;
                oDiv.style.top 
=  oEvent.clientY  +   5 ;
            }

            
function  hideTip() {
                
var  oDiv  =  document.getElementById( " divTip1 " );
                
var  oEvent = EventUtil.getEvent();
                oDiv.style.visibility 
=   " hidden " ;
            }
        
</ script >
    
</ head >
    
< body >
        
< p > Move your mouse over the red square. </ p >
        
< div  id ="div1"  
             style
="background-color: red; height: 50px; width: 50px"
             onmouseover
="showTip()"  onmouseout ="hideTip()" ></ div >

         
< div  id ="divTip1"  
              style
="background-color: yellow; position: absolute; visibility: hidden; padding: 5px" >
            
< span  style ="font-weight: bold" > Custom Tooltip </ span >< br  />
            More details can go here.
         
</ div >
    
</ body >
</ html >

这里使用了我在《 javascript事件模型框架》中摘记的JS文件。实现可折叠区域的道理与此相同,很常用的功能,不再细说。

4.访问样式表,因为style对象只能访问一个元素的CSS样式,而对于<style/>定义的或者外部CSS文件定义的CSS规则没办法访问,这就引出了如何访问样式表的问题。我们可以通过下面的方式访问:
var  cssRules = document.styleSheets[ 0 ].cssRules || document.styleSheets[ 0 ].rules;


document.styleSheets返回页面上所有样式表的引用,标准DOM中规定每个样式表的规则集合叫cssRules,而IE中叫rules,所以我们用上面的表达式来处理浏览器兼容问题。一个访问的例子:
< html >
    
< head >
        
< title > Accessing Style Sheets Example </ title >
        
< style  type ="text/css" >
            div.special 
{
                background-color
:  red ;
                height
:  10px ;
                width
:  10px ;
                margin
:  10px ;
            
}
        
</ style >
        
< script  type ="text/javascript" >
            
function  changeBackgroundColor() {
                
var  oCSSRules  =  document.styleSheets[ 0 ].cssRules  ||  document.styleSheets[ 0 ].rules;
                oCSSRules[
0 ].style.backgroundColor  =   " blue " ;
            }
        
</ script >
    
</ head >
    
< body >
        
< div  id ="div1"  class ="special" ></ div >
        
< div  id ="div2"  class ="special" ></ div >
        
< div  id ="div3"  class ="special" ></ div >
        
        
< input  type ="button"  value ="Change Background Color"  onclick ="changeBackgroundColor()"   />
    
</ body >
</ html >

点击按钮时将三个div的背景色都设置为蓝色。

5.最终样式:顾名思义,就是样式规则(外部定义和内联的)综合计算之后呈现给用户的样式信息,用来告诉我们元素最终是如何显示在屏幕上的。IE和标准的DOM也有区别:
(1)IE中的最终样式称为currentStyle对象,与style对象不同的是它是只读的,你只能读而不能给它赋值。
(2)DOM中的最终样式,通过document.defaultView.getComputedStyle(元素对象,伪元素对象或者null)方法获得

二。innerHTML和innerText
很常用的功能,特别是在AJAX应用中,经常采用的手段是从服务端返回一小段HTML代码,通过innerHTML嵌入某个层当中来动态显示下拉框等。一个比较常见的用法:
oDiv.innertText=oDiv.innerText;
表示从指定元素中删除所有的HTML标签。

三。outerText和outerHTML

与innerHTML和innerText,不过替换的是整个目标节点,仅在IE和opera中支持此特性

四。范围
叫选区也许更为恰当,range用来选择文档的某个部分而不管节点的边界。也有两种的范围实现:DOM和IE的
1.DOM的range
(1)在DOM中创建选区的方法:
var supportDOMRange=document.implementation.hasFeature("Range","2.0");
if(supportDOMRange)
  var oRange=document.createRange();
先判断是否支持DOM,然后使用createRange()方法创建范围

(2)简单选区
考虑下面的代码:
< id ="p1" >< b > hello </ b > world </ p >

我们通过下面的JS代码来访问上面这段代码:
var oRange1=document.createRange();
var oRange2=document.createRange();
var op1=document.getElementById("p1");
oRange1.selectNode(op1);
oRange2.selectNodeContents(op1);

两个范围,通过selectNode和selectNodeContents方法来选区,有什么不同呢?oRange1选中的范围包括<p/>节点以及它的全部子节点,而oRange2只包含op1的子节点和文本节点( 就是"< b > hello </ b > world")。

(3)范围的特性:
<1>startContainer——范围是从哪个节点开始的,也就是第一个节点的父节点
<2>startOffset——在
startContainer的偏移位置。
<3>endContainer——最后一个节点的父节点
<4>endOffset——在
endContainer中范围结束的偏移位置
<5>commonAncestorContainer——startContainer和endContainer都处于哪个最小的节点
演示这些特性的例子:
< html >
    
< head >
        
< title > DOM Range Example </ title >
        
< script  type ="text/javascript" >
            
function  useRanges() {
                
var  oRange1  =  document.createRange();
                
var  oRange2  =  document.createRange();
                
var  oP1  =  document.getElementById( " p1 " );
                oRange1.selectNode(oP1);
                oRange2.selectNodeContents(oP1);
                
                document.getElementById(
" txtStartContainer1 " ).value  =  oRange1.startContainer.tagName;
                document.getElementById(
" txtStartOffset1 " ).value  =  oRange1.startOffset;
                document.getElementById(
" txtEndContainer1 " ).value  =  oRange1.endContainer.tagName;
                document.getElementById(
" txtEndOffset1 " ).value  =  oRange1.endOffset;
                document.getElementById(
" txtCommonAncestor1 " ).value  =  oRange1.commonAncestorContainer.tagName;

                document.getElementById(
" txtStartContainer2 " ).value  =  oRange2.startContainer.tagName;
                document.getElementById(
" txtStartOffset2 " ).value  =  oRange2.startOffset;
                document.getElementById(
" txtEndContainer2 " ).value  =  oRange2.endContainer.tagName;
                document.getElementById(
" txtEndOffset2 " ).value  =  oRange2.endOffset;
                document.getElementById(
" txtCommonAncestor2 " ).value  =  oRange2.commonAncestorContainer.tagName;
            }
        
</ script >
    
</ head >
    
< body >< id ="p1" >< b > Hello </ b >  World </ p >
        
< input  type ="button"  value ="Use Ranges"  onclick ="useRanges()"   />         
        
< table  border ="0" >
        
< tr >
            
< td >
                
< fieldset >
                    
< legend > oRange1 </ legend >
                    Start Container: 
< input  type ="text"  id ="txtStartContainer1"   />< br  />
                    Start Offset: 
< input  type ="text"  id ="txtStartOffset1"   />< br  />
                    End Container: 
< input  type ="text"  id ="txtEndContainer1"   />< br  />
                    End Offset: 
< input  type ="text"  id ="txtEndOffset1"   />< br  />
                    Common Ancestor: 
< input  type ="text"  id ="txtCommonAncestor1"   />< br  />     
                
</ fieldset >
            
</ td >
            
< td >
                
< fieldset >
                    
< legend > oRange2 </ legend >
                    Start Container: 
< input  type ="text"  id ="txtStartContainer2"   />< br  />
                    Start Offset: 
< input  type ="text"  id ="txtStartOffset2"   />< br  />
                    End Container: 
< input  type ="text"  id ="txtEndContainer2"   />< br  />
                    End Offset: 
< input  type ="text"  id ="txtEndOffset2"   />< br  />
                    Common Ancestor: 
< input  type ="text"  id ="txtCommonAncestor2"   />< br  />
                
</ fieldset >
            
</ td >
        
</ tr >
        
</ table >
        
< p >< strong > Note: </ strong >  This example uses DOM ranges and will only work in browsers that support DOM ranges. This example will fail in Internet Explorer. </ p >

    
</ body >
</ html >

(4)复杂选区
通过setStart和setEnd来实现复杂选区,两个方法都接受两个参数:节点引用和偏移量。

(5)与范围对象的交互
<1>deleteContents(),删除范围内容
<2>extractContents,与 deleteContents()相似,只不过返回被删除的文档碎片
<3>cloneContents(),创建范围内容副本
<4>surroundContents(node),插入包围范围的内容
<5>insertNode(node),在选区开头插入节点
<6>cloneRange(),复制范围
<7>detach(),释放系统资源
<8>compareBoundaryPoints()方法,比较范围,两个参数,一个比较规则(Range.START_START,
Range.START_TO_END, Range.END_TO_START, Range.END_TO_END),一个是比较的范围引用


2.IE中的范围
IE的范围并不标准,主要用来处理文本节点,调用<body/>,<button/>,<input/>,<textarea>节点的createTextRange方法来创建范围,建议用document.body.createTextRange()来创建,因为其他元素创建的范围仅能用于它们内部。
(1)简单选区:
同样以下面这段代码为例子:
< id ="p1" >< b > hello </ b > world </ p >

要选择hello,可以使用:
var oRange=document.body.createTextRange();
oRange.findText("hello");

findText方法还可以接受第2个参数,如oRange.findText("hello",1);将选择hello之后再次找到的hello文本节点。
与DOM中的selectNode方法最相似的是IE的moveToElementText()方法,比如我们要选中p1节点以及它的所有子节点:
var  oRange = document.body.createTextRange();
var  oP1 = document.getElementById( " p1');
oRange.moveToElementText(oP1);
alert(oP1.htmlText);


另外,oRange.parentElement()返回选区的父节点。

(2)复杂选区:
move(),moveStart(),moveEnd(),expand()方法实现复杂选区,这些方法都接受两个参数:移动的单位("character","word","sentence","textedit")和移动的单位的个数。

(3)与范围交互
<1>text属性,比如oRange.text="hello";
<2>pasteHTML(),插入HTMl代码,比如oRange.pasteHTML("<em>test</em>");
<3>duplicate(),复制范围
<4>compareEndPoints() 方法,比较范围,第一个参数也是比较规则("StartToStart","StartToEnd,EndToStart","EndToEnd")和比较的范围引用。也可以通过isEqual()和isRange()方法来比较。

3.范围的常见应用,比如搜索引擎中,搜索出来的链接中的关键字用特别的颜色包围起来,另外就是网页广告比较常用。

文章转自庄周梦蝶  ,原文发布时间5.17

boxti
+关注
目录
打赏
0
0
0
0
209
分享
相关文章
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
119 1
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
86 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
探索后端技术:Node.js的优势和实际应用
【10月更文挑战第6天】 在当今数字化时代,后端开发是任何成功软件应用的关键组成部分。本文将深入探讨一种流行的后端技术——Node.js,通过分析其核心优势和实际应用案例,揭示其在现代软件开发中的重要性和潜力。
309 2
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
基于问题“如何监控局域网内的电脑”——Node.js 的 ARP 扫描算法实现局域网内计算机监控的技术探究
在网络管理与安全领域,监控局域网内计算机至关重要。本文探讨基于Node.js的ARP扫描算法,通过获取IP和MAC地址实现有效监控。使用`arp`库安装(`npm install arp`)并编写代码,可定期扫描并对比设备列表,判断设备上线和下线状态。此技术适用于企业网络管理和家庭网络安全防护,未来有望进一步提升效率与准确性。
57 8
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
147 5
.js的dom元素操作
【10月更文挑战第29天】通过灵活运用这些 DOM 元素操作方法,JavaScript 可以实现丰富的网页交互效果,如动态更新页面内容、响应用户操作、创建和删除页面元素等。在实际开发中,开发者可以根据具体的需求和场景,选择合适的 DOM 元素操作方法来实现所需的功能,为用户提供更加流畅和动态的网页体验。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等