Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Календарь на подобие Datepicker (https://javascript.ru/forum/jquery/61660-kalendar-na-podobie-datepicker.html)

karden 29.02.2016 16:06

Календарь на подобие Datepicker
 
Добрый день.

У меня есть необходимость для сайта реализовать что-то подобное такому календарику: http://www.lomarengas.fi/ru/cottages...ns= &keyword=

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

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

Я вот сейчас думаю, что надо бы переписать всю эту халтуру. Переписывать код Datepicker мне кажется с одной стороны неправильно, и я побаиваюсь (понимание JS более чем условное).

Как стоило бы поступить?

Спасибо.

рони 29.02.2016 17:53

karden,
Datepicker вполне можно настроить под вашу задачу...передавать можно либо массив либо обьект с занятыми датами и при выводе месяца изменять css занятых дат

karden 01.03.2016 00:41

Посмотрел исходники Datepicker. Честно сказать - страшновато лезть в этот код. 2000 строк мозгодробительного кода (хотя фактически формирование вывода - 30-40 строк). Обработку событий пока вообще не нашел. Их тоже придется переписывать.

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

Относительно хранения/передачи информации по датам.
Я сейчас сделал хранение информации в БД с следующем виде:

id | HouseID | Year | DayOfYear | Status | Reserv-UserID

Мне, честно сказать, не очень нравится часть "Year | DayOfYear". Да и для передачи между клиентом и сервером простым массивом такое не передашь. Может быть есть опыт/мысли как это лучше сложить в БД?

Спасибо

рони 01.03.2016 02:09

Цитата:

Сообщение от karden
Честно сказать - страшновато лезть в этот код.

а зачем вам это нужно?
Цитата:

Сообщение от karden
Обработку событий пока вообще не нашел.

http://api.jqueryui.com/datepicker/#option-onSelect
результат из базы для календаря по вашим условиям проще что-то типа так
var data = {
        "01.03.2016" : {start : true, end : false},
        "02.03.2016" : {start : true, end : true},
        "03.03.2016" : {start : false, end : true}
      }

и живой пример как бы это могло быть: http://javascript.ru/forum/misc/5963...tml#post396858

karden 01.03.2016 10:58

Да, это очень близко к тому, что мне надо. Спасибо.

Относительно фонов выбранных ячеек. Там всего 2 стиля: выбрано или нет. Я хотел сделать больше вариантов: не выбрано, зарезервиновано, занято - отсекая уже занятые даты и оставшиеся даты можно выбрать.

И в моем случае мне надо поменять фон на текущем элементе и следующим за ним. Вот в этой части мне кажется, что не получится без влезания в код библиотеки. Надеюсь, что я тут не прав :)

Относительно формата данных - однозначно согласен. Что-то я перемудрил...

рони 01.03.2016 11:26

Цитата:

Сообщение от karden
Надеюсь, что я тут не прав

да вы не правы ... в примере выше ... показан способ установить класс ... если можно сделать 1 класс , то можно сделать 100590 ... start : true, 1 класс end : true 2 класс , супер-пупер бронируем 3 класс, более 3 классов не заметил

karden 01.03.2016 16:16

Обалдеть! Всего пол дня, и у меня фактически получилось отвоевать этот вопрос.

1. На Disabled даты не выводится ALT-текст. Это исправимо?

2. Раз уж так все красиво получается, то есть ли механизм наложить маску на фон? То есть сделать фон черно-белый, а при выводе в зависимости от статусов менять: черный на один цвет, а белый на другой. В противном случае надо будет делать кучу записей в CSS с перебором всех возможных комбинаций.

Честно сказать - утром был уверен в том, что ничего не получится... :) Готов проставиться пивом (или учесть Ваши предпочтения).

рони 01.03.2016 17:09

karden,
нужен код иначе не понимаю о чём речь

karden 01.03.2016 17:36

<!doctype html>

<html lang="en">

<head>

  <meta charset="utf-8" />
  <title>jQuery UI Datepicker - Default functionality</title>

  <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/humanity/jquery-ui.css" />

  <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
  <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
  <link rel="stylesheet" href="/resources/demos/style.css" />
   <style type="text/css">

   body{
     font-size: 12px;
   }
