从string加载时,jquery.html()仅返回第一个文本

时间:2015-05-03 09:11:47

标签: javascript jquery html dom

据说可以从string初始化一个jquery对象。处理ajax结果时经常会发生这种情况,即我试图复制http://api.jquery.com/jQuery.post/

但是,我看到了奇怪的行为:

function test() {
    var content = $("<html><body><div>hello</div><div>world</div></body></html>");
    alert("content.text() = " + content.text());
    alert("content.html() = " + content.html());
}

第一个警告显示:content.text()= helloworld

第二个警告显示:content.html()= hello

这里发生了什么?

解决方案

感谢大家的解释。我最后添加了另一层<div>来生成<body>的单个子项,如

<html>
 <body>
  <div>    <=== added
   <div>hello</div>
   <div>world</div>
  </div>
 </body>
</html>

2 个答案:

答案 0 :(得分:1)

浏览器会移除这些htmlbody元素。 content集合只有2个div个元素。

  

传递复杂的HTML时,某些浏览器可能无法生成完全复制所提供的HTML源的DOM。如上所述,jQuery使用浏览器的.innerHTML属性来解析传递的HTML并将其插入到当前文档中。在此过程中,某些浏览器会过滤掉某些元素,例如<html><title><head>元素。因此,插入的元素可能无法代表传递的原始字符串。

这是content集合的字符串表示形式:

content.map(function() { return this.outerHTML || this.nodeValue; }).get().join('');
// -> <div>hello</div><div>world</div>

.text()方法返回集合中所有元素的textContent/nodeValue

content.text(); // -> helloworld

.and .html()方法返回集合中第一个元素的innerHTML

content.html(); // -> hello

答案 1 :(得分:0)

这是您content对浏览器的看法:

"content = " Object { 0: <div>, 1: <div>, length: 2 }

基本上这是一种2元素的集合。

这就是http://api.jquery.com/html/所说的:

  

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