Установить ширину окна в jsDom?

Должен быть простой вопрос. Как установить ширину в объекте jsDom?

    jsdom.env({
        url:'http://testdatalocation',
        scripts: ['http://code.jquery.com/jquery.js'],
        done: function(errors, tstWindow) {
            console.log(tstWindow.innerWidth);
};
}
});

Я не могу понять, как заставить "innerWidth" быть чем-то другим, кроме 1024.


person Skip Huffman    schedule 22.10.2014    source источник
comment
Ваше последнее предложение подразумевает, что вы пытались это сделать, но это не сработало. Что вы пробовали?   -  person Louis    schedule 22.10.2014
comment
Несколько вещей. Я попробовал tstWindow.resizeTo(#) tstWindow.resizeBy(#) установить атрибут ширины, установить атрибут innerWidth и некоторые другие вещи, которые я не помню.   -  person Skip Huffman    schedule 22.10.2014
comment
Я подозреваю, что сталкиваюсь с трудностями отчасти из-за изменений API, но также, похоже, я не полностью разобрался с jsDom. (Спасибо за помощь в другом моем вопросе, Луи, это продолжение того же самого)   -  person Skip Huffman    schedule 22.10.2014


Ответы (2)


В настоящее время для этого не существует формального варианта или API.

Значения innerWidth и подобных свойств просто установить буквальные значения:

DOMWindow.prototype = createFrom(dom || null, {
  // ...
  name: 'nodejs',
  innerWidth: 1024,
  innerHeight: 768,
  outerWidth: 1024,
  outerHeight: 768,
  // ...
});

Помимо тестовых примеров и документации, outerWidth больше нигде не упоминается в jsdom, поэтому вы, вероятно, могли бы назначить новое значение в created событие, а также обновление outerWidth.

Основным вариантом использования created является изменение объекта окна (например, добавление новых функций во встроенные прототипы) перед выполнением каких-либо сценариев.

created: function (errors, tstWindow) {
    tstWindow.outerWidth = tstWindow.innerWidth = 1440;
},
done: function(errors, tstWindow) {
    console.log(tstWindow.innerWidth);
}
person Jonathan Lonowski    schedule 22.10.2014
comment
Будет ли это передано любому javascript на странице? - person Skip Huffman; 22.10.2014
comment
@SkipHuffman Если перейти на событие created, а не на done, как у меня, то да. Это событие предназначено для того, чтобы разрешить изменение window до запуска каких-либо сценариев. - person Jonathan Lonowski; 22.10.2014

Методы resizeTo и resizeBy не реализованы. Вы можете увидеть это, выполнив поиск в кодовой базе jsdom:

$ grep -P 'resize(To|By)' `find . -type f`
./lib/jsdom/browser/index.js:    resizeBy: NOT_IMPLEMENTED(null, 'window.resizeBy'),
./lib/jsdom/browser/index.js:    resizeTo: NOT_IMPLEMENTED(null, 'window.resizeTo'),

Если вы просто хотите установить размер окна раз и навсегда во время инициализации, вы можете просто установить значение innerWidth на то, что хотите. В реальном браузере это неправильный способ сделать это, но в jsdom это сработает.

Однако, если у вас есть код, который зависит от присутствия resizeTo, вы можете добавить свой собственный полифилл в конструктор, который создает окна:

var jsdom = require("jsdom");

var document = jsdom.env({
    html: "<html></html>",
    done: function (error, w) {
        console.log(w.innerWidth, w.innerHeight);
        w.constructor.prototype.resizeTo = function (width, height) {
            this.innerWidth = this.outerWidth = width;
            this.innerHeight = this.outerHeight = height;
        };
        w.resizeTo(100, 200);
        console.log(w.innerWidth, w.innerHeight);
    }
});

Это отображает:

1024 768
100 200

Приведенный выше код предназначен для иллюстрации. Я не думал обо всех тонкостях написания полифилла для resizeTo. resizeBy будет обрабатываться аналогично, но будет добавлять дельты к размеру окна.

person Louis    schedule 22.10.2014
comment
Спасибо, надо немного проанализировать. - person Skip Huffman; 22.10.2014