2017-02-14 6 views
1

У меня есть таблица html, которую я заполняю через AJAX, используя jQuery dataTables. У меня две формы на странице, первая форма проверяет параметры таблицы, которые работают нормально.Проверять динамические строки таблицы на прослушивателях событий

Вторая проверка охватывает всю таблицу, и моя цель заключается в создании пользовательской проверки с помощью всплывающих подсказок, если нет другого способа, которым я могу использовать метод проверки формы отправки для проверки нескольких входных данных [type = 'number'] и datepicker в каждой строке:

input[type=number] события - нажмите, KeyUp тип поля ввода = номер

input[NAME=BUYDATE] (.hasDatePicker) событие - onfocusout

Как я должен вызвать представление строк в форме?

А: Подтвердить одна строка за один раз, где одинаковые элементы используют имя = ЭЛЕМЕНТ

или

Б: Validate вся форма с использованием способа проверки представить форму?

Эта таблица представляет собой динамические элементы порядка утилит

Вот моя DataTable с рядом образцов:

<form id="ITEMS"> 
    <table id="table_001" class="xs-small table table-condensed" > 
    <thead> 
    <H5>Program: FRESH INCENTIVE</H5> 
    <H5>Customer: 330-990076-033 (B/C MANISTEE CLARK)</H5> 
    <p><font color="red">Delivery Days: Mon,Thu</font></p> 
    <tr> 
    <th></th> 
    <th class="hidden"> 
    [ 
{ "size" : "lg", 
    "upper_hidden" : [], 
    "lower_hidden" : [1,2,3,4,5,6,7,8,9,10,11,12] 
    }, 
    { "size" : "md", 
    "upper_hidden" : [], 
    "lower_hidden" : [1,2,3,4,5,6,7,8,9,10,11,12] 
    }, 
    { "size" : "sm", 
    "upper_hidden" : [3,4], 
    "lower_hidden" : [1,2,5,6,7,8,9,10,11,12] 
    }, 
    { "size" : "xs", 
    "upper_hidden" : [3,4,5], 
    "lower_hidden" : [1,2,6,7,8,9,10,11,12] 
    } 
    ] 
    </th> 
    <th>Item</th> 
    <th class='cupc'>UPC</th> 
    <th>Pack</th> 
    <th>Size</th> 
    <th>Description</th 
    <th>Mon<br>Qty</th> 
    <th>Tue<br>Qty</th> 
    <th>Wed<br>Qty</th> 
    <th>Thu<br>Qty</th> 
    <th>Fri<br>Qty</th> 
     <th>Sat<br>Qty</th> 
    <th>Start Date</th> 
    </tr> 
    </thead> 
    <tbody> 
    <tr role="row" class="odd"><td class="hidden-lg hidden-md"><span class="row-details row-details-close"><i class="fa fa-plus-square icon-large"></i></span></td><td class=" hidden">place holder</td><td><span class="EmptyRow itno live" title="ITEMNO:1525252" style="padding: 3px;">1525252</span></td><td><span class="UPC" title="UPC:010700807229">010700807229</span></td><td class="hidden-sm hidden-xs"><span class="pack" title="package qty:24">24</span></td><td class="hidden-sm hidden-xs"><span class="size" title="size:CT">CT</span></td><td class="hidden-xs"><span class="descrpt" title="desc:PAYDAY">PAYDAY</span></td><td><span title="Monday:"><input type="number" min="1" max="99" name="QTY" title="Qty must be between 1-99" value="" data-delday="1" data-dow="" class="qty non-day" maxlength="2"></span></td><td><span title="Tuesday:"><input type="number" min="1" max="99" name="QTY" title="Qty must be between 1-99" value="" maxlength="2" class="qty non-day" data-delday="2" data-dow=""></span></td><td><span title="Wednesday:"><input type="number" min="1" max="99" name="QTY" title="Qty must be between 1-99" value="" maxlength="2" class="qty non-day" data-delday="3" data-dow=""></span></td><td><span title="Thursday:"><input type="number" min="1" max="99" name="QTY" title="Qty must be between1-99" value="" maxlength="2" class="qty non-day" data-delday="4" data-dow=""></span></td><td><span title="Friday:"><input type="number" min="1" max="99" name="QTY" title="Qty must be between 1-99" value="" maxlength="2" class="qty delivery-day" data-delday="5" data-dow="5"></span></td><td><span title="Saturday:"><input type="number" min="1" max="99" name="QTY" title="Qty must be between1-99" value="" maxlength="2" class="qty non-day" data-delday="6" data-dow=""></span></td><td><span title="Start date for buying item"><input type="text" size="10" class="dp form-control-inline xs-small hasDatepicker" id="1" value="" name="BUYDATE" data-buydate=""><img class="ui-datepicker-trigger" src="/images/calendar.png" alt="Select a start buying date" title="Select a start buying date"></span></td></tr> 
    </tbody> 
    </table> 
    </form> 

