代码之家  ›  专栏  ›  技术社区  ›  Zach Smith

为什么JQuery需要一个全局“窗口”对象?

  •  0
  • Zach Smith  · 技术社区  · 6 年前

    我在用 jsdom jquery

    jsdom公司 将HTML字符串转换为DOM树,包括 window 窗口 global.window ,否则JQuery会出错(表示需要全局窗口对象)。为什么需要这样做?

    // Create DOM from HTML
    const JSDOM = require('jsdom').JSDOM;
    const jsDom = new JSDOM('<html>...</html>')
    
    // Set up JQuery
    const { window } = jsDom;
    const { document } = window;
    global.window = window;
    const $ = global.jQuery = require('jquery');
    
    // Scrape content
    const tbl = $(document)
      .find('#table-id')
      .find('tr').each(function() {
        // Do something with $(this).html()
      })
    

    而且,我经常看到这样的情况: const $ = global.jQuery = require('jquery'); global.jQuery 必修的?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Louis    6 年前

    jQuery期望在浏览器中运行。在浏览器中 window 存在于全局空间中,jQuery利用它来实现它的一些特性。在Node.js中,代码在为包含它的文件创建的作用域中运行。即使你不把它当作 ,Node.js不会对所有 const let )文件顶层的声明声明了作用域为文件的变量。所以呢 const { window } = jsDom; 不是把 窗口 在全局空间中,jQuery无法访问它。

    在节点中运行jQuery时有两种选择:

    1. 做你正在做的事情:首先暴露 进入全局空间,然后加载jQuery。这个很好用。

    2. 您可以这样做:

      const JSDOM = require('jsdom').JSDOM;
      const jsDom = new JSDOM('<html>...</html>');
      
      const { window } = jsDom;
      const { document } = window;
      const $ = global.jQuery = require("jquery")(window);
      

    const $ = global.jQuery = require('jquery'); . 根据我的经验,大多数依赖jQuery的库(比如jQuery插件)将其称为 jQuery . 他们的生活是这样的:

    (function ($) { // Inside the IIFE, jQuery is bound to $.
    
    
    }(jQuery)); // jQuery is grabbed from the global space as jQuery.
    

    所以你想 在全球范围内支持依赖它的图书馆。

        2
  •  0
  •   rafaelcastrocouto    6 年前

    你可以这样做:

    const jsDom = new JSDOM('<html>...</html>');
    const $ = global.jQuery = (require('jquery'))(jsDom.window);