Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   не работает повторно скрипт (https://javascript.ru/forum/jquery/28196-ne-rabotaet-povtorno-skript.html)

brussens 10.05.2012 22:32

не работает повторно скрипт
 
Доброго времени суток, уважаемые форумчане) При работе с Jquery появилась проблема на последнем этапе создание древовидной системы комментариев. Вобщем комментарий добавляется прекрасно, но вот при попытке добавления второго комментария без перезагрузки при добавлении первого скрипт как будто отключается. Подскажите пожалуйста, в чём может быть проблема? Заранее спасибо)

atlantis 11.05.2012 00:02

Тут экстрасенсов нет.
Код в студию.

brussens 13.05.2012 01:55

$(function (){ 
  	
      /* Объект sendDataComment будет содержать данные для отправки на сервер
         commentForm - переменная, в которую будет помещен клон формы         */

      var sendDataComment = {}; 
      var commentForm;
	  var commentnew = {};
	  var commentid = {};
// Функция создает форму для ответа путем клонирования нашей спрятанной формы
      function CommentForm()
      {
      	if(commentForm) 
	{
          // Проверяем существования клона. Если он уже создан, то удаляем его, а затем создаем новый.
		  $('.companel').css('display', 'block');
            removeCommentForm();			
          } 
          commentForm = $('#newComment').clone();
      }
      
      // Функция удаления клона 
      function removeCommentForm()
      {
         commentForm.fadeOut(500);
         sendDataComment = {};
      }
      
      
      /* На событие клика по кнопке "Добавить комментарий/Ответить" вешаем необходимые действия */
      
$('#addNewComment, .responce').click(function(){
          var clickId = this.id;
		  commentid.id = clickId;
          CommentForm(); // Создаем клона формы
          
          if($(this).attr('id') == 'addNewComment')
          {
              // Новый комментарий
              // Добавляем форму после всех комментариев
            commentForm.appendTo('#commentRoot').slideDown(500);
             
          }
          else
          {
              // Новый ответ
              // Добавляем форму под родительским комментарием 
              // Для этого находим родительский элемент li
              var parentComment = $(this).parent().parent();
			  $('#newComment').slideUp(5000);
              // в sendDataComment добавим идентификатор родителя
             sendDataComment.parent_id = clickId;
			 commentnew.parent_id = clickId;
             var childs =  parentComment.find('ul'); // Ищем у этого коммента потомков (ответы)
             if(!childs.length)
             {
              // Если у этого комментария нет  ответов (потомков) добавим для ответов контейнер ul, а затем уже в этот контейнер нашу форму
                 parentComment.append('<ul></ul>');
                 commentForm.appendTo(parentComment.children('ul'));
				 
             }  
             else
              commentForm.prependTo(childs); // Добавляем форму в контейнер для ответов
              
          }
		  $('#companel' + clickId).fadeOut(500);//скрытие панели коммента
          commentForm.slideDown(500); // Показываем форму
		
          return false; // предотвращаем дефолтное действие браузера
      });
      
      
     
      $('#cancelComment').live('click', function(){
	  $('.companel').fadeIn(500);
          // Здесь live обязательно, т.к. мы работаем не с самой формой, а ее клоном
          removeCommentForm();
  
      })
 
      
 /* По клику на кнопку "Сохранить", доформировываем объект данных и отправляем их на сервер */

 $('button#save').live('click',function(){
    sendDataComment.author = commentForm.find("input[name='name']").val();   
    sendDataComment.comment = commentForm.find("textarea").val();
	commentnew.comment = sendDataComment.comment;
    sendData(); // Отправка данных
    
 });

 // Функция отправки данных комментария на сервер

function sendData()
{
   commentForm.find('button').hide().next().show(); // Прячем кнопку и показываем лоадер

  $.post(
           "/includes/add_feed.php",
           sendDataComment, 
           function(data){ // Обработчик ответа от сервера
commentnew.id = data;
formToComment();
		   //console.log(commentnew);
          }
)


}

 
 // Функция преобразование формы в комментарий

 function formToComment()
 {
   
   
console.log(commentnew);
   
   
    $.post(
           "/includes/return_feedbody.php",
           commentnew, 
           function(data){ // Обработчик ответа от сервера
//console.log(data);
//$('#commentroot').html(data);
$('ul#commentsRoot' + commentid.id).fadeIn(500).append(data);
removeCommentForm();
commentForm.removeAttr('id');
sendDataComment = {};
console.log(sendDataComment);
commentForm = null;
          }
)
 // Обязательно commentForm присваиваем значение null, таким образом, мы разорвем связь между полученным в итоге комментом и объектом в js 
 }
     
    
  });