Можно ли использовать имя = подход значения, даже если это идет вразрез с типичные рекомендации DOM, где у вас есть дубликаты идентичных идентификаторов/имен?

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

ПРИМЕЧАНИЕ.

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

Впоследствии, если дата предоставлена, и ни одно из других полей ввода строки aka [name='QTY'] в этой строке не имеет заданного значения, тогда мне нужна ошибка для запуска.

В основном,

У меня есть два типа строк, определенных классов .RecordRow и .EmptyRow.

По крайней мере один input[name='QTY'] должен иметь значение, если строка .EmptyRow, а если RecorRow, вы можете удалить все Qtys.

Каждая строка input[name='BUYDATE'] должна иметь действительную дату, введенную только в том случае, если пользователь запускает один из двух прослушивателей событий.

Действительно:

enter image description here

И

enter image description here

Недопустимый: enter image description here

И

enter image description here

Это то, что я до сих пор

JQuery Validate:

$("input").on("blur keyup", function(){ 
     row.children("td").each(function(){ 
      $(this).children('input').each(function() { 
      if($(this).attr("name") === 'BUYDATE') && $(this).valid()){ 
       //validate tds 
      } 
      }); 
     }); 
    }); 

form.validate({ 
     focusInvalid: false, 
     onkeyup: function(element) { rule!! 
      var element_id = $(element).attr('name'); 
      if (this.settings.rules[element_id]) { 
       if (this.settings.rules[element_id].onkeyup !== false) { 
        $.validator.defaults.onkeyup.apply(this, arguments); 
       } 
      } 
     }, 
     rules: { 
      "BUYDATE": { 
       required: { depends:function(){ 
          //iterate through rows here? 
          //this only validate onn submit 
          //I guess maybe on could trigger submit onkeyup 
          //or blur? 
         } 
       } 
      }, 
      "DLOCN": { 
       required:{ 
       depends: function(){ 
          //iterate through rows here? 
          //this only validate onn submit 
          //I guess maybe on could trigger submit onkeyup 
          //or blur? 
       } 
       } 
      } 
     }, 
     messages: { // custom messages 
      "EVENT": { 
       required: "Select a Program.", 
       HTH_SelectValue: "Select a Program."    
      }, 
      "LOCN": { 
       HTH_SingleLOCN: "A single location must be selected when using this option to load items." 
      }, 
      "DLOCN": { 
       required: "A customer location must be supplied when using this option to load items." 
      } 
     },   
     showErrors: function(errorMap, errorList) { 
      FormError.hide(); 
      // Clean up any tooltips for valid elements 
      $.each(this.validElements(), function (index, element) { 
       element = $(element); 
       NoError_ToolTip(element); 
      }); 
      // Create new tooltips for invalid elements 
      $.each(errorList, function (index, error) { 
       element = $(error.element); 
       message = error.message; 
       Error_ToolTip(element,message); 
       FormError.show(); 
      }); 
     },     
     invalidHandler: function (event, validator) { //display error alert on form submit  
      success.hide(); 
      FormError.show(); 
      $(document).scrollTop($(".form-body:first-of-type").offset().top); 
     }, 
     submitHandler: function (form) { 
      success.show(); 
      FormError.hide(); 
      // Submit1(form,FormError,success); 
     } 

    }); 
} 

Наконец,

