2-7 插入
本节编程练习不计算学习进度,请电脑登录imooc.com操作

插入

回顾下几组DOM插入有关的方法:

  1.  innerHTML 设置或获取位于对象起始和结束标签内的 HTML
  2.  outerHTML 设置或获取对象及其内容的 HTML 形式
  3.  innerText 和 outerText 在读取的时候是一样的,只是在设置的时候 outerText 会连带标签一起替换成目标文本

firefox不支持innerText,但是可以用textContent作为替代方案。

jQuery封装的方法html,text,val(放到属性一章)

.html()用为读取和修改元素的HTML标签
.text()用来读取或修改元素的纯文本内容
.val()用来读取或修改表单元素的value

html

获取集合中第一个匹配元素的 HTML 内容。

取值

在一个 HTML 文档中, 我们可以使用 .html() 方法来获取任意一个元素的内容。 如果选择器匹配多个元素,那么只有第一个匹配元素的 HTML 内容会被获取。

源码部分可见jQuery.access在属性节点操作的时候就详解过了,就是合并分解多个参数,细分到每一个流程调用中,通过回调接收分解后的参数。

可见针对nodeType === 1的节点是通过浏览器接口innerHTML返回需要取的值。

有些浏览器返回的结果可能不是原始文档的 HTML 源代码。例如,如果属性值只包含字母数字字符,Internet Explorer有时丢弃包裹属性值的引号。

html: function( value ) {
        return jQuery.access( this, function( value ) {
            var elem = this[ 0 ] || {},
                i = 0, l = this.length;
            if ( value === undefined && elem.nodeType === 1 ) {
                return elem.innerHTML;
            }
    }, null, value, arguments.length )

设值

.html() 方法对 XML 文档无效。

我们可以使用 .html() 来设置元素的内容,这些元素中的任何内容会完全被新的内容取代。

此外,用新的内容替换这些元素前,jQuery从子元素删除其他结构,如数据和事件处理程序,防止内存溢出,对插入的值做一下过滤处理。

必须是字符串,而且不能暴行script|style|link,并且不是tr,表格等元素。

最后通过innerHTML覆盖节点,防止内存溢出需要jQuery.cleanData清理节点上的事件与数据。

总结: elem.innerHTML 也就是从对象的起始位置到终止位置的全部内容,包括Html标签。

.text()

得到匹配元素集合中每个元素的文本内容结合,包括他们的后代,或设置匹配元素集合中每个元素的文本内容为指定的文本内容。

.text() 在 XML 和 HTML 文档中都能使用。

.text() 方法返回一个字符串,包含所有匹配元素的合并文本。(由于在不同的浏览器中的HTML解析器的变化,返回的文本中换行和其他空白可能会有所不同。

text: function( value ) {
    return jQuery.access( this, function( value ) {
        return value === undefined ?
            jQuery.text( this ) :
            this.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) );
    }, null, value, arguments.length );
}

取值

jQuery.text( this ) 实际调用Sizzle.getText。

但是实际上jQuery没有用innerText获取文本的值,http://bugs.jquery.com/ticket/11153,大概就是在IE8中新节点插入会保留所有回车。

所以jQuery采用了textContent获取文本值,textContent本身是dom3规范的,可以兼容火狐下的innerText问题。

设值

考虑下,如果文本的值不仅仅是字符串,可能是带有标签的:

<p>This is a test.</p>

这种情况下,当然就不能直接套用 elem.textContent = <p>This is a test.</p>。

我们必须意识到这种方法提供了必要的字符串从提供的正确的HTML中脱离出来。

jQuery这样做, 他调用DOM 方法.createTextNode(), 一种替代的特殊字符与HTML对应(比如< 替换为 &lt; )方法。

总结

1 .text() 在XML 和 HTML 文档中都能使用。
2 .text() 方法返回一个字符串,包含所有匹配元素的合并文本。(由于在不同的浏览器中的HTML解析器的变化,返回的文本中换行和其他空白可能会有所不同。
3 .text() 方法不能使用在 input 元素或 scripts 元素上。 input 或 textarea 需要使用 .val() 方法获取或设置文本值。得到scripts元素的值,使用.html()方法。

任务

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
  5. <script src="http://code.jquery.com/jquery-latest.js"></script>
  6. <title>DOM插入</title>
  7. </head>
  8. <body>
  9.  
  10. <button id="test1">html取值操作</button>
  11. <button id="test2">html设值操作</button>
  12. <button id="test3">text取值操作</button>
  13. <button id="test4">text设值操作</button>
  14.  
  15. <div class="container">
  16. <div class="inner">Hello</div>
  17. <div class="inner">Goodbye</div>
  18. </div>
  19.  
  20. <p>
  21. <b>TestP1</b>Paragraph.
  22. </p>
  23. <p>TestP2</p>
  24.  
  25. <script type="text/javascript">
  26.  
  27.  
  28. function html(value) {
  29. var elem = this[0] || {},
  30. i = 0,
  31. l = this.length;
  32. if (value === undefined
  33. && elem.nodeType === 1) {
  34. return elem.innerHTML;
  35. }
  36. for (; i < l; i++) {
  37. elem = this[i] || {};
  38. if (elem.nodeType === 1) {
  39. elem.innerHTML = value;
  40. }
  41. }
  42. }
  43.  
  44.  
  45. function getText(elem) {
  46. var node,
  47. ret = "",
  48. i = 0,
  49. nodeType = elem.nodeType;
  50. if (!nodeType) {
  51. //如果没有节点类型,表示是一个数组
  52. while ((node = elem[i++])) {
  53. // 不遍历注释节点
  54. ret += getText(node);
  55. }
  56. } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
  57. if (typeof elem.textContent === "string") {
  58. return elem.textContent;
  59. } else {
  60. for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
  61. ret += getText(elem);
  62. }
  63. }
  64. } else if (nodeType === 3 || nodeType === 4) {
  65. return elem.nodeValue;
  66. }
  67. return ret;
  68. }
  69.  
  70.  
  71. function empty() {
  72. var elem,
  73. i = 0;
  74. for (;
  75. (elem = this[i]) != null; i++) {
  76. if (elem.nodeType === 1) {
  77. elem.textContent = "";
  78. }
  79. }
  80. return this;
  81. }
  82.  
  83. function setText(value) {
  84. empty.call(this)
  85. if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
  86. this.textContent = value;
  87. }
  88. }
  89.  
  90.  
  91. function text(value) {
  92. return value === undefined ?
  93. //取值
  94. getText(this) :
  95. //清理
  96. setText.call(this, value)
  97. }
  98.  
  99.  
  100.  
  101. $('#test1').click(function() {
  102. var inner = document.querySelectorAll('.inner')
  103. alert(html.call(inner))
  104. })
  105.  
  106. $('#test2').click(function() {
  107. var inner = document.querySelectorAll('.inner')
  108. html.call(inner,'慕课网')
  109. })
  110.  
  111. $('#test3').click(function() {
  112. var p = document.querySelectorAll("p")[0]
  113. alert(text.call(p))
  114. })
  115.  
  116. $('#test4').click(function() {
  117. var p = document.querySelectorAll("p")[0]
  118. text.call(p,'慕课网')
  119. })
  120.  
  121. </script>
  122.  
  123. </body>
  124. </html>
下一节