.active .ui-state-default{
    background: rgba(102, 255, 102, 1)
}
.active:hover .ui-state-default{
    background: rgba(255, 255, 0, 1)
}

.test .ui-state-default{
    background: rgba(255, 215, 0, 1)
}
   </style>
  <script>

var SelectableDayStatus = { 0: {Selectable: true, Name: 'Доступно для бронирования'},
                            1: {Selectable: false, Name: 'Зарезервировано'},
                            2: {Selectable: false, Name: 'Забронировано'},
                            3: {Selectable: false, Name: 'Оплачно'},
                            8: {Selectable: false, Name: 'Техническое обслуживание'},
                            9: {Selectable: false, Name: 'Нет данных'}
                            };

// Это будет приходить с сервера на текущий месяц, и при переключении месяца надо будет дополнять массив
var DayStatus = { "25.02.2016" : 0,
                   "26.02.2016" : 0,
                   "27.02.2016" : 0,
                   "28.02.2016" : 0,
                   "29.02.2016" : 0,
                   "01.03.2016" : 0,
                   "02.03.2016" : 0,
                   "03.03.2016" : 0,
//                   "04.03.2016" : 0,
//                   "05.03.2016" : 0,
                   "06.03.2016" : 0,
                   "07.03.2016" : 0,
                   "08.03.2016" : 1,
                   "09.03.2016" : 1,
                   "10.03.2016" : 1,
                   "11.03.2016" : 0,
                   "12.03.2016" : 0,
                   "13.03.2016" : 2,
                   "14.03.2016" : 3,
                   "MaxDate": 365
};

  $(function() {

    $.datepicker.regional['ru'] = {
		closeText: 'Закрыть',
		prevText: '&#x3c;Пред',
		nextText: 'След&#x3e;',
		currentText: 'Сегодня',
		monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь', 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', 'Июл','Авг','Сен','Окт','Ноя','Дек'],
		dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
		dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
		dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
		dateFormat: 'dd.mm.yy',
		firstDay: 1,
		isRTL: false,
		showOtherMonths:true,
		selectOtherMonths:true,
		changeMonth:false,
        changeYear: false
     };
var SelectedDays = [];
$.datepicker.setDefaults($.datepicker.regional['ru']);
$( '#datepicker' ).datepicker({ altField: "#show",
                                altFormat: "yy-mm-dd",
                                minDate: 0,
                                maxDate: DayStatus['MaxDate'],
                                beforeShowDay: function(date) {
                                                      var cds = date.toLocaleString().slice(0, 10);
                                                      var CurrentDayStyleFlag = (typeof DayStatus[cds] === 'undefined')?9:DayStatus[cds];
                                                      var CurrentDaySelectable = SelectableDayStatus[CurrentDayStyleFlag].Selectable;

                                                      var pds = new Date(date.getTime()-86400000).toLocaleString().slice(0, 10);
                                                      var PrevDayStyleFlag = (typeof DayStatus[pds] === 'undefined')?9:DayStatus[pds];
console.log (cds, '->', CurrentDayStyleFlag, ';', pds, '->', PrevDayStyleFlag);
                                                      for (var i=0; i<SelectedDays.length; i++)
                                                        { var d = SelectedDays[i];
                                                          d = d.split('.');
                                                          if (date.getTime() == (new Date(d[2],d[1]-1,d[0])).getTime()) return[CurrentDaySelectable, "active", SelectableDayStatus[CurrentDayStyleFlag].Name]
                                                        };

                                                          return[CurrentDaySelectable, "test"]
                                               },
                                onSelect : function(value,b) {
                                                  var ok = $.inArray(value, SelectedDays);
                                                  if (ok == -1) SelectedDays.push(value)
                                                  else {SelectedDays.splice(ok,1)};
//  alert(JSON.stringify(SelectedDays));
                                                  $('#JSON_DATA').html (JSON.stringify(SelectedDays, null, '\t'));
                                           }
                             })
  }); // Function
  </script>
</head>
<body>
<div id="datepicker"></div>

<input id="show">
<pre id="JSON_DATA"></pre>

</body>
</html>


Стили фонов пока не прописывал...

