Подтвердить что ты не робот

Ошибка: для jQuery требуется окно с документом

Итак, все работало отлично и отлично, пока не обновлялось npm, и теперь все работает не так, как раньше.

Немного фона: в моем коде я использую jquery для разбора текстового html. Я не использую окно, и я не использую jsdom. Для этого он работал нормально:

$ = require("jquery"); 
$(html).find("<h1>").html("The title"); 

Но теперь я получаю следующее: Для jQuery требуется окно с документом

Как это исправить?

4b9b3361

Ответ 1

node.js-jQuery в одной строке:

// definition
var $ = require('jquery')(require("jsdom").jsdom().parentWindow);

// usage
$("body").append("<div>TEST</div>");
console.log($("body").html());

Ответ 2

Пакет npm для jQuery определенно используется для включения jsdom с ним, поэтому он вообще будет работать в Node: jQuery должен иметь некоторую среду DOM для работы.

Вы можете проверить, что старые версии использовали его, выполнив npm install [email protected]. Вы увидите, что с ним установлено jsdom. По какой-то причине они, похоже, удалили jsdom из последних выпусков. Я не знаю, почему.

Однако использование jsdom 7.x для запуска кода jQuery прост:

var jsdom = require("jsdom");
var window = jsdom.jsdom().defaultView;

jsdom.jQueryify(window, "http://code.jquery.com/jquery.js", function () {
  var $ = window.$;
  $("body").prepend("<h1>The title</h1>");
  console.log($("h1").html());
});

Путь может быть изменен на другую версию jQuery или на локальный файл.

Примечание. Более ранние версии jsdom, включая серии 3.x, нуждаются в строке var window = jsdom.jsdom().parentWindow; вместо var window = jsdom.jsdom().defaultView;. 4.x сделал так, чтобы parentWindow больше не работал.

Ответ 3

Я решил это. пришлось сначала удалить jsdom и jquery, а затем npm установить jsdom jquery.

Затем это:

var jsdom = require("jsdom"); 
$ = require("jquery")(jsdom.jsdom().createWindow()); 

Оказывается, важно, чтобы у меня была последняя версия. В противном случае это не сработало.

Ответ 4

(Кажется, все ответы теперь устарели)

Вот как я сделал это работу (gist using mocha):

var jsdom = require('jsdom'),
    window = jsdom.jsdom().defaultView;

jsdom.jQueryify(window, "../js/vendor/jquery.min.js", function(){
    var $ = window.$; 
})

Ответ 5

Я наложил это на верхнюю часть моего Node.js(сервера) файла, который использует jQuery для рендеринга html-текста...

var jsdom = require("jsdom").jsdom;
jsdom.env({
    html : "<html><body></body></html>",
    done : function(errs, window) {
        global.window = window;
    }
});

и все придумывает розы.

Ответ 6

Вы можете попробовать следующее с этими настройками версии в package.json:

"jquery": "^2.1.1",
"jsdom": "^1.0.0-pre.3"

Скажем, у вас есть файл с именем page.htm:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>Html page</h1>
    <div class="left">
        <p>left content</p>
    </div>
</body>
</html>

Затем вы можете прочитать из файла, создать DOM и окно из него с помощью JSDOM и передать его в jquery:

var jsdom = require("jsdom").jsdom;
var fs = require('fs');
fs.readFile('page.htm', {encoding: "utf8"}, function (err, markup) {
  if (err) throw err;
  var doc = jsdom(markup);
  var window = doc.parentWindow;
  var $ = require('jquery')(window)
  var outerLeft = $(".left").clone().wrap('<div></div>').parent().html();
  var innerLeft = $(".left").html();
  console.log(outerLeft, "and ...", innerLeft);
});

выведет:

<div class="left">
<p>left content</p>
</div> and ... 
<p>left content</p>

Ответ 7

Вы должны предоставить объект окна. Для этого просто передайте parentWindow из jsdom:

var jsdom = require("jsdom"); 
var $ = require("jquery")(jsdom.jsdom().parentWindow);

Ответ 8

В настоящее время я использую этот способ: check jsdom documentation

 var html = fs.readFileSync("./your_html_file.html");

 jsdom.env({
  //url: "http://url_here", //in case you want to load specific url 
  //html property is used in case of you need to load html string here
  html: html,
  scripts: ["http://code.jquery.com/jquery.js"],
  done: function (err, window) {
    var $ = window.$;
    //start using jquery now 
    $("p").each(function(index) {
      console.log("paragraph ", index, $(this).text());
    });
  }
});

Ответ 9

Я использовал neoRiley 2 строки в командной строке node и протестировал jQuery promises в командной строке. Добавлен jquery в командную строку node через npm // https://github.com/UncoolAJ86/node-jquery для инструкций.

npm install -S '[email protected]>=2.1'
npm install -S '[email protected]'

/home/sridhar $node

// make $ available on node commandline
>var jsdom = require("jsdom"); 
>var $ = require("jquery")(jsdom.jsdom().parentWindow);
>var promise = new $.Deferred();
>promise.done(function(){console.log('Starting game ..');});
>promise.resolve();

обещание разрешает успешный обратный вызов, "Начальная игра.." будет напечатана консольный выход

Starting game..