jsdom 和 $(document).ready

2023-12-22

我看起来就像当我浏览一页时jsdom, the $(document).ready页面脚本中的块没有被执行。

这是 HTML:

<html>
<body>
  If everything works, you should see a message here:  <h2 id="msg"></h2>

  <script>
    var checkpoint1 = true
    var checkpoint2 = false
    $(document).ready(function(){
      checkpoint2 = true
      $('#msg').html("It works, it works, it works!")
    })
  </script>
</body>
</html>

和法典:

fs = require('fs');
htmlSource = fs.readFileSync("public/examples/test_js_dom.html", "utf8");

global.jsdom = require("jsdom");

jsdom.defaultDocumentFeatures = {
  FetchExternalResources   : ['script'],
  ProcessExternalResources : ['script'],
  MutationEvents           : '2.0',
  QuerySelector            : false
};

doc = jsdom.jsdom(htmlSource)
window = doc.createWindow()
jsdom.jQueryify(window, "http://code.jquery.com/jquery-1.8.3.min.js", function(){
  console.log(window.checkpoint1);
  console.log(window.checkpoint2);
  console.log(window.$().jquery)
  console.log("body:");
  console.log(window.$('body').html());
});

和输出:

Bee@cleanroom:~/projects/notjs$ test/jsdom.js
true
false   
1.8.3
body:

      If everything works, you should see a message here:  <h2 id="msg"></h2>

      <script>
        var checkpoint1 = true
        var checkpoint2 = false
        $(document).ready(function(){
          checkpoint2 = true
          $('#msg').html("It works, it works, it works!")
        })
      </script>
    <script class="jsdom" src="http://code.jquery.com/jquery-1.8.3.min.js"></script>

我究竟做错了什么?

添加细节以满足荒谬的 stackoverflow 比率。

Bee@cleanroom:~/projects/notjs$ npm ls jsdom
[email protected] /cdn-cgi/l/email-protection /Users/Bee/projects/notjs
├─┬ [email protected] /cdn-cgi/l/email-protection
│ └── [email protected] /cdn-cgi/l/email-protection
└── [email protected] /cdn-cgi/l/email-protection
Bee@cleanroom:~/projects/notjs$ node -v
v0.8.15
Bee@cleanroom:~/projects/notjs$ npm -v
1.1.66

[解决方案]:

谢谢戴夫引导我找到正确的答案。

我认为完整的 jsdom 答案是这样的;不要使用 jsdom.jQuerify,添加脚本标记以在页面脚本上方的页面中加载 jQuery(因为需要这样做才能在浏览器中加载页面)。