рони 01.03.2016 18:35

datepicker и бронирование на несколько дней
 
karden,
осталось только проглотить :lol: ... далее сами ... перевести под свой формат, думаю сможите.
<!doctype html>



<html lang="en">

<head>

  <meta charset="utf-8" />

  <title>jQuery UI Datepicker - Default functionality</title>

  <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/sunny/jquery-ui.css" />

  <script src="http://code.jquery.com/jquery-1.10.2.js"></script>

  <script src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>



   <style type="text/css">

   body{
     font-size: 12px;
   }
.active .ui-state-default{
    background-color: #32CD32;
     background-image: none;
}
.ui-state-default{
  position: relative;
}

.end  .ui-state-default:before{
position: absolute;
top:0;
left:0;
content: '';
display: block;
width: 0;
height: 0;
border-style: solid;
border-width: 8px 8px 0 0;
border-color: #FF0000 transparent transparent transparent;
 margin: 0;
 padding: 0;
}
.start .ui-state-default:after{
position: absolute;
 right: 0;
 bottom: 0;
content: '';
display: block;
width: 0;
height: 0;
border-style: solid;
border-width: 0 0 8px 8px;
border-color: transparent transparent #FF0000 transparent;

 margin: 0;
 padding: 0;
}

.active:hover .ui-state-default{
    background: rgba(255, 255, 0, 1)
}
#period_id{
  width: 100px;
}
 :focus{
    outline:0;
    border:0;
  }
.busy  .ui-state-default{
  background-color: #FFC0CB;
  background-image: none;
}

   </style>
  <script>

  $(function() {

    $.datepicker.regional['ru'] = {
        closeText: 'Закрыть',
        prevText: '&#x3c;Пред',
        nextText: 'След&#x3e;',
        currentText: 'Сегодня',
        monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь', 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
        monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', 'Июл','Авг','Сен','Окт','Ноя','Дек'],
        dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
        dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
        dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
        dateFormat: 'dd.mm.yy',
        firstDay: 1,
        isRTL: false,
        showOtherMonths:true,
        selectOtherMonths:true,
        changeMonth:true,
        changeYear: false,
        showAnim:'scale'
};
$.datepicker.setDefaults($.datepicker.regional["ru"]);
var $sel = $("#period_id"), $picker = $("#datepicker"),  $end = $(".title"),
    obj = {start : false, end : false},
    data = {
        "01.03.2016" : {start : true, end : false},
        "02.03.2016" : {start : true, end : true},
        "03.03.2016" : {start : false, end : true}
      }
 ;
function selected() {
    var selectedDate = $picker.val();
    var period_date = +$sel.val() || 1,
        instance = $picker.data("datepicker"),
        date = $.datepicker.parseDate("dd.mm.yy", selectedDate, instance.settings);
        obj.start = date.getTime();
    date.setDate(date.getDate() + period_date);//тут нужна проверка нет ли в диапазоне занятых дней
        obj.end = date.getTime();
    date = $.datepicker.formatDate("dd.mm.yy", date, instance.settings);
    $end.text("Дата заезда : " + selectedDate + " Дата выезда: " + date);
    $picker.datepicker( "refresh" );
}
function show(date) {

var instance = $picker.data("datepicker"),
    dateStr = $.datepicker.formatDate("dd.mm.yy", date, instance.settings),
cls = "", title = "свободно", ev = true;
if(data[dateStr]){
  cls = "busy";
  data[dateStr].end && (cls += " end", title = "заезд после обеда");
  data[dateStr].start && (cls += " start", title = "занято", ev = false);
}
if (obj.start && date.getTime() >= obj.start && date.getTime() <= obj.end) {
  title = "Забронировано вами";
  if(date.getTime() == obj.start) {cls += " active start"; title = "день заезда";}
  else if(date.getTime() == obj.end) {cls += " active end"; title = "день выезда";}
  else cls  += " active start end";
  return[ev, cls, title]
} ;
return[ev, cls, title]}



$picker.datepicker({
    dateFormat: "dd.mm.yy",
    minDate: 0,
    onSelect: selected,
    beforeShowDay: show,
    showWeek: true,
    weekHeader: "Нед."
}).tooltip();
//$sel.on("change", selected); нужна проверка диапазона
var plural = function (b) {
    return function (a) {
        return b[1 == a % 10 && 11 != a % 100 ? 0 : 2 <= a % 10 && 4 >= a % 10 && (10 > a % 100 || 20 <= a % 100) ? 1 : 2]
    }
};
var d = plural([' день',' дня',' дней'])
for (var i=1; i< 25; i++)  {
   $("<option>", {text : i + d(i), value : i}).appendTo($sel)
};

$sel.selectmenu({change: function( event, ui ) {
  $(this).change()
}});

});
  </script>
