За последние 24 часа нас посетили 22662 программиста и 1163 робота. Сейчас ищут 816 программистов ...

не срабатывает правильно подсчет координат

Тема в разделе "JavaScript и AJAX", создана пользователем sergey1998181, 27 июн 2017.

Метки:
  1. sergey1998181

    sergey1998181 Новичок

    С нами с:
    20 сен 2016
    Сообщения:
    34
    Симпатии:
    1
    календарь должен трогать инпут из которого вызван но он падает в подвал сайта
    Код (Javascript):
    1. var date = new Date();
    2. var currdate = new Date();
    3. var colorclear;
    4. var input;
    5.  
    6. function insertNodeText(obj, text) {
    7.     var txtNode = document.createTextNode(text);
    8.     obj.appendChild(txtNode);
    9.     return obj;
    10. }
    11.  
    12. function insertButton(obj, text, flag) {
    13.     var buttons = Array (2);
    14.     for (i = 0; i < buttons.length; i++) {
    15.         button = document.createElement('Button');
    16.         var caption = (i == flag)? text + text : text;
    17.         button = insertNodeText(button, caption);
    18.         button.onclick = controlButton;
    19.         obj.appendChild(button);
    20.     }
    21. }
    22.  
    23. function getCoords(elem) {
    24.     var box = elem.getBoundingClientRect();
    25.     var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
    26.      var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
    27.      var clientTop = document.documentElement.clientTop || document.body.clientTop || 0;
    28.      var clientLeft = document.documentElement.clientLeft || document.body.clientLeft || 0;
    29.     var top  = box.top +  scrollTop - clientTop;
    30.  
    31.     var left = box.left + scrollLeft - clientLeft;
    32.     alert(left);
    33.     return { top: Math.round(top) + elem.offsetHeight + 'px', left: Math.round(left) + 'px'}
    34. }
    35.  
    36. function getCountDay(index) {
    37.     var months = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    38.     if (date.getFullYear() % 4 == 0)
    39.         months[1]++;
    40.     return months[index];
    41. }
    42.  
    43. function getCountWeek(date) {
    44.     date.setDate(1);
    45.     return Math.ceil((getCountDay(date.getMonth()) + getNumberDay(date)) / 7);
    46. }
    47.  
    48. function getNumberDay(date) {
    49.     var days = new Array(6, 0, 1, 2, 3, 4, 5);
    50.     return days[date.getDay()];
    51. }
    52.  
    53. function getNumberFirstDay(date) {
    54.     date.setDate(1);
    55.     return getNumberDay(date);
    56. }
    57.  
    58. function controlButton() {
    59.     if (this.lastChild.nodeValue.length == 1) {
    60.         var m = (this.lastChild.nodeValue == '<')? date.getTime() - (24 * 60 * 60 * 1000 * date.getDate()) : date.getTime() + (24 * 60 * 60 * 1000 * (getCountDay(date.getMonth()) - date.getDate() + 1));
    61.             date.setTime(m);
    62.     }
    63.     else {
    64.         var Y = (this.lastChild.nodeValue == '<<')? date.getFullYear() - 1 : date.getFullYear() + 1;
    65.         date.setFullYear(Y);
    66.     }
    67.     generateCalendar();
    68. }
    69.  
    70. function createTable() {
    71.     var days = new Array('П', 'В', 'С', 'Ч', 'П','С','В');
    72.    
    73.     body = document.getElementsByTagName('body')[0];
    74.     div = document.createElement('div');
    75.     body.appendChild(div);
    76.     div.setAttribute('id', 'calendar', 0);
    77.  
    78.     div.className = 'calendar-wrapper';
    79.        
    80.     var tbl = document.createElement("table");
    81.     div.appendChild(tbl);
    82.    
    83.     tbl.setAttribute('align', 'center', 0);
    84.     tbl.setAttribute('cellpadding', '0', 0);
    85.     tbl.setAttribute('cellspacing', '0', 0);  
    86.    
    87.     var row = tbl.insertRow(-1);
    88.     row.setAttribute('id', 'first-child', 0);  
    89.    
    90.     // первая ячейка
    91.     var cell = row.insertCell(-1);
    92.     cell.setAttribute('colspan', '2', 0);
    93.     cell.className = 'lalign';
    94.     cell = insertButton(cell, '<', 0);
    95.    
    96.     // вторая ячейка
    97.     var cell = row.insertCell(-1);
    98.     cell.setAttribute('colspan', '3', 0);  
    99.    
    100.     // третья ячейка
    101.     cell = row.insertCell(-1);
    102.     cell.setAttribute('colspan', '2', 0);  
    103.     cell.className = 'ralign';
    104.     cell = insertButton(cell, '>', 1);
    105.    
    106.     row = tbl.insertRow(-1);
    107.     row.className = 'day';
    108.     for (i = 0; i < 7; i++) {
    109.         cell = row.insertCell(-1);
    110.         cell = insertNodeText(cell, days[i]);
    111.         if (i == 6)
    112.             cell.style.color = '#ee0000';                          
    113.     }
    114. }
    115.  
    116. function generateCalendar() {
    117.     var wrapper = document.getElementById('calendar');
    118.     var tbl = wrapper.getElementsByTagName('table')[0];  
    119.    
    120.     var months = Array('Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек');  
    121.    
    122.     tbl.rows[0].cells[1].innerHTML = months[date.getMonth()] + ' ' + date.getFullYear();
    123.    
    124.     while (tbl.rows.length > 2)
    125.         tbl.deleteRow(tbl.rows.length - 1);
    126.    
    127.     var flag = false;
    128.     var countday = 1;
    129.    
    130.     for (i = 0; i < getCountWeek(date); i++) {
    131.         row = tbl.insertRow(-1);
    132.         for (j = 0; j < 7; j++) {
    133.             cell = row.insertCell(-1);
    134.             if (j == getNumberFirstDay(date))
    135.                 flag = true;
    136.             if (flag && countday <= getCountDay(date.getMonth())) {
    137.                 cell = insertNodeText(cell, countday);
    138.                
    139.                 cell.onclick = function() {
    140.                                             document.getElementById('calendar').style.display = 'none';
    141.                                             date.setDate(this.lastChild.nodeValue);
    142.                                             var d = (date.getDate() < 10)? '0' + date.getDate() : date.getDate();                                  
    143.                                             var m = ((date.getMonth() + 1) < 10)? '0' + (date.getMonth() + 1) : (date.getMonth() + 1);
    144.                                             // Порядок вывода даты (День, Месяц, Год)
    145.                                             input.value = d + '.' + m + '.' + date.getFullYear();
    146.                                            
    147.                                 };
    148.                 cell.onmouseover = function() {colorclear = this.className; this.className = 'Select';};
    149.                 cell.onmouseout = function() {this.className = colorclear;};
    150.                 if (j == 6)
    151.                     cell.className = 'Sunday';
    152.                 else
    153.                     cell.className = 'DefaultDay';
    154.                 if (currdate.getFullYear() == date.getFullYear() && currdate.getMonth() == date.getMonth() && currdate.getDate() == countday)
    155.                     cell.className = 'CurrDay';
    156.                    
    157.                 countday++;
    158.             }
    159.             else {
    160.                 cell.style.border = 'none';
    161.                 cell = insertNodeText(cell, ' ');
    162.             }
    163.         }
    164.     }
    165. }
    166.  
    167.  
    168. function showcalendar(input_date) {
    169.  
    170.     input = input_date;
    171.     var wrapper = document.getElementById('calendar');
    172.    
    173.     if (input.value != '') {
    174.         // Разделяем переданную дату
    175.         var ar = input.value.split('.');
    176.         // Массив параметров (День, Месяц, Год)
    177.         // В Конструктор Date передаем в другом порядке, а именно: Год, Месяц, День
    178.         // ar[2] - Год
    179.         // ar[1] - Месяц
    180.         // ar[0] - День
    181.         // В JavaScript месяца идут с 0 до 11, поэтому мы от номера месяца отнимаем единицу
    182.         date = new Date (ar[2], ar[1] - 1, ar[0]);
    183.     }
    184.    
    185.     generateCalendar();  
    186.        
    187.     wrapper.style.left = getCoords(input).left ;
    188.     wrapper.style.top = getCoords(input).top;
    189.     wrapper.style.display = (wrapper.style.display=="block")? "none" : "block";
    190. }
    191.  
    192. if (window.addEventListener)
    193.     window.addEventListener('load', createTable, false);
    194. else if (window.attachEvent)
    195.     window.attachEvent('onload', createTable);
    HTML:
    1.         <tr id="order_date">
    2.                                 <td><span class="required">*</span>Дата самовывоза</td>
    3.                                 <td>
    4.                                     <input type="text" id="datepicker_av" name="order_date"size="10"  class="large-field" readonly="readonly" onclick="showcalendar(this)"/>
    5.  
    6.  
    7.                                 </td>
    8.                             </tr>
    выкладвыаю код js и где вызываю
    --- Добавлено ---
    календарь должен прижиматься к инпуту из которого вызван ,но нет ,он падает в падвал сайта
     
  2. sergey1998181

    sergey1998181 Новичок

    С нами с:
    20 сен 2016
    Сообщения:
    34
    Симпатии:
    1
    пытался сейччас не считать и сразу передать параметры ,в итоге он даже не сдвинулся .