О человек. Вот где мы попадаем в безумную землю.
В сущности, ключевое различие между jsdom и «браузером» в том, что мы можем получить доступ к окну извне. Например, в вашем примере вы устанавливаете $
на window.$
, что в основном говорит "эй, для этого текущего окна я хочу ссылку на объект jquery". Вы можете иметь 10 окон и хранить ссылки на все их $
.
Теперь предположим, что вы загружаете новую страницу из-за отправки формы / клика по ссылке ...
JSDOM потребуется перезагрузить окно и обновить контекст javascript (возможно, внедрить сценарии, которые вы предоставили в исходном вызове jsdom.env). К сожалению, ссылки, которые вы держали в последнем окне, будут удалены / перезаписаны. Другими словами, вызов $(...)
после перезагрузки страницы может привести к неожиданному поведению (скорее всего, утечка памяти или выбор элементов dom на предыдущей странице)
Как вы справляетесь с этим?
Поскольку вы уже используете jquery, сделайте что-то вроде ..
var form = $('#htlbotForm');
var data = form.serialize();
var url = form.attr('action') || 'get';
var type = form.attr('enctype') || 'application/x-www-form-urlencoded';
var method = form.attr('method');
request({
url : url,
method : method.toUpperCase(),
body : data,
headers : {
'Content-type' : type
}
},function(error, response, body) {
// this assumes no error for brevity.
var newDoc = jsdom.env(body, [/* scripts */], function(errors, window) {
// do your post processing
});
});
YMMV, но этот подход должен работать в ситуациях, не связанных с Ajax.