</head>
<body>

<h2 class="title">Выберите количество дней и дату заезда</h2>
 <br>
 <label>Количество дней проживания
    <select id="period_id"></select>
</label><br>
<div id="datepicker"></div>
</body>
</html>

karden 01.03.2016 21:00

Круто, но ничего с первого прочтения не понял... Сейчас буду разбираться...

А мой код, видимо, совсем кривой? :(

karden 01.03.2016 22:23

На тему заливки фонов я имел в виду что-то типа этого: http://css.yoksel.ru/css-and-svg-masks/

Сейчас сам попробую вникнуть.

Мысль в том, чтобы был один графический файл с маской размером с ячейку который был бы с двумя треугольниками типа такого только черно-белый. А дальше, я даю цвет фона как левый треугольник (прозрачный), на правый накладываю нужный цвет. А сверху виден текст с датой.

рони 01.03.2016 22:51

Цитата:

Сообщение от karden
Мысль в том,

для меня это слишком непонятно :) если получится, покажите ... код выше просто пример как можно из даты в миллисекундах получить строку в нужном формате, например dd.mm.yy и наоборот, ранее была ссылка на пример, там я ещё не знал, что у datepicker есть встроенный метод преобразования в обе стороны и им можно воспользоваться, поэтому парсил напрямую :lol:

karden 04.03.2016 20:34

Добрый вечер.

С фонами решение нашлось.
// В CSS

