使用 jQuery 从 HTML 文本查询脚本元素

2024-01-01

我正在通过以下方式加载页面$.ajax()并插入parts将结果放入页面的相应部分:

$.ajax({
  url: '/whole_page.html',
  success: function (data, status, xhr) {
    $result = $(xhr.responseText);
    $('#menu').html($('#menu', $result).html());
    $('#content').html($('#content', $result).html());
  }
});

就像一个魅力,但我遇到了一个问题。

现在我的页面包含一些特定于页面的 JS,在获取和插入结果时必须执行这些 JS。据我所知,jQuery 不会返回script元素,如果你从 HTML 文本构造一个 jQuery 对象并对其进行查询(我已经拉了一把小提琴 http://jsfiddle.net/kaen/rEWYz/5/展示)。因此,我无法通过 jQuery 有选择地仅插入我想要的脚本。

所以看来我必须拉script我自己回复文本中的元素。本质上,我正在寻找正确的方法来做到这一点。到目前为止我想到的是:

function pullScripts(text) {
  var frag = document.createDocumentFragment()
    , div = document.createElement('div')
    , scriptElements
    ;

  // This is roughly how jQuery finds the scripts when cleaning text
  frag.appendChild(div);
  div.innerHTML = text;

  scriptElements = div.getElementsByClassName('class-for-scripts-that-we-want');

  $('head').append(scriptElements);
}

尽管我还没有在任何蹩脚的浏览器上测试过它,但它的效果很好。无论如何,复制 jQuery 的基本功能只是为了避免其中一个功能(特殊的script处理)。从小提琴中可以看出,jQuery 对象实际上包含scripts,但它不会用类似的东西返回它们.html() or .get(). 我是否缺少一些明显的方法来做到这一点?

注意:一旦 jQuery 内部化,这整个话题就变得毫无意义了。parseHTML功能暴露

注2:我也读过尝试从 jQuery ajax 获取响应中选择脚本标签 https://stackoverflow.com/questions/4430707/trying-to-select-script-tags-from-a-jquery-ajax-get-response然而,接受的答案是“你不能”,然后是“使用正则表达式”。两者都不满意


在 jQuery 1.8.0b1 中,您现在可以使用$.parseHTML() https://api.jquery.com/jquery.parsehtml/方法使这变得更容易。

$.parseHTML(xhr.responseText,true)将为您提供一个包含脚本元素的 jQuery 对象。然后,您可以提取脚本标签并在附加 html 后附加或执行它们。

$.ajax({
  url: '/whole_page.html',
  success: function (data, status, xhr) {
    var $result = $.parseHTML(xhr.responseText,true),
        $scripts = $result.find("script").add($result.filter("script")).detach();

    $('#menu').html($('#menu', $result).html());
    $('#content').html($('#content', $result).html());
    $('head').append($scripts);
  }
});

您可能必须根据具体情况过滤脚本,以避免重复包含 jQuery。这将取决于您正在加载的内容。

如果升级 jQuery 不是一个选择,你可以采用以下实现$.parseHTML并将其作为插件包含到您当前的 jQuery 中

(function($) {
    if (!$.parseHTML) {
        var rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/;
        // data: string of html
        // context (optional): If specified, the fragment will be created in this context, defaults to document
        // scripts (optional): If true, will include scripts passed in the html string
        $.parseHTML = function( data, context, scripts ) {
            var parsed;
            if ( !data || typeof data !== "string" ) {
                return null;
            }
            if ( typeof context === "boolean" ) {
                scripts = context;
                context = 0;
            }
            context = context || document;

            // Single tag
            if ( (parsed = rsingleTag.exec( data )) ) {
                return [ context.createElement( parsed[1] ) ];
            }

            parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
            return jQuery.merge( [],
                (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
        }
    }
})(jQuery);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 jQuery 从 HTML 文本查询脚本元素 的相关文章

  • 如何最好地实现多个重叠元素的翻转和推出事件?

    Problem 我正在开发一个网站 其中有一个 拨号盘 显示代表伞式公司不同部门的多个选项卡 目前我已经用 HTML CSS 准备好了一切 每个选项卡的定位 内圈处于较高位置z index因为选项卡在滚动时需要向外动画 我可以实现这部分 选
  • 如何修复 AJAX 在选中复选框时始终触发?

    有时这个 AJAX 会触发 有时不会 让我解释一下 habit js document ready function habit check change function habit this parent siblings habit
  • 如何在odoo中重写js函数

    我想加载 shop checkout url 函数是 odoo define change info order website sale change info order function require use strict oe w
  • 在浏览器中覆盖 TAB

    如果我在输入字段中输入文本并按ENTER我所知道的所有浏览器的默认行为是提交表单 但是如果我按ENTER在文本区域内添加新行 每当我按下时 有什么方法可以模仿这种行为 缩进 而不是提交表单 TAB在文本区域内 Bespin https be
  • Popper.js:点击外部时如何关闭弹出窗口

    我在用着波普尔 js https popper js org 显示具有该类的弹出元素 js share cf popover单击带有类的元素时 js share cf btn 但我希望只有当我在弹出窗口之外单击时才关闭弹出窗口 这是我显示弹
  • 按下按钮时如何更改 Twitter Bootstrap 选项卡?

    我需要在按下按钮时更改选项卡 并且选项卡应由 id 标识 以下代码对我不起作用 只是重新加载页面 div class form actions div
  • CSS 比例和方形中心裁剪图像

    所以我的应用程序中有一个缩略图集合 其大小为200x200 有时原始图像没有这个比例 所以我计划将此图像裁剪为正方形 目前它只是拉伸图像以适合缩略图 所以说我的原始图像大小是400x800 那么图像看起来就很压扁 我想裁剪此图像 以便它查看
  • jQuery 无法在外部 JavaScript 中工作

    我是 jQuery 新手 遇到了一些奇怪的问题 我正在使用 jQuery 的change and click方法 在我的 HTML 文件中使用时它们工作正常
  • Android 上的 Chrome 强制隐藏地址栏

    我最近开发了一个获取混合 http https 内容的网站 因此 我总是将地址栏显示在顶部 它不会像其他网站那样自动隐藏 这就是我要说的 This https planetkde org 是网站的链接 内容是从各种来源获取的 因此无法过滤非
  • 使用 Jquery 更改 css 属性时的事件检测

    有没有办法检测元素的 显示 css 属性是否更改 是否更改为无 块或内联块 如果没有的话有什么插件吗 谢谢 Note 突变事件 https developer mozilla org en US docs Web Guide Events
  • 单击时阻止 jquery TABS 跳跃/向上滚动?

    我使用的引擎调用 jquery tabs js 脚本来处理选项卡功能 问题是 只要选项卡位于页面顶部并且您单击链接 它们就会快速向下滚动到页面底部 我已经尝试解决这个问题几个小时了 所有解决方案都指向类似的答案 但没有一个对我有用 fn t
  • 如何创建到任何 fancybox 框的直接链接

    我需要当我单击任何使用 fancybox 的内容时 它会生成一个特定的 URL 因此当我将此链接发送给某人时 它会打开我想要的特定框 例如 fancybox net home当我点击第一张图片时 链接仍然存在fancybox net hom
  • 如何使用 JQuery 隐藏和显示 HTML 元素?

    如何使用 JQuery 隐藏和显示 HTML 元素而不产生任何特殊效果 使用hide http docs jquery com Effects hide and show http docs jquery com Effects show方
  • Liferay ajax 请求和 JSON 响应

    我是 Liferay 的新人 我使用服务生成器来创建数据库 我手动填充它们 最终我可以使用 JSP 调用它们PersonLocalServiceUtil class 现在我想在我的程序中使用Ajax 例如 有属性的人personID per
  • Twitter bootstrap 远程模式每次都显示相同的内容

    我正在使用 Twitter bootstrap 我已经指定了一个模式 div class modal hide div class modal header div div
  • JQuery - 如何检测给定 div 中存在给定类的 div 数量?

    我有一个这样的div div class x div 并包含在这个 div 中 我有几个像这样的 div div class y div div class y div div class y div etc 问题1 如何检测容器 div
  • 如何消除 jQuery Mobile 中的悬停延迟?

    我正在使用 jQuery Mobile 制作一个网站 当我将鼠标悬停在按钮上时 它会更改其类 并扩展其颜色 但感觉需要半秒左右才能完成 有没有办法减少这种延迟 您可以覆盖hoverDelay无需修改 jQuery Mobile js 库 要
  • 您可以使用 JSONP 检索您的 Skype 状态吗?

    有谁知道使用 JSONP 获取 Skype 状态的 URL 到目前为止我只找到了一个 XML 状态 URL http mystatus skype com username xml 我正在尝试使用 AJAX 查询 Skype 是的 我可以使
  • 响应覆盖 div 下的链接

    场景是这样的 我已经构建了一个顶部导航原型 它需要在其顶部有一个覆盖 透明 PNG 图像 目前它覆盖了大约 1 3 的链接 请看下面 有什么方法可以让前 1 3 的链接做出响应 即使有一个 div div 部分覆盖它们 覆盖层不会包含任何可
  • 将记录转换为序列化表单数据以通过 HTTP 发送

    有没有办法转换此记录 TError record code Word message String end TState record caption String address Cardinal counters TArray

随机推荐

  • 如何按条件隐藏表单上的编辑/创建按钮?

    我是一名新的 Odoo 开发人员 当我的表单进入自定义状态时 我需要隐藏编辑按钮 由于安全问题 我需要这个按钮 当我尝试为表单提供属性时 XML 中的这段代码不起作用
  • 使用 Jquery 重新构建 ul 和 li 标签

    我尝试通过仅显示每个 ul 10 li 标签来找到分割 ul 标签的方法 假设我有 li 30 个元素 脚本将被重新构建为 3 个 ul 每个 ul 有 10 里标签 我怎样才能做到这一点 假设原件是 ul li a href span A
  • 使用 BufferedReader/BufferedWriter 删除文件的第 N 行

    所以我有一个像这样结构的文本文件 产品 价格 类别 数量 Apple 1 0 Fruits 120 Cucumber 1 4 Vegetables 110 Pear 1 6 Fruits 120 我需要一个可以删除第 N 个项目的函数 在本
  • 如何防止软键盘显示时调整窗口大小和重新布局

    我在活动中显示编辑对话框 当显示软键盘时 活动的窗口将调整为太小 看起来很糟糕 I don t want the window of the activity be resized and layout I just want the ke
  • 拥有级联=“all-delete-orphan”的集合不再被拥有的实体实例引用

    在我的应用程序中 休眠操作是这样的 应用程序使用请求中的新值更新父实体 并删除所有现有的 之前插入的 子实体并插入新的子记录 我正在使用休眠DELETE ORPHAN为此 如下所示 当我这样做时 我收到以下异常 org hibernate
  • 为 Node“导入”ES6

    我想在 Node js 中使用来自 ES6 的 import 而不是来自 common js 的 require 出于某种原因 我认为导入在 Node js 中默认可以工作 但看起来好像没有 我需要安装一些 npm 软件包才能正常工作吗 N
  • IOS App提交失败

    我已经使用 Xcode 7 创建了我的 ipa 并在 ios 9 上运行 它工作正常 但是当我使用应用程序加载器上传它时 它给了我一个错误 Could not make parent directory for Users Myname i
  • 如何使用 NSAttributedString 在 Swift 中添加图像作为文本附件?

    我正在尝试使用我作为按钮放入的图像为 iOS 构建一个自定义键盘 当我按下按钮时 链接到该按钮的图像将被放入属性字符串中 该字符串将加载到自定义键盘视图内的 UiTextView 中 那是有效的 问题是 当我将新图像附加到属性字符串时 字符
  • Excel 2010、VBA 和 ListObjects 小计未随表更改而更新

    因此 具有以下结构 从 A1 开始 显示片段 gt 运行 table border color BBB border width 0px 0px 1px 1px border style dotted body font 12px Aria
  • do 块内的 Haskell where 子句语法

    我正在尝试重构mapM a 内的函数调用doHaskell 中的块 我想将 lambda 提取到 本地 命名函数以使代码更具可读性 我的代码最初看起来像这样 do mapM x gt x 1 aList return aValue 我想把它
  • FFMPEG H264 压缩预设会影响视频质量吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我绝对不是 FFMPEG 专家 但根据这个文件 http ffmpeg org trac ffmpeg wiki x264EncodingGuide
  • 遮罩图像,从多个渐变创建矩形

    我有一个径向渐变用作mask image将图像 淡入 background color behind图片 mask image radial gradient ellipse at center rgba 255 255 255 1 1 r
  • 如何使用 javascript 创建 xhtml 元素

    如何使用 javascript 动态创建 html 元素 我想在表格单元格内添加一个复选框 所以我希望代码看起来像这样 td td
  • 将 GraphQL 数据拉入 gatsby-browser.js (或更好的解决方案,请)

    我正在尝试运行一个GraphQL里面查询replaceRouterComponent从内部gatsby browser js 盖茨比浏览器API https www gatsbyjs org docs browser apis 然而 我可以
  • 什么是特殊目的寄存器? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 什么是特殊用途寄存器 特殊用途寄存器的名称是什么 以及每个寄存器的一些描述 顾名思义 特殊用途寄存器是专为任务而设计的寄存器 例如 c
  • Dart 支持参数化单元测试吗?

    我想运行一个 Dart 测试 该测试使用一组输入和预期输出重复进行 类似于 JUnit 的情况 我编写了以下测试来实现类似的行为 但问题是 如果所有测试输出计算不正确 则测试只会失败一次 import package test test d
  • Flask 应用程序使用 opencv 运行速度非常慢

    我有一个烧瓶应用程序 它从相机读取帧并将其传输到网站 相机 py from threading import Thread from copy import deepcopy import queue import cv2 class Ca
  • 为什么我不能用 std::unordered_map 替换 std::map

    这个问题可能有点粗略 因为我家里没有可用的代码 但我知道这件事否则会困扰我整个周末 当我尝试将一些代码更新到 C 11 时 我开始替换一些代码std map with std unordered map 该代码仅使用std map find
  • CGRectContainsRect 不工作

    我用这个方法有问题 我有两个显然彼此包含的矩形 我什至手动绘制了它们的坐标以确保 当我使用 CGRectContainsRect 比较这两个矩形时 它返回 false 对于我的一生 我已经尝试了一切 搜索了网络 但我找不到这个问题的答案 有
  • 使用 jQuery 从 HTML 文本查询脚本元素

    我正在通过以下方式加载页面 ajax 并插入parts将结果放入页面的相应部分 ajax url whole page html success function data status xhr result xhr responseTex