2014-10-22 3 views
3

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

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

Я не могу понять, как получить «innerWidth», чтобы быть что угодно, но 1024

+0

Ваше последнее предложение означает, что вы пытались сделать это, но это не сработало. Что вы пробовали? – Louis

+0

Несколько вещей. Я попробовал tstWindow.resizeTo (#) tstWindow.resizeBy (#), устанавливая атрибут width, устанавливая атрибут innerWidth и некоторые другие вещи, которые я не помню. –

+0

Я подозреваю, что сталкиваюсь с трудностями частично из-за изменений API, но также, похоже, не полностью разобрался с jsDom. (Спасибо за вашу помощь по моему другому вопросу, Луис, это продолжение того же самого) –

ответ

1

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

Значения innerWidth и аналогичных свойств просто set to literal values:

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

Помимо тестовых случаев и документации, outerWidth isn't referenced elsewhere else in jsdom, так что вы, вероятно, можете присвоить новое значение в created event, обновляя outerWidth, а также.

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

created: function (errors, tstWindow) { 
    tstWindow.outerWidth = tstWindow.innerWidth = 1440; 
}, 
done: function(errors, tstWindow) { 
    console.log(tstWindow.innerWidth); 
} 
+0

Будет ли это передано на любой javascript на странице? –

+1

@SkipHuffman Если вы перешли к событию 'created', то против' done', как и у меня, да. Цель этого мероприятия - разрешить модификацию «окна» до запуска любых скриптов. –

3

В 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 присутствия, вы можете добавить свой собственный polyfill в конструктор, который строит окна:

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 будет обрабатываться аналогичным образом, но добавит deltas к размеру окна.

+0

Спасибо, мне придется немного проанализировать это. –

Смежные вопросы