собственно вот и сам код))) Можете что либо сказать про больного? Возможно реанимировать?

brussens 15.06.2012 16:00

Может кто нибудь помоч?

tadjik1 15.06.2012 16:08

честно говоря, очень долго читать, первое, что встретилось:

// Функция удаления клона
      function removeCommentForm()
      {
         commentForm.fadeOut(500);
         sendDataComment = {};
      }

фейдаут не удаляет элемент, а только прячет. может быть в этом дело. попробуйте
commentForm.fadeOut(500, function() { $(this).remove(); });

brussens 15.06.2012 16:54

Цитата:

Сообщение от tadjik1 (Сообщение 181658)
честно говоря, очень долго читать, первое, что встретилось:

// Функция удаления клона
      function removeCommentForm()
      {
         commentForm.fadeOut(500);
         sendDataComment = {};
      }

фейдаут не удаляет элемент, а только прячет. может быть в этом дело. попробуйте
commentForm.fadeOut(500, function() { $(this).remove(); });

Спасибо, попробовал, ничего к сожалению не получилось((( Только вот заметил одну вещь: после появления комментария почему то не работает повторное добавление на только что добавленном, на добавленных ранее до последнее перезагрузки страницы появляется поле и всё работает, теперь совершенно я потерялся(((

brussens 15.06.2012 20:21

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

Deff 15.06.2012 21:27

brussens,
Тестовик с действием есть ? больно код длиннен и нет обвязки

brussens 15.06.2012 21:55

А как можно связаться? Через 5 минут будет тестовик

Deff 15.06.2012 22:16

brussens,
Выложите тут или в личку

brussens 19.06.2012 18:01

Цитата:

Сообщение от Deff (Сообщение 181763)
brussens,
Выложите тут или в личку

К сожалению хостинг отказывается почему то работать с доменом... Но я переписал скрипт, сделав его поменьше... Но всё равно не работает... Firebug при вставке кода скрипта выдаёт такую ошибку
SyntaxError: Unexpected end of input
Что обозначает ошибка нашёл, а вот где она происходит не найду... Вот новый более простой код
$(document).ready(function() {
var form = "<li id='newComment' class='commentform'><div class='clear'></div><div class='commentContent'><div class='comment'><textarea name='newCommentText'></textarea></div><button id='save'>Сохранить</button><img class='loader' src='images/loader.gif'><button id='cancelComment'>Удалить</button></div></li>";
var CommentData = {};//глобальный массив с данными для отпраки

$('.responce').click(function(){//клик по кнопке ответить
	$('.companel').show();
	if ($("li").is("#newComment")) {
		$('#newComment').remove();
	}
	CommentData.id = this.id;
	$("#companel" + CommentData.id).hide();
	$("#companel" + CommentData.id).after(form);
});

$('#cancelComment').live('click', function(){//клик по кнопке удалить форму
		$('#newComment').remove();
	$('.companel').show();
	$("#commentRoot").after(form);

});

$('#save').live('click',function(){//клик по кнопке сохранить

CommentData.comment = $("textarea").val();
sendData();
CommentData = {};
console.error(CommentData);
});
function sendData() {// Функция отправки данных комментария на сервер
$.post("/includes/add_feed.php", CommentData, function(data){ // Обработчик ответа от сервера
formToComment();

});
}

 
 // Функция преобразование формы в комментарий

function formToComment() {
$.post("/req.php", function(data){ // Обработчик ответа от сервера
$('#commentRoot').html(data);
});
}

});

Заранее благодарю...

Deff 19.06.2012 18:10

brussens,
Если вы не оч сильны в PHP (посколь Аякс ответ нун корректно прописать на серве
проще отправлять данные в скрытой форме с перенаправлением данных в изначально пустой скрытый фрейм(для теста -не скрываем)
По событию загрузки фрейма - считывать данные из него Заодно и протестируете Ответ

Как организовать перенаправление => http://htmlbook.ru/html/form/target

brussens 19.06.2012 18:45

А про Ajax я не знал, что там есть какие то ограничения... Просто думал, что если скрипт выполняется один раз, то и второй ведь раз должен( Это может быть например изза отсутствия exit()???

Deff 19.06.2012 18:58

Цитата:

Сообщение от brussens
Просто думал, что если скрипт выполняется один раз, то и второй ведь раз должен

brussens,
Там нет ограничений, кроме старых Ие - сделайте для теста на фрейме не скрывая фрейм, - мну подозревает что проблема в серверном ответе...
Если нет ... бум думать далее


Часовой пояс GMT +3, время: 11:32.