Подскажите пожалуйста, может кто сталкивался с такой проблемой. (Я точно не знаю кэширование это или что другое но...) Есть диалоговое окно (виджет UI.Dialog) В данном окне есть кнопка (open_add_pair_field) при нажатии на которую в данное диалоговое окно аяксом вставляется контент. [js]$(".open_add_pair_field").live("click",function() { $.ajax({ url: "ajax/add_del_periodtime/add_par_field.php", cache:false, success:function(html) { $(".add_par_field").html(html); } }); }); [/js] Во вставленном контенте есть содержимое и вторая кнопка (close_add_pair_field) при нажатии на которую данный контент скрывается таким образом: [js] $(".close_add_pair_field").live("click",function() { alert("Закрываю поле"); $(".add_par_field").hide(); }); [/js] Суть проблемы (распишу подробно) Вызываю диалог впервый раз. Нажимаю кнопку open_add_pair_field (то есть загрузить контент) - контент загружается. Выполняю нужные мне действия и жму в контенте кнопку close_add_pair_field - контент закрывается и в это время alert("Закрываю поле") выпадает как и положено один раз. Если я затем еще (не закрывая диалоговго окна) буду грузить в него контент и затем закрывать то все работает как нужно и alert("Закрываю поле") валиться при закрытии только единожды. Но если я ЗАКРЫВАЮ ДИАЛОГОВОЕ ОКНО, затем открываю его, снова гружу в него контент (жму кнопку open_add_pair_field) и пытаюсь закрыть контент то есть жму кнопку close_add_pair_field то alert("Закрываю поле") валиться два раза. Если закрою диалог и открою еще раз затем повторю действия с загрузкой и закрытием контента то alert("Закрываю поле") валиться три раза. И т.д. Пока полностью не перегружу страницу в браузере alert продолжает наращиваться и функционал контента тоже работает неправильно все время используются значения полученные в результате загрузки контента при первом открытии диалога, Диалог при закрытии дестроится таким образом [js]close: function(event, ui) { $("#dialog").dialog('destroy'); }[/js]То есть весь функционал диалога согласно мануалу уничтожается, Подозреваю что проблема может быть в том что я скрываю поле то есть делаю так $(".add_par_field").hide(); Но я пытался его и заменять и удалять при закрытии но все равно alert продолжает наращиваться? Где может происходить кэширование?
Это не кеширование. После обновления контента по аякс запросу, где у тебя вызывается этот код? [js] $(".close_add_pair_field").live("click",function() { alert("Закрываю поле"); $(".add_par_field").hide(); });[/js] Он лежит в самом контенте что ты обновляешь? Или как?
Тут точнее так будет (я просто сразу не все написал) 1.Есть диалог и в него аяксом возвращатся контент (таблица) . 2.Это просходит в момент открытия диалога (свойство open). 3.В этом контенте (таблице) НАХОДИТСЯ ТА КНОПКА (class="open_add_pair_field") КОТОРАЯ В ЧАСТЬ КОНТЕНТА (ОДНУ БОЛЬШУЮ ЯЧЕЙКУ ВОЗВРАЩЕННОЙ ТАБЛИЦЫ СОДЕРЖАЩУЮ div class="add_par_field" ) аяском вставляет еще одну малеьнкую табличку. И вот в этой маленькой табличке есть кнопка (class="close_add_pair_field") То есть другими словами при открытии диалога в него грузиться большая таблица содержацая две ячейки- слева кнопка (class="open_add_pair_field") и справа пустая большая ячейка содержащая div class="add_par_field" Жму на кнопку и справа в ячейку подгружаестя малеьнькая табличка с данными и кнопка (class="close_add_pair_field")) при нажатии на которую эта маленькая табличка скрывается. Если диалог открыть в первый раз то как и нужно таблица: слева кнопка - справа пустая ячейка. Жму кнопку аяксом грузиться в правую ячейку маленькая табличка и кнопка закрытия. Жму кнопку закрытия и alert висящий на этом событии срабатывает один раз. Потом если ЗАКРЫВАЮ CАМ ДИАЛОГ то есть все дестроиться. Открываю его снова опять таблица большая,где слева- кнопка, справа- пустая большая ячейка. Жму кнопку -в ячейку справа добавляется табличка и кнопка закрытия. Жму кнопку закрытия и alert срабатывает два раза . И тд если закрывать диалог и открывать и затем добавлять в ячейку и закрывать контент то alert наращивается.
Simpliest Ну да получается так. Этот код для кнопки что вернулась в аякс-ответе. Я чувствую что $(".add_par_field").hide() мало. То есть это просто скрывает маленькую таблицу а функционал получается висит То есть в следущий раз при открытии диалога и заполнении котнента-маленкая таблица, я как бы буду закрывать скрытую табличку и текущую. Или это не так? Такое чувство что не просто скрыть а удалить полностью маленкую таблицу нужно? Или не так? Помогите понять пожалуйста.
Вынеси его из аякс ответа. Или перед $(".add_par_field").hide(); удаляй обработчик. Что-то вроде такого $(".close_add_pair_field").removeHandler("click") конкретный метод поищи в мануале.
Вот весь код. Не скажешь может здесь что не так. Я как ты и посоветовал вынес все из success и попробовал удалить обработчик. В первом случае ничего не поменялось а во-втором после закрытия диалога и открытия и попытке добавить маленькую таблицу уже не работае добавление. Тут вроде кода раз два и все а где оно косячит. Здесь при открытии диалога грузиться большая таблица [js]$("#dialog").dialog( { position: ["left","top"], title:"Запись новой пары", hide: "slide",show:"slide",height:400,width:700, zIndex:999, $.ajax({ url:"ajax/stationary/insert_pair.php", data:stqstring, cache: false, success: function(html) { $("#insert_pair").html(html); /*Здесь возвращается большая таблица*/ $(".open_add_pair_field").live("click",ADD_PAIRS_FIELD);/*здесь подисана кнопка на вставку маленькой таблицы*/ $(".close_add_pair_field").live("click",function() { alert("Закрываю поле"); $(".add_par_field").hide(); }); } }); }, close: function(event, ui) { $("#dialog").dialog('destroy'); } }).dialog("open");[/js] функция возвращающая маленкую таблицу [js]function ADD_PAIRS_FIELD() { $.ajax({ url: "ajax/add_del_periodtime/add_par_field.php", cache:false, success:function(html) { $(".add_par_field").html(html); $(".add_par_field").show(); }}); } [/js]
Я тебе уже сказал. Или в перед 17й строкой делай проверку на наличие обработчика $(.close_add_pair_field").live("click") или перед 20й строкой удаляй этот обработчик. Как это сделать смотри в документации.
Кажись заработало я все таки вынес это как ты и говорил из successa success: function(html) { $("#insert_pair").html(html); /*Здесь возвращается большая таблица*/ $(".open_add_pair_field").live("click",ADD_PAIRS_FIELD);/*здесь подисана кнопка на вставку маленькой таблицы*/ $(".close_add_pair_field").live("click",function() { alert("Закрываю поле"); $(".add_par_field").hide(); }); } Вроде зафурычило. Спасибо большое. Выручил. Хотя если честно понял, но не знаю правильно ли. То есть висит кнопка подписанная на клик в ответе succes Я вышел продестроил диалог. Захожу создается абсолютно новый диалог Снова возвращается таблица и кнопка и получается опять вешается событие клик на кнопку да? То есть вот здесь вот оно накладывается да? То есть live тулить в сиксес нельзя, то есть получается я должен подписаться один раз но ни в коем случае ни в success?
не событие, а обработчик события. Я не смотрел как работает live. Суть я объяснил. Или присваивать обработчик только 1 раз. Или чистить его перед установкой нового