Кто-нибудь предложит обернуть каждую строку формой и проверить ее? Похоже, если бы я сделал это, это противоречило бы рекомендациям DOM, поскольку мне нужно использовать Id для использования jQuery Validate. Я видел использование нескольких уникальных идентификаторов на одной странице и может работать при определенных обстоятельствах.

ответ

1

Я решил проверить динамические строки строк по одному, используя два прослушивателя событий, где я перезапускаю проверку на двух прослушивателях событий;

А) на входе [тип = номер] нажмите, KeyUp

&

B) на входном DatePicker focusout и KeyUp

сбросить валидаторы, используя встроенный правил, то есть:

$(".element").rules('add',{required: true});

$(".element").rules('remove',"required"); на лету.

Я также создаю новые объекты $("#id").datepicker() динамически после создания новых строк.

Я также использовал $(this).clone() для создания динамических строк при обработке исходной строки. Я никогда не думал, что $.clone() API будет полезен, но я, наконец, нашел экземпляр, где он станет полезным.

Из того, что я понимаю, клонированные объекты не привязаны к прослушивателям событий исходной строки, которые, я думаю, зависят от API. На самом деле у меня есть доказательства, когда я клонирую строку с вложенным текстом ввода datepicker.

В конечном итоге я решил удалить текстовое поле ввода с помощью функции jQuery.remove(), а затем заново создать его и связать с API datepicker, а затем дать ему новый идентификатор, чтобы он работал правильно.

Проблема теперь в событии changeDate не является обязательным для нового объекта datepicker, и я помню, что я попытался удалить идентификатор и добавить новый идентификатор, но этот элемент все еще привязан к событиям исходного элемента, которые были клонированы из ,

Например, календарь появляется на исходном элементе или сам календарь не отображается в зависимости от того, как вы решили повторно инициализировать вложенную датупиксера из клонированной строки. (См. follow-up question I posted regarding the onchangeDate issue).

Также обратите внимание, для которых DatePicker API вы ссылаетесь, потому что есть много API-интерфейсов для этой функции, такой как Bootstrap-datepicker и jQuery-datepicker, которые шахта была из Metronic и является из JQuery-Datepicker API

Я покажу образец коды этого тоже в случае, если кто-то сталкивается с той же проблемой, что и я.

ПРИМЕЧАНИЕ: Я не тестировал во всех браузерах a 2/23/2017, поэтому я буду обновлять его при тестировании.

Вот некоторые фрагменты кода выборки для $.rules(), $.datepicker(), and $.clone() API:

Вот как я проверить и таблицы процессов строки без использования $("form").submit() техники.

ПРИМЕЧАНИЯ: Моя форма обернуто вокруг моего стола так, у меня есть заявление Validate, но я НЕ использовать form.submit() техники, а я перерабатываю на основе динамических правил проверки я сбросить и установить на каждый триггере событий.

