Ответ 1
О человек. Здесь мы попадаем в сумасшедшую землю.
Как бы то ни было, ключевое различие между 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.