html:

    ...
    If everything works, you should see a message here:  <h2 id="msg"></h2>

    <script src="http://notjs.org/vendor/jquery-1.8.3.min.js"></script>
    <script>
      var checkpoint1 = true
      var checkpoint2 = false
      $(document).ready(function(){
        var checkpoint2 = true
    ...       

code:

    ...
    doc = jsdom.jsdom(htmlSource)
    window = doc.createWindow()
    window.addEventListener('load',  function(){
      console.log(window.checkpoint1);
      console.log(window.checkpoint2);
      console.log(window.$().jquery)
      console.log("body:");
      console.log(window.$('body').html());
    });
    ...

第一次解析脚本时 jQuery 尚未加载,因此$没有定义。这意味着$(document).ready未定义,因此您的函数未设置。您应该在控制台中看到有关此问题的警告。解决方案是在创建 document.ready 函数之前确保 jQuery 已加载。我对 jsdom 不熟悉,但有两种方法可以解决这个问题:

  1. 移动生成的<script>在内联脚本上方标记。这对于 jsdom 来说可能可行,也可能不可能。
  2. 将内联脚本移至 jsdom 回调内,其中包含所有 console.log 函数。因为此时 jQuery 已经加载完毕。编辑:实际上我认为 jsdom 就像一个预处理器?在这种情况下,此方法不起作用,您需要执行 (1)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jsdom 和 $(document).ready 的相关文章

  • var io = require('../..')(server) 做什么?

    我已经构建了该项目https github com Automattic socket io tree master examples chat https github com Automattic socket io tree mast
  • 尝试安装 gulp 时 npm 挂起

    UPDATED 当我尝试使用 npm install 或任何变体安装任何软件包时 npm install gulp g verbose npm install gulp verbose npm install gulp npm instal
  • node npm run watch 退出状态 3221225725

    我必须格式化我的驱动器 但我的一个项目不再工作 所有其他相同类型的项目都运行良好 这是 Laravel Vue JS 问题是我无法运行 npm run watch dev 或 production 他们都给出了错误 拉拉维尔 5 7 npm
  • 访问 Node.js 全局模块

    npm 文档是这样说的 如果您正在安装想要在程序中使用的东西 请使用 require whatever 然后将其安装在本地项目的根目录下 如果您要安装要在 shell 中使用的东西 请在命令行或 某些东西 全局安装它 以便它的二进制文件最终
  • setInterval 可以随时间漂移吗?

    我有 2 个 Node js 网络服务器 我在网络服务器内缓存数据 我根据系统时间同步缓存加载 清除 我已经完成了所有主机的时间同步 现在我使用以下代码每 15 分钟清除一次缓存 millisTillNexthour Calculate m
  • Firebase 函数,admin.database().ref(...).get() 不是函数

    我正在开发一个 Android 应用程序 并使用 firebase 作为它的后端 我正在尝试让通知系统正常工作 该系统依赖于监听数据库中的更改 但遇到问题 因为我收到以下错误 想知道是否有人能够提供帮助 可以提供任何额外的代码 Fireba
  • 具有独立 Node.js 服务器的虚拟主机

    目前有没有一种方法可以使用node js服务器进行虚拟托管 即在一个IP下托管多个域 当然 你可以使用bouncy https github com substack bouncy or 节点 http 代理 https github co
  • Redis 客户端忽略其上设置的配置选项并尝试连接到默认 IP 127.0.01

    在AWS中 我使用ElastiCache Redis服务器并使用节点作为后端和 promise redis 包 这就是我尝试连接到我的 redis 服务器端点的方法 client redis createClient host my red
  • 如何在 Jenkins 服务器上运行 Jest 测试

    我正在尝试运行我的Jest https facebook github io jest 在 Jenkins 部署期间进行测试 如果我 ssh 进入服务器 我可以 sudo 进入 Jenkins 用户并从工作区成功运行测试 但是 当我尝试从
  • Nodejs - 处理和发送多部分请求,

    我的应用程序在 Nodejs 服务器上运行 Node Js 还充当来自应用程序的请求的中间件 代理 因此 从浏览器开始 所有 REST 调用都会转到 NodeJs 然后转到 Java API 我发现处理多部分表单数据的请求时出现问题 我在
  • Angular2 + Laravel 与实时和 WebSockets

    我构建了一个应用程序 并计划与 Angular 2 和 laravel 进行实时战斗 例如 你按下 攻击 按钮 你的对手就会实时看到他的生命在下降 我的应用程序构建有 前端 角2 Backend PHP Laravel 5 2 现在我正在寻
  • 语法错误:elasticdump 中的exports.runInThisContext (vm.js:53:16) 处出现意外标记 {

    我试图使用elasticdump 将elasticsearch 数据从一台服务器移动到另一台服务器 当我给予 elasticdump input http 192 168 0 122 9200 my index output http lo
  • 如何使用 Nodejs 创建 Excel 文件?

    我是一名 Nodejs 程序员 现在我有一个数据表 我想将其保存为 Excel 文件格式 我该怎么做呢 我找到了一些 Node 库 但其中大多数是 Excel 解析器而不是 Excel 编写器 我使用的是 Linux 服务器 因此需要一些可
  • Mongodb更新很多

    我正在使用express js 和 npm 模块 mongodb 进行开发 并以 mongodb 作为数据库 我有两个集合 即 用户 和 活动 一个用户可能有数千个活动 首先 我将用户的 id 姓名和图片 url 存储到 关系的活动文件 请
  • socket.io 作为客户端

    有什么方法可以将socketio作为客户端运行 不是浏览器 而是nodejs脚本 我需要将数据从服务器广播到一些客户端 浏览器 和另一台linux机器 仅运行nodejs来获取变量 没有浏览器 欢迎任何想法 Regards github上有
  • Nodejs 一个接一个地运行异步函数

    我是 JS nodejs 的新手 所以如果我不能提出切中要害的问题 请原谅我 所以基本上 如果我有两个异步函数 async function init async function main 如何确保在 init 完成其异步请求后调用 ma
  • npm install 命令下载所需包的源位置是什么?

    我试图获取命令 npm install 尝试连接的源位置 URL 并根据 package json 文件获取要下载的依赖包 并将其放置在本地框中 从下面提到的网址 http www tutorialspoint com nodejs nod
  • JITSU 无法安装 OSX [节点 0.8.17 和 NPM 1.2.0] WTF

    我在通过 NPM 安装 jitsu 时遇到问题 我在 mac osx 10 6 8 上安装了节点 0 8 17 和 NPM 1 2 0 当我跑步时 sudo npm install jitsu g 首先它警告未找到自述文件 npm WARN
  • Node.js 中的异步或步骤

    我无法让我的异步代码与 node js 一起使用 尝试异步和步骤库 代码仅返回第一个函数 似乎没有执行其余函数 我究竟做错了什么 thanks var step require step step function f1 console l
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht

随机推荐

  • 是否可以通过电子邮件地址进行 XSS 攻击?

    我想知道电子 邮件地址是否可以用于XSS攻击 假设有一个网站 人们可以在其中注册并提供他的电子邮件地址 如果有人想要攻击给定的网站 他或她可能会创建一个电子邮件地址 例如 stmpname com 然后使用该电子邮件地址攻击该网站 电子邮件
  • 编写 lisp emacs 键绑定并且无法指定 字符

    由于某种原因 我将向后杀字的默认 M del 键绑定映射到匹配括号的扫描 并且重置不起作用 所以我尝试在 lisp 中设置全局键绑定 所以我在 emacs d init el 中编写了 lisp 命令 全局设置键 kbd M h 向后杀字
  • XSD 和 WSDL 位于不同的目录中

    在我的工作中使用 jaxws maven plugin 进行代码生成 我有两个项目分别是 common 和 client 结构大致如下 app common resource some xsd client resource some ws
  • 在 Blazor Web Assembly 应用中显示本地计算机摄像头源

    我已将问题简化为样板 Blazor Web Assembly 应用程序 该项目直接来自向导 添加了以下代码 我已将 Index razor 页面更改为 page inject IJSRuntime JSRuntime using Syste
  • 多设备混合应用程序中未指定 NodeJs 的路径

    当我尝试构建项目时 我收到一条错误消息 例如 NodeJs 的路径尚未指定 文件名为 Microsoft MDA target 如何在其中指定node js路径 错误消息是 尚未指定 NodeJs 的路径 请在构建之前检查 NodeJs 是
  • 错误:模板可能不是“虚拟”

    我希望能够向基类 MCFormater 提供适用于不同类型 uint32 uint8 的格式化方法 class MCFormater public MCFormater virtual MCFormater virtual mcc t Ge
  • 如何访问 Doctrine2 中 PrePersist LifecycleCallback 的旧值

    我在 Doctrine2 中有一个实体 并将 HasLivecycleCallbacks 与 PrePersist 一起使用 一般来说 这工作得很好 但我只想在实体中的某些字段发生变化时更改版本 我有机会获得旧的价值观吗 还是只是更改了键值
  • 我可以通过 ssh 转发环境变量吗?

    我使用多个不同的服务器 如果能够设置一些环境变量 以便当我通过 SSH 登录时它们在所有服务器上都处于活动状态 这将很有用 问题是 某些变量的内容包含敏感信息 散列密码 所以我不想把它留在 bashrc 文件中 我只想将它保留在内存中 我知
  • ThreeJS - 直线和球体的交点

    我的场景中有两个对象 一条红线和一个球体 当相机旋转 缩放 移动时 我需要检查以下内容 从相机当前位置看 该线是否与球体相交 请参见下图 请用这个 JS 小提琴 http jsfiddle net YxK63 7 在图像上创建场景 我知道如
  • Jekyll - 如何避免在 YAML frontmatter markdownify 项目上添加段落

    好的 我有一个项目 我正在使用 Jekyll 进行播客项目 我选择通过 YAML Front Matter 项目在 shownotes 中列出主机 hosts Name A Name B Name C 使用这段代码 li strong Ho
  • CSV 中数据提取末尾的尾随逗号

    我的问题的一些背景 我有一个由 MS Access 中的查询创建的 CSV 文件 CSV 文件的主体包含列 姓名 地址 邮政编码 日期等 文件的最后一行包含数据摘要 文件名 日期 时间戳和记录总数 由于所有字段都包含字符串 并且我们不希望系
  • Travis CI for Android - 构建错误:无法找到目标且无法找到依赖项

    我正在尝试为我的 Travis CI 设置现有的Android项目 https github com evercam evercam play android我添加了 travis yml language android android
  • 使用 Json.NET 对 DataContractJsonSerializer 使用的结构中的字典进行(反)序列化? [复制]

    这个问题在这里已经有答案了 有没有办法使用 Json NET 进行 反 序列化 但继续使用字典序列化约定DataContractJsonSerializer 换句话说 有没有办法以这种结构读写 JSON MyDict Key One Val
  • 当选项的值为“None”时动态确定选项的类型

    动态获取 Option 类型有一些困难 假设我有一个函数 let printType x if box x null then printfn the type is null else printfn the type is A x Ge
  • 简单:convertAndSendToUser 我在哪里获取用户名?

    在 Spring Boot 中 Websocket 我刚刚看到这个例子 messaging convertAndSendToUser username queue notifications new Notification You jus
  • 具有相同名称的命名参数

    我正在使用 caret 库对某些树进行一些交叉验证 该库提供了一个函数 称为train 它接受一个命名参数 方法 通过省略号 它应该让其他参数传递给它调用的另一个函数 这个另一个函数 rpart 采用同名参数 方法 因此我想传递两个同名的参
  • 符号与数字数学 - 性能

    与数值计算相比 符号数学计算 尤其是求解非线性多项式系统 是否会导致巨大的性能 计算速度 劣势 有这方面的基准 数据吗 找到一个相关问题 符号计算与数值计算 https scicomp stackexchange com questions
  • 如何配置 Protractor 使用 Cucumber

    As of 0 20 1 http ng learn org 2014 03 Protractor 0 20 1 Protractor 现在完全支持 Cucumber 但我正在努力寻找有关如何正确配置它的任何文档 知道如何设置 world
  • Python获取焦点条目名称

    我试图在按下向上或向下箭头键时增加或减少输入值 为此 我需要首先找到焦点所在的条目 我正在尝试这样做 focus get 问题是我无法弄清楚它是如何工作的或者它返回什么 它为每个条目返回 1 个唯一的数字 类似于 45191744 但每次我
  • jsdom 和 $(document).ready

    我看起来就像当我浏览一页时jsdom the document ready页面脚本中的块没有被执行 这是 HTML If everything works you should see a message here h2 h2