function TableEventHandlers(){ 
    var form = $("#ITEMS"); 
    var FormError = $('.item-failure',form); 
    var FormSuccess = $('.item-success',form); 
    //used to trigger datepicker on calendar selection 
    $(".hasDatepicker").on("changeDate",function(e){ 
     e.stopImmediatePropagation(); 
     $(this).trigger("focusout"); 
     //alert("onchange date" + $(this).val() + e.type); 
    }); 

    //Processes a single qty at a time w/o popout 
    $("#table_001").on("click keyup",".qty",function (e) { 
     e.stopImmediatePropagation(); 
     //reset validators 
     $(".qty").rules('remove','min'); 
     $(".qty").rules('remove','max');  
     $(".qty").rules('remove','required'); 
     $(".dp").rules('remove','required'); 
     $(".dp").rules('remove','UsaDate'); 
     $(".dp").removeClass("error").tooltip("disable").tooltip("hide"); 
     $(".qty").removeClass("error").tooltip("disable").tooltip("hide"); 
     var row = $(this).closest('tr'); 
     flag = true; 
     row.find('.dp').rules('add',{required:true,messages:{required:"Must supply a start buy date."}}); 
     row.find('.dp').rules('add',{UsaDate:true,messages:{UsaDate:"Enter date in mm/dd/yyyy format"}}); 
     hasQtys = false; 
     hadOtherQtys = false; 
     var actualQty = parseInt($(this).val(), 10); 
     var dow = $(this).data("dow"); 
     var qty = $(); 
     var num = 0;    
     var buydate = row.find(".dp"); 
     var delday = ""; 
     var quans = 0; 
     var Error = false;  
     //iterate thru tr check if multiple records 
     row.children("td").each(function(index){ 
      qty = $(this).find(".qty"); 
      if(qty.val() !== undefined){ 
       num = parseInt(qty.val(), 10); 
       //console.log(isNaN(num)+ "index=" + index); 
       if(isNaN(num)) 
        num = 0; 
       if(num > 0){ 
        hasQtys = true; 
        if(quans > 1) 
         hadOtherQtys = true; 
        quans++; 
       } 
       //Min max validation process 
       console.log(num + ">"+ +parseInt(qty.attr("max"),10) + "<"+ parseInt(qty.attr("min"),10) + "not 0 = "+ num); 
       //qty out of range: min or Max attr or != 0? 
       if(num != 0 && (num > parseInt(qty.attr("max"),10) || num < parseInt(qty.attr("min"),10))) 
       { 
        if(num > parseInt(qty.attr("max"),10)){   
         qty.rules('add',{max: parseInt(qty.attr('max')), messages: {max: "Quantity must not be greater than " + qty.attr("max")}}); 
        } 
        else{ 
         qty.rules('add',{min: parseInt(qty.attr('min')), messages: {max: "Quantity must be greater than " + qty.attr("min")}}); 
        } 
         qty.addClass("error").tooltip("enable").tooltip('show'); 
         $('.item-failure').removeClass("hidden").show().html(qty.data("originalTitle")); 
         Error = true; 
       } 
       else 
        qty.removeClass("error").tooltip("disable").tooltip("hide"); 
      }//eof undefined qty 
     }); 
     console.log("has qtys= " + hasQtys + "has hadotherQtys = " + hadOtherQtys); 
     //.EmptyRow all require qtys when empty row 
     if(row.find(".itno").hasClass("EmptyRow") && hasQtys === false) 
     { 
      row.find(".qty").rules('add',{required: true, messages: {required: "Quantity must be entered when the item request date is new"}}); 
      row.find(".qty").addClass("error").tooltip("enable"); 
      Error = true; 
     } 
     else 
     { //.EmptyRow has Qtys or .RecordRow 
      row.find(".qty").rules('remove','required'); 
      //row.find(".qty").removeClass("error").tooltip("disable"); 
     } 
     console.log("buydate valid = " + buydate.valid() + "buydate.val = " + buydate.val()); 
     //new date is valid 
     if(buydate.valid() == false || buydate.val() == ""){ 
      $('.item-failure').removeClass("hidden").show().html("You have some errors. See below."); 
      row.find(".dp").addClass("error").tooltip("enable");  
      Error = true; 
     } 
     if(Error === true) 
      return true; 
     else{ 
      //Qtys met requirements of >= max && <= min or 0  
      buydate.removeClass("error").tooltip("disable"); 
      delday = qty.data("delday"); 
      $('.item-failure').addClass("hidden").hide(); 
      $('.item-success').removeClass("hidden").html("Processing future order request...").show(); 
      ProcessRequest(row,actualQty,delday, buydate.val()); 
     }//eof valid date 
    });//eof qty event listener 

    //Iterates thru the entire row when date changed 
    //NOTE: no popout atm causes erroneous results 
    $(".dp").on("keyup focusout",function (e) { 
     e.stopImmediatePropagation(); 
     //reset validators 
     $(".qty").rules('remove','min'); 
     $(".qty").rules('remove','max');  
     $(".qty").rules('remove','required'); 
     hasQtys = false; 
     hadOtherQtys = false; 
     var row = $(this).closest('tr'); 
     $(this).rules('add',{required:true,messages:{required:"Must supply a start buy date."}}); 
     $(this).rules('add',{UsaDate:true,messages:{UsaDate:"Enter date in mm/dd/yyyy format"}}); 
     var buydate = $(this); 
     var num = 0; 
     var dow = ''; 
     var delday = ''; 
     var quans = 0; 
      flag = true; 
     var qty = $(); 
     var Error = false; 
     //console.log("dp triggered" + e.type); 
     //only check date when manually entered. 
     if(e.type === "keyup" && ($(this).valid() === false || $(this).val() ==="")) 
     { console.log(e.type + $(this).valid()); 
      $(this).addClass("error").tooltip("enable").show(); 
      $('item-failure').removeClass("hidden").html("You have some errors. See below.").show(); 
      Error = true; 
     } 
     //check for qtys in row before processing  
     row.children("td").each(function(index){ 
      qty = $(this).find(".qty"); 
      if(qty.val() !== undefined){ 
       num = parseInt(qty.val(), 10); 
       if(isNaN(num)) 
        num = 0; 
       if(num > 0){ 
        hasQtys = true; 
        if(quans > 1) 
         hadOtherQtys = true; 
        quans++; 
       } 
       //Min max or 0 validation process 
       console.log(num + ">"+ +parseInt(qty.attr("max"),10) + "<"+ parseInt(qty.attr("min"),10) + "not 0 = "+ num); 
       console.log(num > parseInt(qty.attr('max'),10));; 
       //qty out of range: min or Max attr or != 0? 
       if(num != 0 && (num > parseInt(qty.attr("max"),10) || num < parseInt(qty.attr("min"),10))) 
       { 
        if(num > parseInt(qty.attr("max"),10)){   
         qty.rules('add',{max: parseInt(qty.attr('max')), messages: {max: "Quantity must not be greater than " + qty.attr("max")}}); 
        } 
        else{ 
         qty.rules('add',{min: parseInt(qty.attr('min')), messages: {max: "Quantity must be greater than " + qty.attr("min")}}); 
        } 
         qty.addClass("error").tooltip("enable").tooltip('show'); 
         $('.item-failure').removeClass("hidden").show().html(qty.data("originalTitle")); 
        Error = true; 
       } 
      }//eof undefined qty 
     }); 
      //Empty rows require atleast one qty 
      if(row.find(".itno").hasClass("EmptyRow") && hasQtys === false){ 
       row.find(".qty").rules('add',{required: true, messages: {required: "Quantity must be entered when the item request date is new"}}); 
       row.find(".qty").addClass("error").tooltip("enable"); 
       Error = true; 
      } 
      if(Error === true) 
       return true; 
      else{ 
      //Final stage of processing multiple records 
      row.children("td").each(function(){ 
      qty = $(this).find(".qty");  
      if(qty.val() !== undefined){ 
       num = parseInt(qty.val(), 10); 
       if(isNaN(num)) 
        num = 0; 
       //console.log("buydate.valid() = " +buydate.valid()); 
       //console.log(qty.val() + "<="+ qty.attr("max") +qty.val() + ">="+ qty.attr("min")); 
       if(buydate.valid() == "1" && buydate.val() !== "" && ((row.find(".itno").hasClass("EmptyRow") && hasQtys === true) || row.find(".itno").hasClass("RecordRow"))){ 
        $('.item-failure').addClass("hidden").hide(); 
        $('.item-success').removeClass("hidden").html("Processing future order requests...").show(); 
        console.log("processing.."); 
        ProcessRequest(row,num,delday); 
       } 

      }//eof qty.val undefined 
      });//eof td children 
     }//eof error 
    });//eof event datepicker listener 

    form.validate({ 
     focusInvalid: false, // do not focus the last invalid input 
     onkeyup: function(element) { //only allow if 'onkeyup:false' is rule!! 
      var element_id = $(element).attr('NAME'); 
      if (this.settings.rules[element_id]) { 
       if (this.settings.rules[element_id].onkeyup !== false) { 
        $.validator.defaults.onkeyup.apply(this, arguments); 
       } 
      } 
     }, 
     rules: { 
      //dynamic rules worked better in this instance 
     }, 
     messages: { 
      // same with custom messages 
     },   
     showErrors: function(errorMap, errorList) { 
      // Clean up any tooltips for valid elements 
      $.each(this.validElements(), function (index, element) { 
       element = $(element); 
       NoError_ToolTip(element); 
      }); 
      // Create new tooltips for invalid elements 
      $.each(errorList, function (index, error) { 
       element = $(error.element); 
       message = error.message; 
       Error_ToolTip(element,message); 
       FormError.html("You have some errors. Please check below.").show(); 
      }); 
     },     
     invalidHandler: function (event, validator) { //display error alert on form submit  
      FormError.html("You have some errors. Please check below.").show(); 
     }, 
     submitHandler: function (form) { 
      FormSuccess.html("Processing request...").show(); 
     } 

    }); 
    $.validator.addMethod("UsaDate", function(value, element) { 
      return this.optional(element) || /^\b\d{1,2}[\/]\d{1,2}[\/]\d{4}\b/.test(value); 
    }, "Please enter mm/dd/yyyy date format"); 
    } 

