Форум программистов, компьютерный форум, киберфорум
Наши страницы

JavaScript

Войти
Регистрация
Восстановить пароль
 
uvexx
0 / 0 / 0
Регистрация: 23.03.2017
Сообщений: 5
#1

Перезапись переменной в setInterval - JavaScript

23.03.2017, 15:39. Просмотров 322. Ответов 8
Метки нет (Все метки)

Добрый день!

Только-только начал изучать js. Поэтому, Уважаемые форумяне, просьба не бросаться помидорами, а просьба помочь...

Перед мной задача пушить показы баннеров из исходного html кода, записывая в переменную значение аттрибута name активного баннера. Активный баннер имеет class="flex-active-slide", интервал между сменой баннеров 5 секунд
Исходный код имеет вид
<ul class="slides">
<li class="flex-active-slide">
<a name="1">
<li>
<a name="2">
<li>
<a name="3">
</ul>

Для этой задачи использую setInterval в виде

<script>
var timerId = setInterval(function() {
var a = $('.flex-active-slide a').attr('name').length
if (a > 0){
clearTimeout(timerId);
console.log( $('.flex-active-slide a').attr('name') );
}
}, 1000);
</script>

Но в этом случае setInterval отрабатывает только один раз и все... Если убираю clearTimeout, то пушится 5 раз один и тот же баннер за время отработки setInterval (время то смены баннеров 5 сек). Изменять время setInterval не вариант поскольку возможна ручная прокрутка баннеров.

Помогите ПЖ со скриптом!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2017, 15:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перезапись переменной в setInterval (JavaScript):

setInterval() выдаёт другое значение переменной - JavaScript
Получилась такая проблема что перед вызовом функции setInterval() значение переменной одно, ну а вот в самой функции оно меняеться. С чем...