/* 0 - Free */
.poly1c0 .ui-state-default, .poly1c0 .ui-state-active {
    background: #f9eeda;
}
.poly2c0 .ui-state-default, .poly2c0 .ui-state-active {
    background-image: linear-gradient(to left top, #f9eeda 50%, transparent 50%) !important;
}
/* 1 - Reserved */
.poly1c1 .ui-state-default, .poly1c1 .ui-state-active {
    background: yellow;
}
.poly2c1 .ui-state-default, .poly2c1 .ui-state-active {
    background-image: linear-gradient(to left top, yellow 50%, transparent 50%) !important;
}
/* 7 - Selected */
.poly1c7 .ui-state-default, .poly1c7 .ui-state-active {
    background: #AFEA70;
}
.poly2c7 .ui-state-default, .poly2c7 .ui-state-active {
    background-image: linear-gradient(to left top, #AFEA70 50%, transparent 50%) !important;
}

// Стиль ячейки:

"poly1c"+PrevDayStyleFlag+" poly2c"+CurrentDayStyleFlag


И Все бы замечательно, но как только я добавляю третий вариант раскраски (тип), начинает плющить фоны (при выборе дат). В HTML-выводе все стили меняются корректно, а выводятся - нет. Нет мыслей почему так?

Код очень громоздкий, может будет проще ссылку на скрипт? http://realfarmer.ru/2/

karden 17.03.2016 21:18

Все прикрутил как надо! Офигительно работает.

Тут еще одна мысль пришла в голову, но не могу понять можно ли это прикрутить.

На странице несколько элементов datepicker. Можно ли сделать так, чтобы при переключении месяца (вперед - назад) на любом из них месяц переключался на всех?

И дополнительно. Можно ли узнать какой месяц открыт в данный момент?

Спасибо.

рони 17.03.2016 23:39

karden,
onChangeMonthYear

рони 18.03.2016 00:55

Цитата:

Сообщение от karden
Можно ли сделать так, чтобы при переключении месяца (вперед - назад) на любом из них месяц переключался на всех?

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>jQuery UI Datepicker - Icon trigger</title>
  <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/sunny/jquery-ui.css">
<style type="text/css">
#ui-datepicker-div{
  font-size: 12px;
}

</style>
  <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
  <script src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
  <script>
  $(function() {
      $(".datepicker").datepicker({
          changeYear: true,
          firstDay: 1,
          onChangeMonthYear: function(year, month, el) {
              $(".datepicker").datepicker("setDate", month + "/1/" + year);
          }
      });
  });
  </script>
</head>
<body>
<div class="datepicker"></div><div class="datepicker"></div>
</body>
</html>

karden 19.03.2016 11:35

Спасибо. Это прикрутил с поправкой на то, что формат даты мы поменяли и оно сразу не заработало.

Еще одну задачку не до конца понимаю как решить.

Интерфейс менеджера. Есть такой же календарь, и под ним еще таблица со списком резервов (ДАТА_НАЧАЛО ! ДАТА_КОНЕЦ ! ФИО)

И тут двойная задача:
1. При наведении мыши на дату, которая зарезервирована - подсветить все даты, относящиеся к данному резерву.
2. Подсветить строку в таблице, которая описывает этот резерв.

И наоборот при наведении мыши на строку в таблице - подсвечивать даты в календаре.

Мысли/вопросы:
1. Выделать ячейки фонами - мы не можем, т.к. они используются для выделения статусов дней. Предполагаю, что проще всего выделить цветом текста и жирным начертанием. Еще не пробовал править стили для этого, но думаю, что проблем быть не должно.

2. Технически к каждой ячейке задаем класс, который будет флагом того, что ячейка относится к тем, которые надо подсвечивать и второй класс с номером резерва (это мне не очень нравится).

3. Добавляем обработку события MouseOver и MouseOut для класса-флага. В документации datepicker этого найти не смог.

рони 19.03.2016 12:08

karden,
немогу представить такой календарь -- если только сразу на весь год. и хоть это и не корректно, попробуйте задавать вопросы про datepicker на http://ru.stackoverflow.com там больше специалистов знакомы с этим плагином ...

karden 19.03.2016 12:39

Я сейчас пробно сделал на 3 месяца (на год очень громоздко).

Попробую там поспрашивать. Спасибо.

karden 20.03.2016 11:59

Вроде нашел, то что мне надо. И даже, условно, работает.

$(function() {
    $(document).on("mouseenter",'[data-handler="selectDay"]',function(){
      var date = new Date($(this).data("year"), $(this).data("month"),$(this).text());
      var ReservID = $('this').attr('class');
      console.log(date) // работает!
      console.log (ReservID); // возвращает nul!
      console.dir(this) // возвращает объект td.ReservID24.poly1c3.poly2c3
    })
  });


Я добавил в BeforeShowDay дополнительный стиль ячейки "ReservIDXX", где ХХ - номер брони. Хотя сейчас уже думаю, что было бы лучше добавить атрибут к объекту "data-reservid='xx'". Это не получилось по причине того, что я в эту функцию не передается ссылка на объект (видимо, в связи с тем, что его еще нет). Реально ли как-то "воткнуть" свой атрибут?

И, собственно, основной вопрос в том, что вышеприведенный код возвращает ReservID=null, вместо перечисления стилей. В то время как console.dir выводит объект TD с описанием нужной ячейки (в которой классы прописаны).

рони 20.03.2016 12:45

karden,
4 строка кавычки то зачем у this?

karden 20.03.2016 12:52

2 недели за компьютером почти не вылезаю... С утра не мог найти ошибку :)

Спасибо

karden 21.03.2016 16:09

Небольшой вопрос, который не понял из документации.

$( "#autoFIO" ).autocomplete({
	delay: 500,
	minLength: 3,
	source: getUserByRealName
});

function getUserByRealName(request, response) {
	// тут ajax-запрос не пишу, чтобы не забивать голову лишним
	var ajaxResult = ['Иванов1', 'Иванов2', 'Иванов3'];

	response (ajaxResult); //???
	return (ajaxResult); //???
} //function getUserByRealName()


Оба варианта не заработали. Из документации я понял, что response - функция, которой надо передать данные - не сработало. Через return - тоже не показало.

Как это надо исправить?

Спасибо.

рони 21.03.2016 16:31

