2010-05-10 1 views
4

Так что я использую jQuery date picker, и он работает хорошо. Я использую AJAX, чтобы пойти и получить некоторый контент, очевидно, когда это новое содержимое применяется, связь теряется, I learnt about this last week и обнаруживается о методе .live().jQuery выбор даты не постоянный после AJAX

Но как я могу применить это к моему сборщику даты? Потому что это не событие, поэтому .live() не сможет помочь ... правильно?

Это код, я использую для привязки выбора даты на мой вход:

$(".datefield").datepicker({showAnim:'fadeIn',dateFormat:'dd/mm/yy',changeMonth:true,changeYear:true}); 

Я не хочу называть это мето каждый раз мои пожары AJAX, как я хочу, чтобы сохранить, что в качестве общего, как возможное.

Приветствия :-)

EDIT

Как @nick запрошенной, ниже моя функция упаковщик получил ajax() метод:

var ajax_count = 0; 
function getElementContents(options) { 
    if(options.type===null) { 
     options.type="GET"; 
    } 

    if(options.data===null) { 
     options.data={}; 
    } 

    if(options.url===null) { 
     options.url='/'; 
    } 

    if(options.cache===null) { 
     options.cace=false; 
    } 

    if(options.highlight===null || options.highlight===true) { 
     options.highlight=true; 
    } else { 
     options.highlight=false; 
    } 

    $.ajax({ 
     type: options.type, 
     url: options.url, 
     data: options.data, 
     beforeSend: function() { 
      /* if this is the first ajax call, block the screen */ 
      if(++ajax_count==1) { 
       $.blockUI({message:'Loading data, please wait'}); 
      } 
     }, 
     success: function(responseText) { 
      /* we want to perform different methods of assignment depending on the element type */ 

      if($(options.target).is("input")) { 
       $(options.target).val(responseText); 
      } else { 
       $(options.target).html(responseText); 
      } 
      /* fire change, fire highlight effect... only id highlight==true */ 
      if(options.highlight===true) { 
       $(options.target).trigger("change").effect("highlight",{},2000); 
      } 
     }, 
     complete: function() { 
      /* if all ajax requests have completed, unblock screen */ 
      if(--ajax_count===0) { 
       $.unblockUI(); 
      } 
     }, 
     cache: options.cache, 
     dataType: "html" 
    }); 
} 

насчет этого решения, у меня есть правила .js, которые включают в себя все мои первоначальные привязки с элементами, если я должен поместить их в функцию, а затем вызывать эту функцию при обратном вызове метода ajax, таким образом я бы не повторял код ...

Хммм, мысли, пожалуйста: D

+1

Как вы делаете ajax, '$ .ajax'? Ваши варианты не повторяющегося кода - это либо функция для вызова с контекстом, либо '.liveQuery()', если вас интересует либо я могу показать вам, как это сделать, просто комментарий @nick и дайте мне знать , –

+0

Эй, @nick, я отредактировал свое оригинальное сообщение, см. Также возможное решение ниже ... :-) спасибо –

+1

Спасибо :) отправил ответ ниже о том, как это сделать –

ответ

8

Вы можете сделать это следующим образом:

function createPickers(context) { 
    $(".datefield", context || document).datepicker({ 
    showAnim:'fadeIn', 
    dateFormat:'dd/mm/yy', 
    changeMonth:true, 
    changeYear:true 
    }); 
} 

Для запуска на document.ready, если у вас уже есть document.ready функцию можно назвать:

createPickers(); 

Или вы можете запустить его в it's own document.ready handle, например:

$(createPickers); 

В вашем success обратного вызова вы называете это так:

createPickers(responseText); 

Что это делает только выбрать .datefieldв предоставленном контексте (внутренне это использует .find()), так что на document.ready вы выбираете все совпадения элементы для создания сборщиков дат, но в вашем запросе ajax вы выбираете только подходящие элементы, которые только что пришли в ответ, а не создавайте дубликаты выбора даты в любом месте.

+1

Хорошо, это похоже на лучшее решение. Ник, вы бы предположили, что все мои правила привязки (такие как щелчок, изменение и т. Д.) Содержатся в одной функции, после чего я могу вызвать обратный вызов успеха? Будет ли спасти меня при использовании '.live()' then? Просто интересно об ограничениях '.live()'. Спасибо :-) –

+1

@ILMV - Если вы не создаете виджеты с этими другими событиями, я бы использовал '.live()', более простые, простые и менее обработчики событий. Для вещей, которые создают виджеты, такие как «datepicker», да, я бы добавил их в одну функцию, которая принимает такой контекст. –

+0

Большое вам спасибо за помощь Ник! –

0

Первый порт захода будет читать на этот вопрос, если вы еще не:
jQuery live() failing with jQuery UI datepicker

«Я получил его привяжите к вкладкам lightbox'd при первом появлении лайтбокса, но потом он не работает ».

«Когда лайтбокс закрывается, я повторно добавляю его содержимое на страницу (чтобы не потерять содержимое div), и это, кажется, убивает вызов live()».

+0

Я не понимаю, как это относится к меня, поскольку он не дает подсказок или ответа? –

0

выбор даты - функция щелчка на вводе текста ввода.так что вы можете легко пойти:

$('#datepicker').live('click', function(){$(this).datepicker($.datepicker.regional['en']);}) 
+3

Это создаст виджет выбора даты, каждый щелчок по элементу, это будет очень расточительно. –

+1

+1 Ник, я хотел избежать этого метода. Спасибо в любом случае XGreen. –

+1

Не знал этого. Спасибо за исправление ник – XGreen