setInterval - JavaScript
Добрый вечер! помогите разобраться function func_isl(one){ var perem1 = one; $.post('isled.php', {x0:perem1}, function(data){ ...

Оптимизация setInterval() - JavaScript
В данном коде слишком много setInterval(). Вопрос и проблема в том как оптимизировать так чтобы было n-ое количество setInterval -ов ...

SetInterval остановка - JavaScript
Как остановить таймер, когда выполнится какое-то условие? То есть, сначала setInterval выполняет свои функции, потом условие выполнилось,...

setInterval() clearInreval() - JavaScript
Я хочу что через 5 секунд появится одно окно а когда я закрою окно он опять не появился через 5 секунд setInterval() clearInreval()

SetInterval ,2 функции - JavaScript
Не получается сделать бесконечное выполнение двух функции ,с задержкой. Весь код не вижу смысла выкладывать. Есть две функции cvet() и...

8
Azdeman
Фрилансер
Эксперт HTML/CSSЭксперт PHP
1724 / 1267 / 345
Регистрация: 12.01.2011
Сообщений: 5,039
23.03.2017, 16:02 #2
Цитата Сообщение от uvexx Посмотреть сообщение
clearTimeout
Здесь же нет setTimeout что бы использовать clearTimeout.
Для setInterval есть clearInterval

Добавлено через 5 минут
Цитата Сообщение от uvexx Посмотреть сообщение
Изменять время setInterval не вариант поскольку возможна ручная прокрутка баннеров.
А в чём собственно проблема ?
0
uvexx
0 / 0 / 0
Регистрация: 23.03.2017
Сообщений: 5
23.03.2017, 16:13  [ТС] #3
Проблема в том, что я скрипт отдает за время работы setInterval 5 раз одно и тоже значение прежде чем произошла смена баннера, а должен только один раз отдать значение для каждого баннера

Убрал, к примеру, setTimeout. В html 3-и тега a. Смена активного тега а на другой происходит через 5 секунд. За это время setInterval логирует 5 раз тег а1, потом 5 раз а2 и т.д.

Мне нужно чтобы он логировал только по одному разу. При этом изменить время отрaботки setInterval не могу поскольку есть возможность ручного пролистывания

<script>
var timerId = setInterval(function() {
console.log( $('.flex-active-slide a').attr('name') );
}
}, 1000);
</script>
0
Padimanskas
Superposition
854 / 592 / 109
Регистрация: 27.10.2013
Сообщений: 2,061
24.03.2017, 02:57 #4
Цитата Сообщение от uvexx Посмотреть сообщение
Перед мной задача пушить показы баннеров из исходного html кода
Это не описание задачи, а конкретные инструкции. Для постановки задачи нужно опираться на пользовательский опыт. Например:
"нажали на картинку левой кнопкой мыши -> предыдущая картинка исчезла, на ее месте появилась следующая"
в таком духе.
0
uvexx
0 / 0 / 0
Регистрация: 23.03.2017
Сообщений: 5
24.03.2017, 11:14  [ТС] #5
Господа, я не прошу сделать поставленную за меня задачу... Я старался максимально подробно описать задачу...
Просьба просто подсказать, намекнуть... Может я вообще не правильно подошел к задаче, может setInterval это не лучший способ решения...

Но поскольку опыта нет, то я счел setInterval оптимальным вариантом для пуша показов баннеров в слайдере. Но сделать чтобы на пуш активного баннера не не имел влияния интервал генерации setInterval не могу...

Теоретически, думаю нужно заводить if else с проверкой условий и перезаписью переменных, типа вот этого

var timerId = setInterval(function() {
var a = $('.flex-active-slide a').attr('name')
var b

if (a == b) {console.log( 'повтор setInterval' );}
else
if (a != b && b == 'undefined' )
{console.log( a );
b = a;}
else
if (a != b && b != 'underfined')
{console.log( a );
b = a;}

}, 1000);

Но почему-то все равно активный баннер выводится в консоль 5 раз вместо 1-го раза

Что я делаю не так?
0
j2FunOnly
Модератор
615 / 600 / 274
Регистрация: 05.06.2015
Сообщений: 1,438
24.03.2017, 12:32 #6
uvexx, вам надо хранить состояние и в зависимости от него выполнять некие действия. Например, сохранить значение последнего слайда. И с интервалом проверять его на соответсвие показываемому. Если совпадает, то ничего не делать, иначе "пушить показы баннеров" (что бы это ни значило).
Навскидку:
Javascript
1
2
3
4
5
6
7
8
var currentSlide;
setInterval(function () {
  var newSlide = $('.flex-active-slide a').prop('name');
  if (currentSlide == newSlide) return;
 
  currentSlide = newSlide;
  console.log(currentSlide);
}, 1000);
1
Padimanskas
Superposition
854 / 592 / 109
Регистрация: 27.10.2013
Сообщений: 2,061
24.03.2017, 13:05 #7
Цитата Сообщение от j2FunOnly Посмотреть сообщение
"пушить показы баннеров" (что бы это ни значило)

0
uvexx
0 / 0 / 0
Регистрация: 23.03.2017
Сообщений: 5
24.03.2017, 13:18  [ТС] #8
Цитата Сообщение от Padimanskas Посмотреть сообщение

Пушить в моем случае потребуется потом в gtm (вместо консоли будет dl)

Добавлено через 1 минуту
Цитата Сообщение от j2FunOnly Посмотреть сообщение
uvexx, вам надо хранить состояние и в зависимости от него выполнять некие действия. Например, сохранить значение последнего слайда. И с интервалом проверять его на соответсвие показываемому. Если совпадает, то ничего не делать, иначе "пушить показы баннеров" (что бы это ни значило).
Навскидку:
Javascript
1
2
3
4
5
6
7
8
var currentSlide;
setInterval(function () {
  var newSlide = $('.flex-active-slide a').prop('name');
  if (currentSlide == newSlide) return;
 
  currentSlide = newSlide;
  console.log(currentSlide);
}, 1000);
Круто!!! Спасибо!!!

Работает!!!
0
uvexx
0 / 0 / 0
Регистрация: 23.03.2017
Сообщений: 5
09.11.2017, 10:28  [ТС] #9
Господа добрый день!

Ранее вы помогли с реализацией функции setInterfal.

var currentSlide;
setInterval(function () {
var newSlide = $('.flex-active-slide a').prop('name');
if (currentSlide == newSlide) return;

currentSlide = newSlide;
console.log(currentSlide);
}, 1000);

Помогите ПЖ еще раз с ней же...

Прошлая задача усложнилась тем, что в новом ul слайдера в тегах li нет класса вообще, но есть аттрибут aria-hidden со значение true - это пассивный баннер и false - это активный баннер

пытаюсь запустить прошлый скрипт с циклом for, но в консоле молчание
есть подозрение, что цикл for не работает в setInterval, но как тогда записать этот обработчик?

Вот как я пытаюсь это сделать:
var currentSlide;
setInterval(function () {

var ul = $('ul.bxslider li') // все составляющие слайдера
for ( q = 0; q < ul.length; q++) { // начинаем переборку li и ищем аттрибут со значение false
if ($(ul[q]).attr('aria-hidden') == 'false') // если равенство, то записываем значение alt тега img в переменную newSlide

var newSlide = $(ul[q].firstChild.firstChild).attr('alt'); //структура такая <ul><li>-><a>-><img><li>... поэтому использую 2-а раза firstChild

var newSlide = $('.flex-active-slide a').prop('name');
if (currentSlide == newSlide) return;

currentSlide = newSlide;
console.log(currentSlide);
}
}, 1000);
0
09.11.2017, 10:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2017, 10:28
Привет! Вот еще темы с ответами:

setInterval не работает - JavaScript
Ну почему этот маленький зелёненький квадратик не хочет опускаться в низ? Я уже головой об стенку начинаю биться. &lt;div...

не работает setInterval - JavaScript
Выдает Uncaught SyntaxError: Unexpected identifier подскажите что не так var timer = setInterval( function() { ...

Не работает setInterval(); - JavaScript
Подскажите, пожалуйста, почему код не перезапускается каждые 300 мс? &lt;title&gt;DOM elements&lt;/title&gt; &lt;body&gt; &lt;div id=&quot;change&quot;&gt; ...

Не работает setInterval - JavaScript
Здравствуйте var idb; var asd = 0; $(&quot;.button&quot;).mouseenter(function() { idb = $(this).attr('id'); var ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.