2013年5月9日星期四

今天在解决bug的同时也不断引入新的bug;delphi和java web两种语言来回切换+各种电话干扰,效率真的很低,晚上在学习下知识作为自己的摘录笔记吧

DOM对象的常用方法(自己总结觉得有用的)

IEFirefox

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——它是什么、为什么应该使用它、到底该怎么使用它,说出实现细节来。

js 作用域、预编译小结

js

1.js在页面加载过程中顺序执行。但是分块预编译、执行。
2.JS 在执行前会进行类似"预编译"的操作,而且先预声明变量再预定义函数。
此时注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行了"var a"没有赋值,即在预编译结束时a 为undefined。
3.(注意)并不是先全文编译完在执行,而是块编译,即一个script块中,预编译再执行,然后(按顺序)下一个script块,预编译再执行,但此时上一个块中的数据都是可以用的,但下一个块中的函数,声明的变量都是不可用的。
4.变量没声明就引用,会报错,但对象方法,对象变量没声明,是undefined
5.在函数中变量不声明就赋值,会被认为是全局变量,用var声明后为函数变量
6.在执行函数时时也是先编译后执行,但要注意函数定义中(即大括号中)的代码即使有错只要函数不执行,就不会有影响,但一执行函数,开始函数预编译就会出错。

javascript之DOM技术

一。样式编程

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中创建选区的方法:

Java代码

  1. var supportDOMRange=document.implementation.hasFeature("Range","2.0");
  2. if(supportDOMRange)
  3. var oRange=document.createRange();

var supportDOMRange=document.implementation.hasFeature("Range","2.0");

if(supportDOMRange)

var oRange=document.createRange();


先判断是否支持DOM,然后使用createRange()方法创建范围

(2)简单选区
考虑下面的代码:

Java代码

  1. <p id="p1"><b>hello</b>world</p>

<p id="p1"><b>hello</b>world</p>



我们通过下面的JS代码来访问上面这段代码:

Java代码

  1. var oRange1=document.createRange();
  2. var oRange2=document.createRange();
  3. var op1=document.getElementById("p1");
  4. oRange1.selectNode(op1);
  5. 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都处于哪个最小的节点
演示这些特性的例子:

Java代码

  1. <html>
  2. <head>
  3. <title>DOM Range Example</title>
  4. <script type="text/javascript">
  5. function useRanges() {
  6. var oRange1 = document.createRange();
  7. var oRange2 = document.createRange();
  8. var oP1 = document.getElementById("p1");
  9. oRange1.selectNode(oP1);
  10. oRange2.selectNodeContents(oP1);
  11. document.getElementById("txtStartContainer1").value = oRange1.startContainer.tagName;
  12. document.getElementById("txtStartOffset1").value = oRange1.startOffset;
  13. document.getElementById("txtEndContainer1").value = oRange1.endContainer.tagName;
  14. document.getElementById("txtEndOffset1").value = oRange1.endOffset;
  15. document.getElementById("txtCommonAncestor1").value = oRange1.commonAncestorContainer.tagName;
  16. document.getElementById("txtStartContainer2").value = oRange2.startContainer.tagName;
  17. document.getElementById("txtStartOffset2").value = oRange2.startOffset;
  18. document.getElementById("txtEndContainer2").value = oRange2.endContainer.tagName;
  19. document.getElementById("txtEndOffset2").value = oRange2.endOffset;
  20. document.getElementById("txtCommonAncestor2").value = oRange2.commonAncestorContainer.tagName;
  21. }
  22. </script>
  23. </head>
  24. <body><p id="p1"><b>Hello</b> World</p>
  25. <input type="button" value="Use Ranges" onclick="useRanges()" />
  26. <table border="0">
  27. <tr>
  28. <td>
  29. <fieldset>
  30. <legend>oRange1</legend>
  31. Start Container: <input type="text" id="txtStartContainer1" /><br />
  32. Start Offset: <input type="text" id="txtStartOffset1" /><br />
  33. End Container: <input type="text" id="txtEndContainer1" /><br />
  34. End Offset: <input type="text" id="txtEndOffset1" /><br />
  35. Common Ancestor: <input type="text" id="txtCommonAncestor1" /><br />
  36. </fieldset>
  37. </td>
  38. <td>
  39. <fieldset>
  40. <legend>oRange2</legend>
  41. Start Container: <input type="text" id="txtStartContainer2" /><br />
  42. Start Offset: <input type="text" id="txtStartOffset2" /><br />
  43. End Container: <input type="text" id="txtEndContainer2" /><br />
  44. End Offset: <input type="text" id="txtEndOffset2" /><br />
  45. Common Ancestor: <input type="text" id="txtCommonAncestor2" /><br />
  46. </fieldset>
  47. </td>
  48. </tr>
  49. </table>
  50. <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>
  51. </body>
  52. </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)简单选区:
同样以下面这段代码为例子:

Java代码

  1. <p id="p1"><b>hello</b>world</p>

<p id="p1"><b>hello</b>world</p>



要选择hello,可以使用:

Java代码

  1. var oRange=document.body.createTextRange();
  2. oRange.findText("hello");

var oRange=document.body.createTextRange();

oRange.findText("hello");



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

Java代码

  1. var oRange=document.body.createTextRange();
  2. var oP1=document.getElementById("p1');
  3. oRange.moveToElementText(oP1);
  4. 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.范围的常见应用,比如搜索引擎中,搜索出来的链接中的关键字用特别的颜色包围起来,另外就是网页广告比较常用。

你可能感兴趣的:(2013年5月9日星期四)