2014-01-26 3 views
36

Итак, все работает отлично и отлично, пока не будет обновлено npm, и теперь все работает не так, как раньше.Ошибка: jQuery требует окна с документом

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

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

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

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

ответ

13

Пакет npm для jQuery определенно используется для включения jsdom с ним, поэтому он вообще будет работать в узле: 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 больше не работает.

8

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

Тогда это:

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

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

+6

Это не работает с моей версии (v0.10.28) и текущих Jquery и jsdom модулей. – Michael

+0

@Michael Вам необходимо использовать свойство parentWindow. 'createWindow()' не существует. –

2

Вы можете попробовать следующее с этими настройками версии в вашем 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> 
+0

Спасибо! Это сработало хорошо. – Michael

+0

не работает с "jsdom": "^ 11.2.0" –

32

определение Node.js-JQuery в одной строке:

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

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

Это не сработало, 'parentWindow' не был определен. Использование 'defaultView', как в [комментарий ниже] (http://stackoverflow.com/a/33674128/242365), исправил его. – cdauth

+0

run: npm install [email protected] источник: http://stackoverflow.com/questions/19969737/node-js-module-works-from-command-line-not-from-script – ChaosPredictor

+0

У меня были проблемы после ответа , который зависит от недавно реорганизованного синтаксиса в jsdom. Использование jsdom-global работало для меня. – jlb

3

Я шлепнулся это на верхней части моего файла Node.js (сервер), который использует JQuery, чтобы помочь визуализации html текст ...

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

и все, что связано с розами.

0

Вы должны предоставить объект окна. Чтобы сделать это, просто передать ParentWindow от jsdom:

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

настоящее время я использую этот способ: проверить jsdom's 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()); 
    }); 
    } 
}); 
-1

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

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

/дома/Шридхар $ узел

// 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.. 
4

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

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

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

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

Это работало для меня

var jsdom = require('jsdom'); 
$ = require('jquery')(new jsdom.JSDOM().window); 
Смежные вопросы