2016-08-23 3 views
0

Я новичок в JavaScript и потянув меня за волосы над этим ...Как я могу отменить выполнение JavaScript?

Демонстрационный проблемы здесь: http://codepen.io/sol_b/pen/PzgdWy

И это сценарий:

var sections = function() { 
    $('.image').each(function() { 
    var $this = $(this), 
     x = $this.find('img').width() 
    $this.width(x); 
    }); 
}; 

$(document).ready(function() { 
    sections(); 
}); 

$(window).resize(function() { 
    sections(); 
}) 

Ширина изображения вычисляется и присваивается контейнеру изображения. Идея состоит в том, что ряд изображений всегда будет поддерживать их соотношение сторон, без пробелов между контейнерами.

Проблема заключается в том, что код не срабатывает около 50% времени, а изображения просто хлюпают вместе. Изменение размера окна исправляет его, поэтому я думаю, что это как-то связано с последовательностью загрузки.

Я пробовал использовать window.onload и img.onload вместо document.ready, и это не решило его. Я что-то пропустил в своем сценарии?

+2

Из [Документов] (https://api.jquery.com/ready/): _ ", в тех случаях, когда код полагается на загруженные активы (например, если требуются размеры изображения), код должен быть помещен в обработчик для события 'load' вместо этого." _ –

+0

[Документация] (https://api.jquery.com/ ready /) «В случаях, когда код использует загруженные активы (например, если требуются размеры изображения), вместо этого код должен быть помещен в обработчик для события загрузки». – Sohil

+0

@JuanMendes, пожалуйста, удалите дубликат здесь. Это не вопрос! Речь идет не о «всех» изображениях. – eisbehr

ответ

2

Используйте вместо этого:

$(window).on('load resize', sections); 
+0

Да, это лучший подход. Удивленный я не думал об этом +1 –

+0

Это сработало отлично, спасибо. – sol

-1

Я считаю, что вы ищете функцию timeout().

Если мое понимание верное, вы можете позвонить window.timeout([function to call], [time in ms], и функция для вызова будет выполнена, что много мс ПОСЛЕ выполнения кода. Он не будет ждать, как sleep().

3

Используйте load на изображение и рассчитывать, пока все будут загружены, а затем выполнить вашу функцию.

var images $('.image'); 
var amount = images.length; 

images.on('load', function() { 
    if(--amount == 0) { 
     sections(); 
    } 
}); 

Чтобы предотвратить кэшированные изображения, которые будут выполняться от слушателя, вы можете запустить их вручную (даже на window.load). Эти линии будут срабатывать событие для кэшированных элементов:

images.each(function() { 
    $(this).complete && $(this).trigger('load'); 
}); 
+0

Это просто переуплотняет его, когда вы можете просто использовать событие загрузки окна –

+1

Это необходимо, только если изображения создаются динамически. Обратите внимание, что событие загрузки может не срабатывать, если изображение кэшируется. Событие загрузки в окне уже ожидает всех изображений –

+0

@JuanMendes 'Это нужно только, если изображения создаются динамически. Что вы имеете в виду? –

0

Попробуйте использовать 'под нагрузкой' обработчик событий вместо $ (документ) .ready:

$(window).on('load', function() { 
    sections(); 
}); 

вместо:

$(document).ready(function() { 
    sections(); 
}); 


Или вы можете использовать:

$(window).on('load resize', function() { 
    sections(); 
}); 

Чтобы обрабатывать оба события :)

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