Вот как я создал новую пустую строку, используя $ .clone() API из строки, который был только переработанной:

var ProcessRequest = function(tr, count, dow){ 
     var success = $('#table_001_processing').css("color", "green").removeClass("hidden").show().html("Processing request..."); 
     //post vars 
     var recureItemNo = tr.find(".itno").html(); 
     var itemCount = count; 
     var dp = tr.find("[name='BUYDATE']"); 
     var newDate = dp.val(); 
     tempDate = dp.data("date"); 
     //clear all errors 
     tr.children("td").each(function(){ 
      $(".qty").each(function(){ 
       $(this).removeClass("error").tooltip("disable").tooltip("hide"); 
      }); 
     }); 
     //insert new row because we create new row off emptyRow 
     if(tr.find(".itno").hasClass("EmptyRow") && flag == true){ 
      console.log("this was an .EmptyRow"); 
      var randId = (Math.floor(Math.random() * 100 * 100)+1); 
      var $clone = tr.clone(); 
      $clone.insertBefore(tr); 
      //clear inputs 
      $clone.children("td").each(function(){ 
       var $input = $(this).find("input"); 
       $input.val(""); 
      }); 
      //destroy datepicker  
      var dp = $clone.find(".dp"); 
       dp.remove(); 
      //create new DatePicker(dp); 
      var dpId = $('#table_001 tr').length + 1; 
      $clone.find("td:eq(13) span").html("<input name='BUYDATE' class='dp form-control-inline' style='width:95px'; />"); 
      var newDp = $clone.find(".dp").attr("id",dpId); 
      DatePicker(newDp); 

     }else{//update took place which means future distribution no matter what 

     } 
     //getJSON web0572 complete stuff 
     //add-ons become future distributions by defaults 
     if(tr.find(".itno").hasClass("EmptyRow")) 
      tr.find(".itno").removeClass("EmptyRow").addClass("RecordRow").removeClass("live").addClass("future"); 
     if(tempDate > newDate) 
      tr.find(".itno").removeClass("live").addClass("future"); 
     if(tr.find(".itno").hasClass("future")) 
      tr.addClass("pending"); 
     //Call web057s2 add all of this below: 
     console.log("hasqtys ="+hasQtys+"itemno"); 
      //Display successful processing   
      if(hasQtys == true){  
      console.log("processed request add or update"); 
      if(hadOtherQtys == true && tr.find(".itno").hasClass("RecordRow")) 
       success.html("Item #" + recureItemNo + " successfully updated!");   
      else 
       success.html("Item #" + recureItemNo + " successfully added!"); 
      }else{ 
      console.log("processed request deleted row"); 
      tr.remove(); 
      success.html("Item #" + recureItemNo + " for " + tempDate + " successfully removed!"); 
      } 

      setTimeout(function(){ 
      success.addClass("hidden").hide().css("color","green").html("Processing..."); 
      }, 7000); 
      flag = false; 
} 

