2011-01-09 45 views
2

我有一个ajax调用,我想解析#viewport返回的页面,从而删除返回页面的页眉和页脚。但find()找不到div。jquery无法找到div的ID

我原来的功能:

 function(event) { 
      $.ajax({ 
       type: this.method, 
       url: this.action, 
       data: $(this).serialize(), 
       datatype: "html", 
       success: function(data) { 
        alert(data); 
        var respHTML = $(data).find("#viewport"); 
        alert(respHTML.length); 
        $("#contacts_sidebar").html(respHTML); 
       } 
      }); 
      return false; 
     } 
在警报(数据)

,我绝对看到<div id="viewport">,但alert(respHTML.length)显示为0,如果我选择更改为“table.someclass”,它会找到它。但“head”和“body”等选择器也会返回0。

我知道它肯定有B/C I替换为以下解决方法成功的处理程序:

 success: function(data) { 
      var respHTML; 
      var d=$(data); 
      for (i=0; i<d.length; i++) { 
       if (d[i]["id"] === "viewport") { 
        respHTML = d[i]["innerHTML"]; 
        break; 
       } 
      } 
      $("#contacts_sidebar").html(respHTML); 
     } 

我这么想吗?解决方法的工作,只是丑陋。

非常感谢!

+3

你不会承诺为多个元素使用相同的“ID”值的罪,你会吗? – Pointy 2011-01-09 19:29:03

+0

在查找ID之前是否已经将元素添加到DOM?或者它只是纯粹的HTML? – 2011-01-09 19:30:10

+0

@Caspar Kleijne他通过编写`$(data)`隐式地将返回的HTML添加到文档片段中。 – Pointy 2011-01-09 19:31:10

回答

7

如果'#viewport'是在响应HTML的顶级水平,你需要.filter()代替,因为.find()只看顶级元素。

success: function(data) { 
     alert(data); 
     var respHTML = $(data).filter("#viewport"); 
     alert(respHTML.length); 
     $("#contacts_sidebar").html(respHTML); 
    } 

当通过HTML jQuery的,你不能依赖于一个跨浏览器的方式找到<html><head><body>标签。

如果您的回复确实包含了整个HTML文档,我会尽可能减少您实际需要的内容。

另一种选择可能是做这样的事情:

var respHTML = $('<div>' + data + '</div>').find("#viewport"); 

...但我不能保证结果。

2

您可以使用.load()函数解析特定元素的返回页面。

查看http://api.jquery.com/load并查看关于加载页面片段的部分。