2

这是我正在测试的 Ajax 代码的形式。

$('body').on('submit','#sign-in', function(e) {
    e.preventDefault();

    var data = $(this).serialize();

    var url = $(this).attr('action');
    $.ajax({
        //this is the php file that processes the data and send mail
        url : url,
        type : "POST",
        data : data,
        dataType:"html",
        //Do not cache the page
        cache : false,
        //success
        success : function(response,status) {
            console.log($(response).filter('#dashboard'));
            console.log($(response).find('#dashboard').html());
        }
    });
});

这是回应。

<!DOCTYPE html>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<body>
    <div id = "dashboard">
        <div id = "dash2">
        <h1>HELLO</h1>
        </div>
    </div>
</body>
</html>

根据上面的代码,成功的 jQueryfilter能够获取带有 id 的 div,#dashboard但是find返回给我一个undefined.

为什么它会这样工作?

供您参考,我使用的是 JQuery 1.9

更新

使用 Bergi 的建议,我删除了返回的 html 的 html、body 和 head 标签,这是我收到的错误。

未捕获的错误:语法错误,无法识别的表达式:

你好

你好 FITCCHHH jquery-1.9.0.min.js:2

4

3 回答 3

4

jQuery 将您的整个页面设置innerHTML为 a <div>,因此不会解析 doctype、html、head 和 body 元素。您只能取回结果元素的集合,并且由于您#dashboard是这些顶级元素之一,因此您需要filter而不是find.

也可以看看:

我不确定如何解决这个问题,显然那里有很多 jQuery 怪癖。我能想到的:

  • 试试jQuery.parseXML
  • 依赖于filter从 jQuery 集合中获取相关元素。不过,由于浏览器似乎对解析的内容不一致,因此您应该执行类似的操作 $response[$response.is("#dashboard") ? "filter" : "find"]("#dashboard")
  • 将格式错误的集合附加到某个元素并find从那里:$("<div/>").html(response).find("#dashboard")
  • 等待jQuery.parseHTML
  • 不要发送整个 HTML 文档,而只发送#dashboard您感兴趣的元素作为 html 字符串
于 2013-02-03T13:22:36.867 回答
3

如果您使用的是 jquery 1.9 ,则不应再像这样解析 html:

var html = $(response);

相反,您应该使用以下内容:

var html = $.parseHTML(response);
html = $(html).find('#dashboard').html();

从 Jquery Docs 1.9 开始: 传递给 jQuery() 的 HTML 字符串以非小于字符开头的字符串将被解释为选择器。由于字符串通常不能被解释为选择器,因此最有可能的结果将是 Sizzle 选择器引擎抛出的“无效选择器语法”错误。使用 jQuery.parseHTML() 解析任意 HTML。

于 2013-02-18T13:04:44.770 回答
1

您应该使用上面指出的 parseHTML。filter 和 find 之间的区别似乎在于元素在返回的 HTML 片段中的位置。如果您正在寻找#foo,那么如果#foo 是返回的HTML 中的顶级元素,则使用.filter('#foo'),否则使用.find('#foo')。

于 2014-03-19T16:31:55.587 回答