Я обнаружил, что ключ к созданию динамического DatePicker когда вы клонируете объект, переопределите старый идентификатор или даже сам элемент клонированного объекта, который может быть просмотрен в рамках функции ProcessRequest:

ПРИМЕЧАНИЕ: I ha d, чтобы играть в некоторые игры с помощью прослушивателя событий onChangeDate, чтобы обрабатывать строки на закрытии datepicker. Единственная проблема в том, что прослушиватель событий onChangeDate не запускается на новом клонированном объекте. Я попытался отвязать событие и связать его, но не повезло.

var DatePicker = function(that){ 
    if (jQuery().datepicker) { 
    //destroy old datepicker from clone 
    if(that.hasClass('hasDatepicker')){ 
     that.datepicker('remove'); 
    } 
     that.datepicker({ 
     showOn: "button", 
     buttonImage: "/images/calendar.png", 
     buttonImageOnly: true, 
     buttonText: 'Select a start buying date', 
     changeMonth: true, 
     changeYear: true, 
     beforeShow: function() { 
      setTimeout(function(){ 
       $('.ui-datepicker').css('z-index', 100100); 
      }, 0); 
     }, 
     onSelect: function() { 
     $(this).removeClass("error").tooltip("disable").tooltip("hide"); 
     $('.ui-datepicker').css('z-index', -1); 
     setTimeout(function(){ 
      //allows date to catchup 
     },0); 
    }, 
    onClose: function(){ 
     $(this).trigger("changeDate"); 
    }, 
     minDate: '+1', // The min date that can be selected, i.e. 30 days from the 'now' 
     maxDate: '+1y' // The max date that can be selected, i.e. + 1 month, 1 week, and 1 days from 'now' 
     //      HR MIN SEC MILLI 
     //new Date().getTime() + 24 * 60 * 60 * 1000) 
    }).datepicker(); 

    } 
} 

