今天在解决bug的同时也不断引入新的bug;delphi和java web两种语言来回切换+各种电话干扰,效率真的很低,晚上在学习下知识作为自己的摘录笔记吧
DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动?
document.documentElement 返回文档的根节点<html>
-----------------------------------------------------------------------------
document.body <body>
-----------------------------------------------------------------------------
document.activeElement 返回当前文档中被击活的标签节点(ie)
-----------------------------------------------------------------------------
event.fromElement 返回鼠标移出的源节点(ie)
-----------------------------------------------------------------------------
event.toElement 返回鼠标移入的源节点(ie)
-----------------------------------------------------------------------------
event.srcElement 返回激活事件的源节点(ie)
event.target 返回激活事件的源节点(firefox)
------------------------------------
当前对象为node
返回父节点:node.parentNode, node.parendElement,
返回所有子节点:node.childNodes(包含文本节点及标签节点),node.children
返回第一个子节点:node.firstChild
返回最后一个子节点: node.lastChild
返回同属上一个子节点:node.nextSibling
返回同属下一个子节点:node.previousSibling
parentNode和parentElement功能一样,childNodes和children功能一样。但是parentNode和childNodes是符合W3C标准的,可以说比较通用。而另外两个只是IE支持,不是标准,Firefox就不支持 ,所以大家只要记得有parentElement和children就行了
------------------------------
节点的操作:
创建节点: document.createElement("div");//好像大都只能用document,不知道还能换成什么
document.createTextNode("fdsafdas");
还有一个创建节点碎片: document.createDocumentFragment();(可以用来减少页面多次刷新)
例如:
var oFragmeng = document.createDocumentFragment(); //先创建文档碎片
for(var i=0;i<10000;i++){
var op = document.createElement("span");
var oText = document.createTextNode(i);
op.appendChild(oText);
oFragmeng.appendChild(op); //先附加在文档碎片中
}
document.body.appendChild(oFragmeng);//最后一次性添加到document中
常用的添加节点:
pnode.appendChild(node);//在节点pnode的子节点后追加node子节点
pnode.insertBefore(newChild, oldChild);//在现有的子节点前插入一个新的子节点
//newChild作为的pnode的子节点插入到其子节点oldChild之前
oldChild为可选项参数,当为null时其效果与appendChild一样,记住这句话,两个参数就不会记倒了
这里注意可没有pnode.insertAfter(),只能自己定义
删除节点: pnode.removeChild(node)
复制节点: pnode.cloneNode(include_all); //include_all为true时,则同时复制所有子节点,为false时,则只复制该节点(注意id也会被复制)
替换节点: pnode.replaceChild(newnode,oldchild)
访问节点::
访问html元素:var oHtml=document.documentElement;
获取head元素:var oHead=oHtml.firstChild;
获取body元素:var oBody=oHtml.lastChild; 或者 var oBody=document.body;
访问指定节点:
熟知的getElementsByTagName(name),getElementsByName(name),getElementById(id)三个方法,不再展开。
属性操作:
getAttribute(name) ——返回名称为name的属性的值
setAttribute(name,value) ——顾名思义
removeAttribute(name) ——顾名思义
为了简化创建表格,HTML DOM提供了一系列的表格方法,常用几个:
cells ——返回</tr>元素中的所有单元格
rows ——表格中所有行的集合
insertRow(position) ——在rows集合中指定位置插入新行
deleteRow(position) ——与insertRow相反
insertCell(position) ——在cells集合的指定位置插入一个新的单元格
deleteCell(position) ——与insertCell相反
* DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动。
* DOM操作——怎样添加、移除、移动、复制、创建和查找节点。
* 事件——怎样使用事件以及IE和DOM事件模型之间存在哪些主要差别。
* XMLHttpRequest——这是什么、怎样完整地执行一次GET请求、怎样检测错误。
* 严格模式与混杂模式——如何触发这两种模式,区分它们有何意义。
* 盒模型——外边距、内边距和边框之间的关系,IE < 8中的盒模型有什么不同。
* 块级元素与行内元素——怎么用CSS控制它们、它们怎样影响周围的元素以及你觉得应该如何定义它们的样式。
* 浮动元素——怎么使用它们、它们有什么问题以及怎么解决这些问题。
* HTML与XHTML——二者有什么区别,你觉得应该使用哪一个并说出理由。
* JSON——它是什么、为什么应该使用它、到底该怎么使用它,说出实现细节来。
1.js在页面加载过程中顺序执行。但是分块预编译、执行。
2.JS 在执行前会进行类似"预编译"的操作,而且先预声明变量再预定义函数。
此时注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行了"var a"没有赋值,即在预编译结束时a 为undefined。
3.(注意)并不是先全文编译完在执行,而是块编译,即一个script块中,预编译再执行,然后(按顺序)下一个script块,预编译再执行,但此时上一个块中的数据都是可以用的,但下一个块中的函数,声明的变量都是不可用的。
4.变量没声明就引用,会报错,但对象方法,对象变量没声明,是undefined
5.在函数中变量不声明就赋值,会被认为是全局变量,用var声明后为函数变量
6.在执行函数时时也是先编译后执行,但要注意函数定义中(即大括号中)的代码即使有错只要函数不执行,就不会有影响,但一执行函数,开始函数预编译就会出错。
一。样式编程
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中支持此特性
四。范围:今天在ueditor中接触到,感觉很高深,有时候要再仔细体会下其中的妙处
叫选区也许更为恰当,range用来选择文档的某个部分而不管节点的边界。也有两种的范围实现:DOM和IE的
1.DOM的range
(1)在DOM中创建选区的方法:
- var supportDOMRange=document.implementation.hasFeature("Range","2.0");
- if(supportDOMRange)
- var oRange=document.createRange();
var supportDOMRange=document.implementation.hasFeature("Range","2.0");
if(supportDOMRange)
var oRange=document.createRange();
先判断是否支持DOM,然后使用createRange()方法创建范围
(2)简单选区
考虑下面的代码:
- <p id="p1"><b>hello</b>world</p>
<p 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);
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><p 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>
<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><p 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)简单选区:
同样以下面这段代码为例子:
- <p id="p1"><b>hello</b>world</p>
<p id="p1"><b>hello</b>world</p>
要选择hello,可以使用:
- var oRange=document.body.createTextRange();
- oRange.findText("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);
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.范围的常见应用,比如搜索引擎中,搜索出来的链接中的关键字用特别的颜色包围起来,另外就是网页广告比较常用。