Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2014, 11:57   #1
xander61
 
Регистрация: 18.11.2014
Сообщений: 6
По умолчанию AJAX удаление элемента и вставка нового

Здравствуйте уважаемые !

Столкнулся с такой проблемой. Есть JS скрипт таймера, который выводится в блоке.
В блоке div несколько форм, после отправки первой формы из блока, блок обновляется и появляется таймер.

Так вывожу таймер в div блоке, помимо таймера в блоке выводится еще куча инфы:

PHP код:
echo "<br><span class='text_gr' id='".$p2."'></span><script type='text/javascript'>timer_pole($p1,$p2,$p3)</script>"
Обработчик 1-й формы, та часть которая отвечает за обновление блока и вывод таймера.

PHP код:
Код......
            
success: (function() {  
                return function(
data) {
                    if (
data.status === 'success') {
                        $(
"#loadA_" data.id).load("#div #loadB_" data.id); // Обновление блока
                        
$("#pole_" data.id).after(function (){    // Вставляем в блок таймер                  
                            
return '<span style="display: none" id="' data.id '"></span><script type="text/javascript">timer_pole(' data.timer ',' data.id ',' data.id ');<\/script>';
                        });
                    }
 
Тут остальной код..... 
Здесь все работает.

Проблема возникает после отправки следующей формы

Обработчик второй формы

PHP код:
код....
 
success: (function() {
                return function(
data) {
                    if (
data.status === 'success') {
                        $(
"#loadA_" data.id).load("#div #loadB_" data.id); // Обновление блока
                        
$("#" data.id).remove(); // удаляем предыдущий элемент с таймером 
                        
$("#pole_" data.id).after(function (){    // Обновление таймера                       
                            
return '<span style="display: none" id="' data.id '"></span><script type="text/javascript">timer_pole(' data.timer ',' data.id ',' data.id ');<\/script>';
                        });
                    }
Тут остальной код..... 
Старый таймер почему то не удаляется и в итоге оба таймера вставляются в одно и то же место и вообщем они накладываются друг на друга и мерцают по очереди. Как полностью удалять старый таймер и выводить только новый. Убирать строку $("#loadA_" + data.id).load("#div #loadB_" + data.id); никак нельзя так как нужно обязательно обновлять блок div.
xander61 вне форума Ответить с цитированием
Старый 18.11.2014, 20:07   #2
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Дак ты код таймера покажи чтоли
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 18.11.2014, 20:23   #3
xander61
 
Регистрация: 18.11.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Naive Посмотреть сообщение
Дак ты код таймера покажи чтоли
Код таймера:
PHP код:
<script>
function 
timer_pole(c,DivId,id){
            var 
timerdiv document.getElementById(DivId);
            if (
timerdiv == null) {
                
clearTimeout(this); return;
            }
            if(
c<0c=0;
            
Seconds c;
            
Hours Math.floor(Seconds 3600);
            
Seconds -= Hours * (3600);
            if(
Hours 10) {Hours "0" Hours}
            
            
Minutes Math.floor(Seconds 60);
            
Seconds -= Minutes * (60);
            if(
Minutes 10) {Minutes "0" Minutes}
            
            
Seconds Math.floor (Seconds);
            if(
Seconds 10) {Seconds "0" Seconds}

            
timerdiv.innerHTML Hours ":" Minutes ":" Seconds;

            if(
c<=0) {
                
clearTimeout(this);    
                $(
"#loadA_" id).load("#div #loadB_" id);
            }else{        
                
c-=1;
                
setTimeout(function(){timer_pole(c,DivId,id)},1000);
            }
        
        }
</script> 
xander61 вне форума Ответить с цитированием
Старый 19.11.2014, 03:02   #4
xander61
 
Регистрация: 18.11.2014
Сообщений: 6
По умолчанию

Нашел в чем проблема, но не знаю как исправить. На странице создается 2 таймера с одинаковым id из-за чего функция remove() не срабатывает, пробовал удалять не по id а по классу элемента span, но с моими корявыми руками не получается. То работает как надо то не работает.
xander61 вне форума Ответить с цитированием
Старый 20.11.2014, 12:26   #5
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Именуйте таймеры.
clearTimeout() принимает на вход идентификатор, возвращенный setTimeout, а не объект.
Код:
var refreshIntervalId = setTimeout(fname, 10000);

/* later */
clearTimeout(refreshIntervalId);
Стрелок-охотник

Последний раз редактировалось mv28jam; 20.11.2014 в 12:41.
mv28jam вне форума Ответить с цитированием
Старый 20.11.2014, 15:08   #6
xander61
 
Регистрация: 18.11.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от mv28jam Посмотреть сообщение
Именуйте таймеры.
clearTimeout() принимает на вход идентификатор, возвращенный setTimeout, а не объект.
Код:
var refreshIntervalId = setTimeout(fname, 10000);

/* later */
clearTimeout(refreshIntervalId);
Напишите пожалуйста подробнее как это сделать на моем примере.

Код:
<script> 
function timer_pole(c,DivId,id){ 
            var timerdiv = document.getElementById(DivId); 
            if (timerdiv == null) { 
                clearTimeout(this); return; 
            } 
            if(c<0) c=0; 
            Seconds = c; 
            Hours = Math.floor(Seconds / 3600); 
            Seconds -= Hours * (3600); 
            if(Hours < 10) {Hours = "0" + Hours} 
             
            Minutes = Math.floor(Seconds / 60); 
            Seconds -= Minutes * (60); 
            if(Minutes < 10) {Minutes = "0" + Minutes} 
             
            Seconds = Math.floor (Seconds); 
            if(Seconds < 10) {Seconds = "0" + Seconds} 

            timerdiv.innerHTML = Hours + ":" + Minutes + ":" + Seconds; 

            if(c<=0) { 
                clearTimeout(this);     
                $("#loadA_" + id).load("#div #loadB_" + id); 
            }else{         
                c-=1; 
                setTimeout(function(){timer_pole(c,DivId,id)},1000); 
            } 
         
        } 
</script>
xander61 вне форума Ответить с цитированием
Старый 20.11.2014, 15:16   #7
xander61
 
Регистрация: 18.11.2014
Сообщений: 6
По умолчанию

Я сделал следующим образом
time_var = setTimeout(function(){timer_pole(c, DivId,id)},1000);
и в обработчике написал clearTimeout(time_var);

success: (function() {
return function(data) {
if (data.status === 'success') {
clearTimeout(time_var);
.......

Срабатывает только на первом таймере, на остальных таймерах все равно накладывает друг на друга.
xander61 вне форума Ответить с цитированием
Старый 21.11.2014, 11:14   #8
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Срабатывает только на первом таймере, на остальных таймерах все равно накладывает друг на друга.
Видимо потому-что есть область видимости переменной.
time_var вы объявили внутри ф-ии, а используете снаружи?
Код:
function a(){
	var f='ello';
	alert(f);
}
a()
alert(f);
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 21.11.2014, 13:36   #9
xander61
 
Регистрация: 18.11.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от mv28jam Посмотреть сообщение
Видимо потому-что есть область видимости переменной.
time_var вы объявили внутри ф-ии, а используете снаружи?
Код:
function a(){
	var f='ello';
	alert(f);
}
a()
alert(f);
Все работает. Для каждой формы добавил свой таймер с оригинальными id. 2 формы 2 таймера Код увеличился аж почти 2 раза но зато работает.
xander61 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать вставку в дерево бинарного поиска нового элемента и удаление его. С++ Terin_Carter Помощь студентам 0 09.04.2014 22:28
Добавление нового элемента Вероника99 Помощь студентам 7 24.12.2013 17:12
функция добавление нового элемента в дерево shilovec5377 Общие вопросы C/C++ 1 07.06.2013 10:39
Функция создания нового элемента списка C++ system_error Помощь студентам 5 03.05.2011 21:14
Вставка нового листа. tae1980 Microsoft Office Excel 3 05.02.2009 05:18