Я не уверен, помогает ли Тар, но у меня была похожая проблема.
Я писал объект для вычисления ширины моих DIV в соответствии с моим innerWidth:
function ScreenGrid() {
'use strict';
this.ColumnIDs = new Array();
this.Widths = new Array();
this.Dynamic = true;
this.Set = adjust;
var ColumnIDsPersist;
var WidthsPersist;
function adjust() {
//stuff
for (var i = 0; i < ColumnIDsPersist.length; i++) {
Функция настройки - это то, где происходит волшебство. Чтобы гарантировать, что DIV будут оставаться на экране, я использовал следующий код:
if (window.addEventListener) {
// Good browsers.
window.addEventListener('resize', react, false);
}
else if (w.attachEvent) {
// Legacy IE support.
window.attachEvent('onresize', react);
}
else {
// Old-school fallback.
window.onresize = react;
}
И это функция реагирования:
// Slight delay.
function react() {
// Clear the timer as window resize fires,
// so that it only calls adapt() when the
// user has finished resizing the window.
clearTimeout(timer);
// Start the timer countdown.
timer = setTimeout(adjust, 16);
// -----------------------^^
// Note: 15.6 milliseconds is lowest "safe"
// duration for setTimeout and setInterval.
//
// http://www.nczonline.net/blog/2011/12/14/timer-resolution-in-browsers
}
Проблема заключалась в том, что каждый раз, когда срабатывает REACT, o не определено в этом. После большого количества исследований я заметил, что когда я запускал ADJUST из SET (), объект THIS был моим SCREENGRID, но когда я запускал из REACT, он становился WINDOW, поэтому я не определился в this.ColumnIDs.
Я решил с этим кодом:
function ScreenGrid() {
'use strict';
this.ColumnIDs = new Array();
this.Widths = new Array();
this.Dynamic = true;
this.Set = adjust;
var ColumnIDsPersist;
var WidthsPersist;
function adjust() {
// This clearTimeout is for IE.
// Really it belongs in react(),
// but doesn't do any harm here.
clearTimeout(timer);
// Parse browser width.
var _width = window.innerWidth || window.document.documentElement.clientWidth || window.document.body.clientWidth || 0;
var _heigth = window.innerHeight || window.document.documentElement.clientHeight || window.document.body.clientHeight || 0;
var _usedWidth = 0;
var _fluidColumn = null;
//Ao chamar a função adjust novamente no evento on resize, o objeto THIS deixa de ser a função e passa a ser a janela,
//Essas vareáveis garantem a persistencia dos dados a serem utilizados.
ColumnIDsPersist = (typeof ColumnIDsPersist == 'undefined') ? this.ColumnIDs : ColumnIDsPersist;
WidthsPersist = (typeof WidthsPersist == 'undefined') ? this.Widths : WidthsPersist;
for (var i = 0; i < ColumnIDsPersist.length; i++) {
Ну вот и все, надеюсь, это поможет!