首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jsdom和$(文档).ready

jsdom和$(文档).ready
EN

Stack Overflow用户
提问于 2013-03-25 00:56:55
回答 1查看 9.1K关注 0票数 3

当我通过jsdom运行一个页面时,页面脚本中的$(document).ready块并没有被执行。

下面是html:

代码语言:javascript
复制
<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>

和编解码器:

代码语言:javascript
复制
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());
});

和输出:

代码语言:javascript
复制
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>

我做错了什么?

将细节添加到令人满意的荒谬堆栈溢出率。

代码语言:javascript
复制
Bee@cleanroom:~/projects/notjs$ npm ls jsdom
notjs@1.0.0 /Users/Bee/projects/notjs
├─┬ jquery@1.8.3
│ └── jsdom@0.2.19
└── jsdom@0.3.3
Bee@cleanroom:~/projects/notjs$ node -v
v0.8.15
Bee@cleanroom:~/projects/notjs$ npm -v
1.1.66

解决方案:

谢谢你,Dave,你带我找到了正确的答案。

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

html:

代码语言:javascript
复制
    ...
    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
    ...       

代码:

代码语言:javascript
复制
    ...
    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());
    });
    ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-25 01:06:55

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

  1. 将生成的<script>标记移到内联脚本的上方。
  2. 将你的内联脚本移动到jsdom回调函数中,在回调函数中你有所有的console.log函数。因为此时已经加载了jQuery。编辑:实际上我认为jsdom就像一个预处理器?在这种情况下,这个不能工作,你需要做(1)。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15601289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档