За последние 24 часа нас посетили 23211 программистов и 1705 роботов. Сейчас ищут 1106 программистов ...

Как победить кэширование в диалоге?

Тема в разделе "JavaScript и AJAX", создана пользователем xela1980, 3 янв 2010.

  1. xela1980

    xela1980 Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    40
    Симпатии:
    0
    Подскажите пожалуйста, может кто сталкивался с такой проблемой. (Я точно не знаю кэширование это или что другое но...)
    Есть диалоговое окно (виджет 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 продолжает наращиваться? Где может происходить кэширование?
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Это не кеширование.
    После обновления контента по аякс запросу, где у тебя вызывается этот код?
    [js] $(".close_add_pair_field").live("click",function() {
    alert("Закрываю поле");
    $(".add_par_field").hide(); });[/js]
    Он лежит в самом контенте что ты обновляешь? Или как?
     
  3. xela1980

    xela1980 Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    40
    Симпатии:
    0
    Тут точнее так будет (я просто сразу не все написал)
    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 наращивается.
     
  4. xela1980

    xela1980 Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    40
    Симпатии:
    0
    Simpliest
    Ну да получается так. Этот код для кнопки что вернулась в аякс-ответе. Я чувствую что $(".add_par_field").hide() мало. То есть это просто скрывает маленькую таблицу а функционал получается висит То есть в следущий раз при открытии диалога и заполнении котнента-маленкая таблица, я как бы буду закрывать скрытую табличку и текущую. Или это не так? Такое чувство что не просто скрыть а удалить полностью маленкую таблицу нужно? Или не так? Помогите понять пожалуйста.
     
  5. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Повторю вопрос.
    Где и в какой момент у тебя выполняется этот код.
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Вынеси его из аякс ответа.
    Или перед $(".add_par_field").hide();
    удаляй обработчик.
    Что-то вроде такого $(".close_add_pair_field").removeHandler("click")
    конкретный метод поищи в мануале.
     
  7. xela1980

    xela1980 Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    40
    Симпатии:
    0
    Вот весь код. Не скажешь может здесь что не так. Я как ты и посоветовал вынес все из 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]
     
  8. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Я тебе уже сказал.
    Или в перед 17й строкой делай проверку на наличие обработчика $(.close_add_pair_field").live("click")
    или перед 20й строкой удаляй этот обработчик.

    Как это сделать смотри в документации.
     
  9. xela1980

    xela1980 Активный пользователь

    С нами с:
    30 июл 2009
    Сообщения:
    40
    Симпатии:
    0
    Кажись заработало я все таки вынес это как ты и говорил из 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?
     
  10. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    не событие, а обработчик события.

    Я не смотрел как работает live.
    Суть я объяснил. Или присваивать обработчик только 1 раз. Или чистить его перед установкой нового