Примечание: Я пытался создать dynamic bootstrap popout confirmation dialogs, используя аналогичную технику, которую я использовал с DatePicker использованием случайных Идентификаторы, но у меня возникли некоторые ошибки, где он принимает его дважды нажмите ввод. Если я исправлю, я опубликую результаты.

У меня была ошибка с datepicker, где первый выбор не регистрировался, вероятно, потому, что он был вложен внутри события? После некоторых исследований я обнаружил, что существует similar issue with angular where user had to select date twice. Я установил setTimeout внутри OnClose и, похоже, исправил проблему. Я собираюсь использовать тот же подход с popouts и посмотреть, как это происходит. Надеюсь, я помогу кому-нибудь!


UPDATE: Благодаря artemisian я был в состоянии решить проблему с динамическим datepickers! Пожалуйста, см. this сообщение в отношении Клонирование финалистов.

var DatePicker = function(that){ 
    if (jQuery().datepicker) { 
    //alert(that.attr('id')); 
     that.datepicker({ 
     showOn: "button", 
     buttonImage: "/images/calendar.png", 
     buttonImageOnly: true, 
     buttonText: 'Select a start buying date', 
     changeMonth: true, 
     changeYear: true, 
     beforeShow: function() { 
      setTimeout(function(){ 
       $('.ui-datepicker').css('z-index', 100100); 
      }, 0); 
     }, 
     onSelect: function() { 
     $('.item-failure').addClass("hidden").hide(); 
     $(this).removeClass("error").tooltip("disable").tooltip("hide"); 
     $('.ui-datepicker').css('z-index', -1); 
     setTimeout(function(){ 
      //allows date to catchup 
     },0); 
    }, 
    onClose: function(){ 
     $(this).trigger("changeDate"); 
    }, 
     minDate: '+1', // The min date that can be selected, i.e. 30 days from the 'now' 
     maxDate: '+1y' // The max date that can be selected, i.e. + 1 month, 1 week, and 1 days from 'now' 
     //      HR MIN SEC MILLI 
     //new Date().getTime() + 24 * 60 * 60 * 1000) 
    }).datepicker(); 

    if($(this).hasClass("newDp")){ 
     $(this).bind("changeDate", function(e) { // this is the missing part in my opinion 
      e.stopImmediatePropagation(); 
      $(this).trigger("focusout"); 
      alert("onchange date" + $(this).val()); 
     }); 
    //Dynamic binding on cloned datepickers only 
    $(this).on("focusout",function(){ 
    RowValidation($(this)); 
    }); 
    } 
    } 
} 

