Еще раз, связанные с IE проблемы. Идея такова: в каждом td флажки имеют даты, назначенные им в атрибуте data-name. Когда форма отправлена, я пытаюсь проверить, соответствуют ли даты, которые они проверили, и если они последовательны, обновите скрытые поля с датой начала и окончания для дополнительных вычислений на следующей странице, например, цены, специальные предложения и т.д. Это отлично работает в реальных браузерах, таких как Chrome и Firefox. Но IE (и сафари, которые я подозреваю) имеют проблемы. Выполняя некоторые предупреждения, я вижу, что даты - NaN. Вот фрагмент:
HTML:
<td><input data-name="30/10/2013" type="checkbox"></td>
<td><input data-name="31/10/2013" type="checkbox"></td>
<td><input data-name="1/11/2013" type="checkbox"></td>
<form id="booking0" onsubmit="return bookingValidation(0)" class="bookings" method="post" action="/anotherpage.asp">
<input type="hidden" name="bookStart" value="">
<input type="hidden" name="bookEnd" value="">
<input class="book" type="submit" name="Submit" value="Next">
</form>
JQuery:
function bookingValidation(formIdentifier){
var start = 0;
var checkTheDate;
var currentDate;
var diff;
var days;
var validity = false;
var checkCounter = 0
$("tr#row"+formIdentifier).find('td').each(function (){
var date = $(this).find('input');
if(!date.attr('data-name') == null || !date.attr('data-name') == "") { //if it exists, check to see if it is checked.
if( date.prop('checked') ){ //If checkbox is checked
checkCounter++; // if current checkbox is checked, increment.
if(start == 0){ //if start == 0, then this is the first date. We want to pass the date value into the forms hidden field
checkTheDate = new Date(date.attr('data-name')); //this is first check box that is checked. grab the associated date and save it
$('#booking'+formIdentifier).find('input[name=bookStart]').val(jsToVbDate(checkTheDate)); //set both start and end date, incase customer wants to do a 1 day trip
$('#booking'+formIdentifier).find('input[name=bookEnd]').val(jsToVbDate(checkTheDate));
start++; //increment so this if statement will never become true
validity = false;
}
else{ //
checkTheDate.setDate( checkTheDate.getDate() + 1); //increment check date to hopefully match current date
currentDate = new Date(date.attr('data-name')); //grab current date
diff = new Date(currentDate - checkTheDate); //subtract current date from check date, will return in milliseconds
days = diff/1000/60/60/24; //convert milliseconds into days
if(days <= 0){ //if days is less than or equal to 0, this means that the check date and current date are the same, meaning the checkboxes are consecutive
$('#booking'+formIdentifier).find('input[name=bookEnd]').val(jsToVbDate(currentDate)); //update end date with current date
validity = true;//passes validation, can continue onto booking
}
else{
alert("Checks must be consecutive");
validity = false; //fails validation, can not continue to booking
return false;
}
}
} //2nd if
} //1st if
}); //end .each() loop
//checks how many checkboxes were checked. If 1 or less were checked, validation failed.
if (checkCounter <= 1){
alert("You must select at a minimum of 2 days");
validity = false;
}
return validity;
}
function jsToVbDate(dateToFormat){
var bookStartY = dateToFormat.getFullYear();
var bookStartM = dateToFormat.getMonth()+1;
var bookStartD = dateToFormat.getDate();
var dateToFormat = bookStartY + "-" + bookStartM + "-" + bookStartD;
return dateToFormat;
}
Пожалуйста помоги! Я начинаю вырывать волосы!
Похоже, что IE не может использовать используемый формат даты, вы можете использовать $.datepicker.parseDate для синтаксического анализа даты с пользовательским форматом
checkTheDate = $.datepicker.parseDate( 'd/mm/yy', date.data('name'));
Я не понимаю, почему флажки не в форме.
В любом случае, чтобы преобразовать "1/11/2013" в дату (предполагая d/m/y), используйте функцию, например:
function toDate(s) {
var bits = s.split(/\D/);
return new Date(bits[2], --bits[1], bits[0]);
}
Примечание: синтаксический анализ строк даты в значительной степени зависит от реализации, и часто ожидается "m/d/y". Ручной анализ, безусловно, лучший метод.
date.data('name')
лучше.