karden,
http://javascript.ru/forum/jquery/51...tml#post338176

karden 28.03.2016 18:59

Добрый вечер.

Потихонечку вояю интерфейс...

Возникла необходимость вставить вот такой код, но после того, как ОНО получилось - понял, что это какой-то монстр. Разумеется, там где-то что-то пропустил, выдается ошибка, что совершенно понятно, т.к. совершенно не читаемо.

А как этот код написать "правильно" (концептульно правильно)? Шаблон... Может еще что...

$(  '<tr id="ReservListItem'+ReservID+'" class="xReservListItem">'+
					'<td>+DayStatus['RESERV'][ReservID]['DateReservedBegin']+' - '
						+DayStatus['RESERV'][ReservID]['DateReservedEnd']+' ('
						+DayStatus['RESERV'][ReservID]['ReservedDays']+')</td>'+
					'<td>'+DayStatus['RESERV'][ReservID]['UserFullName']+'<br>'
						+DayStatus['RESERV'][ReservID]['Phone']+'</td>'+
					'<td>t3</td>'+
					'</tr>').appendTo($("#ReservList"+AppartID));


Спасибо.

рони 28.03.2016 19:31

karden,
строки 1-4 не осилил
ниже можно так
var tr = $("<tr>", {
    id: "ReservListItem" + ReservID,
    "class": "xReservListItem"
}).appendTo($("#ReservList" + AppartID));
var td = $("<td>").appendTo(tr);
var a = $("<a>", {
    text: DayStatus["RESERV"][ReservID]["DateReservedBegin"] + " - " + DayStatus["RESERV"][ReservID]["DateReservedEnd"] + " (" + DayStatus["RESERV"][ReservID]["ReservedDays"] + ")",
    click: onClc
}).appendTo(td);
var td = $("<td>").appendTo(tr);
var a = $("<a>", {
    text: "t3",
    click: onClc
}).appendTo(td);

или пример тут строки 22 - 28
http://javascript.ru/forum/misc/4830...tml#post318542

karden 28.03.2016 20:48

Супер! Спасибо :)

karden 28.03.2016 22:09

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

for (AppartID in ReservesList) {
   for (ReservID in ReservesList[AppartID]) {
      console.log(AppartID, ReservID);
      $('#ReservListItem'+ReservID).click(function(){
	fShowDModal({
	   "AppartID": AppartID,
	   "ReservID": ReservID+''
	});
      });
   } // for2
} // for (AppartID in ReservesList)


В момент генерации - значения AppartID, ReservID - правильные. Но, когда происходит .click, значения - последние, которые и используются для всех событий.

Надо как-то "зафиксировать" значения...

рони 28.03.2016 22:22

karden,
не используйте for или нужно замыкание переменных
for (AppartID in ReservesList)
    for (ReservID in ReservesList[AppartID]) $("#ReservListItem" + ReservID).click(function(a, b) {
        return function() {
            fShowDModal({
                "AppartID": a,
                "ReservID": b + ""
            })
        }
    }(AppartID, ReservID));

karden 28.03.2016 22:43

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

рони 30.03.2016 19:54

karden,
в этом случае лучше создать новую тему ...

karden 05.04.2016 11:08

Снова вопрос...

При наведении на ячейку таблице (в datepicker) мне надо получить аттрибут, который присвоен тегу DIV, в который вставлен этот календарь

console.dir($(this).parent().parent().parent().parent().parent().parent().attr('appart-id'));


Этот код - работает, но выгляди уж очень страшно. :(

Может это можно как-то более аккуратно реализовать?

Спасибо

рони 05.04.2016 11:34

karden,
а класс у div есть?
$(this).parents('точка_класс').attr('appart-id')

или даже так
$(this).parents('[appart-id]').attr('appart-id')

karden 05.04.2016 11:43

Класс!!! Спасибо

karden 05.04.2016 22:13

Опять заткнулся... :)

Надо сделать автоматический скроллинг таблицы с описанием дат на календаре.

В сети нашел такое решение: http://jsfiddle.net/tzjrq1vt/2/ , которое и было взято за основу.

Вот, что получилось...