тогда я сделал это так, я должен был повторно используемый код:

/**************************** ************************************************** * Обернутая функция для динамического связывания **************************************** ****************************************/

var RowValidation = function(that){ 
     //reset validators 
     $(".qty").rules('remove','min'); 
     $(".qty").rules('remove','max');  
     $(".qty").rules('remove','required'); 
     hasQtys = false; 
     hadOtherQtys = false; 
     var row = that.closest('tr'); 
     that.rules('add',{required:true,messages:{required:"Must supply a start buy date."}}); 
     that.rules('add',{UsaDate:true,messages:{UsaDate:"Enter date in mm/dd/yyyy format"}}); 
     var buydate = that; 
     var num = 0; 
     var dow = ''; 
     var delday = ''; 
     var quans = 0; 
      flag = true; 
     var qty = $(); 
     var Error = false; 
     //console.log("dp triggered" + e.type); 
     //only check date when manually entered. 
     if(e.type === "keyup" && (that.valid() === false || that.val() ==="")) 
     { console.log(e.type + $(that.valid()); 
      that.addClass("error").tooltip("enable").show();  
      $('item-failure').removeClass("hidden").html("You have some errors. See below.").show(); 
      Error = true; 
     } 
     //check for qtys in row before processing  
     row.children("td").each(function(index){ 
      qty = $(this).find(".qty"); 
      if(qty.val() !== undefined){ 
       num = parseInt(qty.val(), 10); 
       if(isNaN(num)) 
        num = 0; 
       if(num > 0){ 
        hasQtys = true; 
        if(quans > 1) 
         hadOtherQtys = true; 
        quans++; 
       } 
       //Min max or 0 validation process 
       console.log(num + ">"+ +parseInt(qty.attr("max"),10) + "<"+ parseInt(qty.attr("min"),10) + "not 0 = "+ num); 
       console.log(num > parseInt(qty.attr('max'),10));; 
       //qty out of range: min or Max attr or != 0? 
       if(num != 0 && (num > parseInt(qty.attr("max"),10) || num < parseInt(qty.attr("min"),10))) 
       { 
        if(num > parseInt(qty.attr("max"),10)){   
         qty.rules('add',{max: parseInt(qty.attr('max')), messages: {max: "Quantity must not be greater than " + qty.attr("max")}}); 
        } 
        else{ 
         qty.rules('add',{min: parseInt(qty.attr('min')), messages: {max: "Quantity must be greater than " + qty.attr("min")}}); 
        } 
         qty.addClass("error").tooltip("enable").tooltip('show'); 
         $('.item-failure').removeClass("hidden").show().html(qty.data("originalTitle")); 
        Error = true; 
       } 
      }//eof undefined qty 
     }); 
      //Empty rows require atleast one qty 
      if(row.find(".itno").hasClass("EmptyRow") && hasQtys === false){ 
       row.find(".qty").rules('add',{required: true, messages: {required: "Quantity must be entered when the item request date is new"}}); 
       row.find(".qty").addClass("error").tooltip("enable"); 
       Error = true; 
      } 
      if(Error === true) 
       return true; 
      else{ 
      //Final stage of processing multiple records 
      row.children("td").each(function(){ 
      qty = $(this).find(".qty");  
      if(qty.val() !== undefined){ 
       num = parseInt(qty.val(), 10); 
       if(isNaN(num)) 
        num = 0; 
       //console.log("buydate.valid() = " +buydate.valid()); 
       //console.log(qty.val() + "<="+ qty.attr("max") +qty.val() + ">="+ qty.attr("min")); 
       if(buydate.valid() == "1" && buydate.val() !== "" && ((row.find(".itno").hasClass("EmptyRow") && hasQtys === true) || row.find(".itno").hasClass("RecordRow"))){ 
        $('.item-failure').addClass("hidden").hide(); 
        $('.item-success').removeClass("hidden").html("Processing future order requests...").show(); 
        console.log("processing.."); 
        ProcessRequest(row,num,delday); 
       } 

      }//eof qty.val undefined 
      });//eof td children 
     }//eof error 

} 
Смежные вопросы