【问题标题】:Remove HEAD from HTML from AJAX call从 AJAX 调用的 HTML 中删除 HEAD
【发布时间】:2012-12-27 05:39:33
【问题描述】:

我正在用 ajax 接收的 html 替换正文 html。 问题是我复制了 HEAD 部分。

我首先需要从收到的html中删除整行直到,然后使用:

$('body').html(data);

我从 POST 获取 html。 这是一个格式良好的html。

我正在使用 Django 的 render_to_response 来发回响应。

我怎样才能做到这一点?

【问题讨论】:

  • 使用 jQuery 加载页面片段。阅读文档。
  • 请发布更多代码。就像你的 ajax 请求一样。检查 jQuery .load() 方法。
  • 扩展 epascarello 的评论,你不能排除 head 服务器端吗?这是最好的处理方式。
  • 我正在使用 Django 的 render_to_response。我无法控制服务器端。
  • 您可能应该用 django btw 标记问题。那时你得到比我更好的答案的可能性更大。

标签: javascript jquery django


【解决方案1】:

试试$('body').html($(data).find('body'));。如果您有格式良好的 HTML,这将起作用。

编辑:这行不通;请参阅下面的 Fabricio 评论和我的回复以了解原因。一种解决方法是将 body 中的所有内容包装在具有给定 ID 的 div 中,然后像这样选择此 ID:$('body').html($(data).filter('#chosenid')); 当然,这与将 AJAX 调用结合到相同的请求。

【讨论】:

  • 我猜不是。 html/body/head 标签在解析 HTML 字符串时会被自动排除。 jsfiddle.net/hqJjM/1
  • $(data).find('body') 不会是一个对象吗?
  • @FabrícioMatté 你是对的;在 $() 的 JQuery API 页面上发现了这一点:当传递复杂的 HTML 时,某些浏览器可能不会生成完全复制所提供的 HTML 源的 DOM。如前所述,jQuery 使用浏览器的 .innerHTML 属性来解析传递的 HTML 并将其插入到当前文档中。在此过程中,一些浏览器会过滤掉某些元素,例如 、 或 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 元素.因此,插入的元素可能不代表传递的原始字符串。
  • 是的。我对 jQuery 解析的研究表明,它使用单独的 documentFragment 插入数据,然后提取解析的元素并附加到目标。 AFAIK 文档片段不允许包含 html/body/head 元素。
  • 是的,您现在的编辑起作用。不过只有一件事。 #chosenid 将位于顶层,这意味着您应该使用 .filter() 而不是 .find() 我认为。需要在小提琴上进行测试。
【解决方案2】:

您是否在正文中插入文本? 你应该使用load-method,但要小心脚本:)

$("body").load("yourNextPage.html");

【讨论】:

  • 是的,从服务器响应收到的 html 文本
【解决方案3】:

我建议排除 head 服务器端,但由于我不知道你会如何在 django 中做到这一点,这是一个 hackish 且极其丑陋的解决方案,它至少可以工作,与 $(data).find('body') 的其他解决方案不同由于 jQuery 解析自动排除 body 标记以及 htmlhead 标记,它永远不会匹配任何元素。

看,正则表达式的威力!

$('body').html(/<body[\s\S]*?>([\s\S]*?)<\/body>/.exec(data)[1]);

Fiddle

我不建议将其用于生产环境,因为通过head 发送只是在两端浪费带宽,并且正则表达式不是最合适的解决方案。在您将服务器部分页面切换到 ajax 请求之前,它至少应该适用于开发。

【讨论】:

    【解决方案4】:

    这些解决方案看起来都非常hacky......说真的,只需移除服务器端的头部!

    如果您使用的是 render_to_ 响应,则必须将模板名称传递给它以进行渲染。在那个模板中,不要写任何头代码!只需将代码放在正文标签之间,就可以了。

    【讨论】:

    • 仅供参考,我确实建议在我的答案中删除 head 服务器端,而不是使用我在您称其非常骇人听闻并投反对票之前发布的临时解决方法。
    • 我对它投了反对票,因为它是一个非常 hacky 的响应,真的不应该使用。从 django 中删除页面的头部是简单 - 因为你正在自己编写所有的 HTML!当有简单且推荐的方法时,不应将 hacky 答案视为“最佳”答案。
    • 那好吧。如果你懒得看我回答的最后一段,我就懒得争论了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2014-03-23
    • 2019-05-17
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多