$(document).on("mouseenter",'[data-handler="selectDay"]',function(){

// Всякое...

if (ReservID > 0) {

    var w = $('#ReservListDiv' + AppartID);
    var table = $('#ReservList' + AppartID);
    var row = table.find('tr')
        .eq( +$('#ReservListItem'+ReservID).index());

    if (row.length) {
console.log('w.height()='+w.height(), 'row.position().top='+row.position().top);


//        $('#ReservList' + AppartID).animate({scrollTop: row.offset().top - (w.height()/2)}, 1000 );
        $('#ReservList' + AppartID).animate({'top': row.position().top+'px'}, 1000 );
    }


});

// Таблица - шапка из шаблона:

<div id="ReservListDiv<TMPL_VAR NAME="ID">" style="height:150px; overflow:auto; margin-top:20px;">
     <table width="100%" id="ReservList<TMPL_VAR NAME="ID">" class="DataList ReservesList">
	  <thead>
       <tr>
        <th width="200"><span style="position:absolute; top:-20px; z-index:2; height:20px; ">Период</span></th>
        <th><span style="position:absolute; top:-20px; z-index:2; height:20px; ">Описание</span></th>
        <th><span style="position:absolute; top:-20px; z-index:2; height:20px; ">Статус</span></th>
       </tr>
       </thead>
     </table>
	</div>

// Добавляются строки так:

var dt = DayStatus["RESERV"][ReservID]["DateReservedBegin"].split('.');
		var DtTS = (new Date(dt[2],dt[1]-1,dt[0])).getTime();

		var tr = $("<tr>", {
			id: "ReservListItem" + ReservID,
			"class": "xReservListItem",
			'sortValue': DtTS
		}).appendTo($("#ReservList" + AppartID));

		var td = $("<td>", {
			
			text: DayStatus["RESERV"][ReservID]["DateReservedBegin"] + " - " +
				DayStatus["RESERV"][ReservID]["DateReservedEnd"] + " (" +
				DayStatus["RESERV"][ReservID]["ReservedDays"] + ")"
		}).appendTo(tr);

		var td = $("<td>", {
			html: DayStatus['RESERV'][ReservID]['UserFullName']+'<br>'+
				DayStatus['RESERV'][ReservID]['Phone']
		}).appendTo(tr);

		var td = $("<td>", {
			text: "text3"
		}).appendTo(tr);


в лог пишется все красиво (все нужные переменные похожи на правду)

shell?m=36:1095 w.height()=150 row.position().top=108
shell?m=36:1095 w.height()=150 row.position().top=126
shell?m=36:1095 w.height()=150 row.position().top=144
2shell?m=36:1095 w.height()=150 row.position().top=212
shell?m=36:1095 w.height()=150 row.position().top=178
3shell?m=36:1095 w.height()=150 row.position().top=246
shell?m=36:1095 w.height()=150 row.position().top=178
6shell?m=36:1095 w.height()=150 row.position().top=212
2shell?m=36:1095 w.height()=150 row.position().top=178
shell?m=36:1095 w.height()=150 row.position().top=212

Собственно, проблема, на сколько я понимаю, либо в вызове animate, либо в параметрах DIV или таблицы. Совсем не могу понять куда двигаться дальше... :(

Спасибо.

рони 05.04.2016 22:46

karden,
логической цепочки между всеми предложениями вашего сообщения не прослеживаю.

karden 05.04.2016 23:05

Надо сделать автоматический скроллинг таблицы с описанием дат на календаре. В сети нашел такое решение: http://jsfiddle.net/tzjrq1vt/2/ , которое и было взято за основу.

Все данные для animate (верхняя часть кода) - приходят, вроде корректно (хотя бы для какого-нибудь движения). В конце сообщения кусок лога из консоли, чтобы было видно какие данные приходят в animate

Но у меня есть опасение, что ошибка не в этой части кода, а в описании ДИВа или таблицы, поэтому их тоже воткнул в исходник.

рони 05.04.2016 23:15

karden,
вы сами то смотрели что находится по вашей ссылке?

karden 05.04.2016 23:18

Сорри, не ту ссылку взял... http://jsfiddle.net/SZKJh/1/


Часовой пояс GMT +3, время: 04:29.