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 的相关文章

随机推荐

  • 是否可以通过电子邮件地址进行 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