2011-07-22 45 views
2

我下載了Marc Grabanski的簡單日期選擇器。我想給他添加一個函數,事情是我不知道JavaScript。如何在javascript外點擊某處時關閉日期選擇器?

我想關閉日曆Div當我點擊外面的某個地方,就像我按下關閉按鈕。

HTML:

<head> 
     <script src="calendar.js"></script> 
     <link href="calendar.css" rel="stylesheet"> 

    </head> 

    <body> 

     <div id="calendarDiv"></div> 
     <h1>Modificado a partir do Original de <a href="http://marcgrabanski.com/">Marc Grabanski</a></h1> 
     <br/> 
     <label>Data:</label> 
     <input type="text" class="calendarSelectDate"/> 
    </body> 

的Javascript:

/*! 
* Clean Calendar 
* Copyright 2007-2009 Marc Grabanski ([email protected]) http://marcgrabanski.com 
* Project Page: http://marcgrabanski.com/article/clean-calendar 
* Under the MIT License */ 

var popUpCal = { 
    selectedMonth: new Date().getMonth(), 
    // 0-11 
    selectedYear: new Date().getFullYear(), 
    // 4-digit year 
    selectedDay: new Date().getDate(), 
    calendarId: 'calendarDiv', 
    inputClass: 'calendarSelectDate', 

    init: function() { 
    var x = getElementsByClass(popUpCal.inputClass, document, 'input'); 
    var y = document.getElementById(popUpCal.calendarId); 
    // set the calendar position based on the input position 
    for (var i = 0; i < x.length; i++) { 
     x[i].onfocus = function() { 
     popUpCal.selectedMonth = new Date().getMonth(); 
     setPos(this, y); 
     // setPos(targetObj,moveObj) 
     y.style.display = 'block'; 
     popUpCal.drawCalendar(this); 
     popUpCal.setupLinks(this); 
     } 
    } 
    }, 

    drawCalendar: function(inputObj) { 

    var html = ''; 
    html = '<a id="closeCalender"><img src="http://www.nzbmovieseeker.com/images/close.gif"></img></a>'; 
    html += '<table cellpadding="0" cellspacing="0" id="linksTable"><tr>'; 
    html += ' <td><a id="prevMonth"><b><< </b></a></td>'; 
    html += '<td colspan="7" class="calendarHeader">' + getMonthName(popUpCal.selectedMonth) + ' ' + popUpCal.selectedYear + '</td>'; 
    html += ' <td><a id="nextMonth"><b> >></b></a></td>'; 
    html += '</tr></table>'; 
    html += '<table id="calendar" cellpadding="0" cellspacing="0"><tr>'; 
    html += '</tr><tr class="weekDaysTitleRow">'; 
    var weekDays = new Array('D', 'S', 'T', 'Q', 'Q', 'S', 'S'); 
    for (var j = 0; j < weekDays.length; j++) { 
     html += '<td>' + weekDays[j] + '</td>'; 
    } 

    var daysInMonth = getDaysInMonth(popUpCal.selectedYear, popUpCal.selectedMonth); 
    var startDay = getFirstDayofMonth(popUpCal.selectedYear, popUpCal.selectedMonth); 
    var numRows = 0; 
    var printDate = 1; 
    if (startDay != 7) { 
     numRows = Math.ceil(((startDay + 1) + (daysInMonth))/7); 
     // calculate the number of rows to generate 
    } 

    // calculate number of days before calendar starts 
    if (startDay != 7) { 
     var noPrintDays = startDay + 1; 
    } else { 
     var noPrintDays = 0; 
     // if sunday print right away 
    } 
    var today = new Date().getDate(); 
    var thisMonth = new Date().getMonth(); 
    var thisYear = new Date().getFullYear(); 
    // create calendar rows 
    for (var e = 0; e < numRows; e++) { 
     html += '<tr class="weekDaysRow">'; 
     // create calendar days 
     for (var f = 0; f < 7; f++) { 
     if ((printDate == today) 
     && (popUpCal.selectedYear == thisYear) 
     && (popUpCal.selectedMonth == thisMonth) 
     && (noPrintDays == 0)) { 
      html += '<td id="today" class="weekDaysCell">'; 
     } else { 
      html += '<td class="weekDaysCell">'; 
     } 
     if (noPrintDays == 0) { 
      if (printDate <= daysInMonth) { 
      html += '<a>' + printDate + '</a>'; 
      } 
      printDate++; 
     } 
     html += '</td>'; 
     if (noPrintDays > 0) noPrintDays--; 
     } 
     html += '</tr>'; 
    } 
    html += '</table>'; 
    html += '<!--[if lte IE 6.5]><iframe src="javascript:false;" id="calendar_cover"></iframe><![endif]-->'; 

    // add calendar to element to calendar Div 
    var calendarDiv = document.getElementById(popUpCal.calendarId); 
    calendarDiv.innerHTML = html; 

    // close button link 
    document.getElementById('closeCalender').onclick = function() { 
     calendarDiv.style.display = 'none'; 
    } 
    // setup next and previous links 
    document.getElementById('prevMonth').onclick = function() { 
     popUpCal.selectedMonth--; 
     if (popUpCal.selectedMonth < 0) { 
     popUpCal.selectedMonth = 11; 
     popUpCal.selectedYear--; 
     } 
     popUpCal.drawCalendar(inputObj); 
     popUpCal.setupLinks(inputObj); 
    } 
    document.getElementById('nextMonth').onclick = function() { 
     popUpCal.selectedMonth++; 
     if (popUpCal.selectedMonth > 11) { 
     popUpCal.selectedMonth = 0; 
     popUpCal.selectedYear++; 
     } 
     popUpCal.drawCalendar(inputObj); 
     popUpCal.setupLinks(inputObj); 
    } 

    }, 
    // end drawCalendar function 
    setupLinks: function(inputObj) { 
    // set up link events on calendar table 
    var y = document.getElementById('calendar'); 
    var x = y.getElementsByTagName('a'); 
    for (var i = 0; i < x.length; i++) { 
     x[i].onmouseover = function() { 
     this.parentNode.className = 'weekDaysCellOver'; 
     } 
     x[i].onmouseout = function() { 
     this.parentNode.className = 'weekDaysCell'; 
     } 
     x[i].onclick = function() { 
     document.getElementById(popUpCal.calendarId).style.display = 'none'; 
     popUpCal.selectedDay = this.innerHTML; 
     inputObj.value = formatDate(popUpCal.selectedDay, popUpCal.selectedMonth, popUpCal.selectedYear); 
     } 
    } 
    } 

} 
// Add calendar event that has wide browser support 
if (typeof window.addEventListener != "undefined") 
window.addEventListener("load", popUpCal.init, false); 
else if (typeof window.attachEvent != "undefined") 
window.attachEvent("onload", popUpCal.init); 
else { 
    if (window.onload != null) { 
    var oldOnload = window.onload; 
    window.onload = function(e) { 
     oldOnload(e); 
     popUpCal.init(); 
    }; 
    } 
    else 
    window.onload = popUpCal.init; 
} 

/* Functions Dealing with Dates */ 

function formatDate(Day, Month, Year) { 
    Month++; 
    // adjust javascript month 
    if (Month < 10) Month = '0' + Month; 
    // add a zero if less than 10 
    if (Day < 10) Day = '0' + Day; 
    // add a zero if less than 10 
    var dateString = Year + '-' + Month + '-' + Day; 
    return dateString; 
} 

function getMonthName(month) { 
    var monthNames = new Array('Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'); 
    return monthNames[month]; 
} 

function getDayName(day) { 
    var dayNames = new Array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') 
    return dayNames[day]; 
} 

function getDaysInMonth(year, month) { 
    return 32 - new Date(year, month, 32).getDate(); 
} 

function getFirstDayofMonth(year, month) { 
    var day; 
    day = new Date(year, month, 0).getDay(); 
    return day; 
} 

/* Common Scripts */ 

function getElementsByClass(searchClass, node, tag) { 
    var classElements = new Array(); 
    if (node == null) node = document; 
    if (tag == null) tag = '*'; 
    var els = node.getElementsByTagName(tag); 
    var elsLen = els.length; 
    var pattern = new RegExp("(^|\s)" + searchClass + "(\s|$)"); 
    for (i = 0, j = 0; i < elsLen; i++) { 
    if (pattern.test(els[i].className)) { 
     classElements[j] = els[i]; 
     j++; 
    } 
    } 
    return classElements; 
} 

/* Position Functions */ 

function setPos(targetObj, moveObj) { 
    var coors = findPos(targetObj); 
    moveObj.style.position = 'absolute'; 
    moveObj.style.top = coors[1] + 18 + 'px'; 
    moveObj.style.left = coors[0] + 'px'; 
} 

function findPos(obj) { 
    var curleft = curtop = 0; 
    if (obj.offsetParent) { 
    curleft = obj.offsetLeft 
    curtop = obj.offsetTop 
    while (obj = obj.offsetParent) { 
     curleft += obj.offsetLeft 
     curtop += obj.offsetTop 
    } 
    } 
    return [curleft, curtop]; 
} 

或者JSFDDILE例如:http://jsfiddle.net/CJEC8/

感謝

回答

0

您可以創建一個div位於整個頁面的頂部,除了日期選擇器本身。當你點擊div時,你關閉日期選擇器(當然,除去div)。

+0

我該怎麼做?你能幫忙嗎? – vvhat

+0

如果我確實像你說的那樣,當我點擊文本框時,它會模糊並消失。也許事件可能是文本框的onblur? – vvhat

+0

onblur是一個很好的選擇 –

0

隨着一個簡單的研究,我認爲我靈魂你的問題。

的方法之前,這個代碼粘貼到關閉的時候,你在點擊該按鈕(前:// close button link

// Close when loses focus. 
var divEls = document.getElementsByTagName("input"); 
var i = 0; 
for(i=0;i<divEls.length;i++) 
    document.getElementById(divEls[i].id).onblur = function() { 
    calendarDiv.style.display = 'none';     
} 

人,是的jsfiddle那麼好。 很高興提供幫助。

0

這是回答你的問題

var popUpCal = { 
    selectedMonth: new Date().getMonth(), 
    // 0-11 
    selectedYear: new Date().getFullYear(), 
    // 4-digit year 
    selectedDay: new Date().getDate(), 
    calendarId: 'calendarDiv', 
    inputClass: 'calendarSelectDate', 

    init: function() { 
     var x = getElementsByClass(popUpCal.inputClass, document, 'input'); 
     var y = document.getElementById(popUpCal.calendarId); 
     // set the calendar position based on the input position 
     for (var i = 0; i < x.length; i++) { 
      x[i].onfocus=function() { 
       popUpCal.selectedMonth = new Date().getMonth(); 
       setPos(this, y); 
       // setPos(targetObj,moveObj) 
       y.style.display = 'block'; 
       popUpCal.drawCalendar(this); 
       popUpCal.setupLinks(this); 
      } 
      x[i].onblur=function(){ 
       popUpCal.hideCalendar(); 
      } 
     } 
    }, 

    drawCalendar: function(inputObj){ 
     var html = ''; 
     html = '<a id="closeCalender"><img src="http://www.nzbmovieseeker.com/images/close.gif"></img></a>'; 
     html += '<table cellpadding="0" cellspacing="0" id="linksTable"><tr>'; 
     html += ' <td><a id="prevMonth"><b><< </b></a></td>'; 
     html += '<td colspan="7" class="calendarHeader">' + getMonthName(popUpCal.selectedMonth) + ' ' + popUpCal.selectedYear + '</td>'; 
     html += ' <td><a id="nextMonth"><b> >></b></a></td>'; 
     html += '</tr></table>'; 
     html += '<table id="calendar" cellpadding="0" cellspacing="0"><tr>'; 
     html += '</tr><tr class="weekDaysTitleRow">'; 
     var weekDays = new Array('D', 'S', 'T', 'Q', 'Q', 'S', 'S'); 
     for (var j = 0; j < weekDays.length; j++) { 
      html += '<td>' + weekDays[j] + '</td>'; 
     } 

     var daysInMonth = getDaysInMonth(popUpCal.selectedYear, popUpCal.selectedMonth); 
     var startDay = getFirstDayofMonth(popUpCal.selectedYear, popUpCal.selectedMonth); 
     var numRows = 0; 
     var printDate = 1; 
     if (startDay != 7) { 
      numRows = Math.ceil(((startDay + 1) + (daysInMonth))/7); 
      // calculate the number of rows to generate 
     } 

     // calculate number of days before calendar starts 
     if (startDay != 7) { 
      var noPrintDays = startDay + 1; 
     } else { 
      var noPrintDays = 0; 
      // if sunday print right away  
     } 
     var today = new Date().getDate(); 
     var thisMonth = new Date().getMonth(); 
     var thisYear = new Date().getFullYear(); 
     // create calendar rows 
     for (var e = 0; e < numRows; e++) { 
      html += '<tr class="weekDaysRow">'; 
      // create calendar days 
      for (var f = 0; f < 7; f++) { 
       if ((printDate == today) && (popUpCal.selectedYear == thisYear) && (popUpCal.selectedMonth == thisMonth) && (noPrintDays == 0)) { 
        html += '<td id="today" class="weekDaysCell">'; 
       } else { 
        html += '<td class="weekDaysCell">'; 
       } 
       if (noPrintDays == 0) { 
        if (printDate <= daysInMonth) { 
         html += '<a>' + printDate + '</a>'; 
        } 
        printDate++; 
       } 
       html += '</td>'; 
       if (noPrintDays > 0) noPrintDays--; 
      } 
      html += '</tr>'; 
     } 
     html += '</table>'; 
     html += '<!--[if lte IE 6.5]><iframe src="javascript:false;" id="calendar_cover"></iframe><![endif]-->'; 

     // add calendar to element to calendar Div 
     var calendarDiv = document.getElementById(popUpCal.calendarId); 
     calendarDiv.innerHTML = html; 

     // close button link 
     document.getElementById('closeCalender').onclick = function() { 
      calendarDiv.style.display = 'none'; 
     } 
     // setup next and previous links 
     document.getElementById('prevMonth').onclick = function() { 
      popUpCal.selectedMonth--; 
      if (popUpCal.selectedMonth < 0) { 
       popUpCal.selectedMonth = 11; 
       popUpCal.selectedYear--; 
      } 
      popUpCal.drawCalendar(inputObj); 
      popUpCal.setupLinks(inputObj); 
     } 
     document.getElementById('nextMonth').onclick = function() { 
      popUpCal.selectedMonth++; 
      if (popUpCal.selectedMonth > 11) { 
       popUpCal.selectedMonth = 0; 
       popUpCal.selectedYear++; 
      } 
      popUpCal.drawCalendar(inputObj); 
      popUpCal.setupLinks(inputObj); 
     } 

    }, 
    hideCalendar:function(){ 
     var calendarDiv=document.getElementById(popUpCal.calendarId); 
     calendarDiv.style.display = 'none'; 
    }, 
    // end drawCalendar function 
    setupLinks: function(inputObj) { 
     // set up link events on calendar table 
     var y = document.getElementById('calendar'); 
     var x = y.getElementsByTagName('a'); 
     for (var i = 0; i < x.length; i++) { 
      x[i].onmouseover = function() { 
       this.parentNode.className = 'weekDaysCellOver'; 
      } 
      x[i].onmouseout = function() { 
       this.parentNode.className = 'weekDaysCell'; 
      } 
      x[i].onclick = function() { 
       document.getElementById(popUpCal.calendarId).style.display = 'none'; 
       popUpCal.selectedDay = this.innerHTML; 
       inputObj.value = formatDate(popUpCal.selectedDay, popUpCal.selectedMonth, popUpCal.selectedYear); 
      } 
     } 
    } 

} 
// Add calendar event that has wide browser support 
if (typeof window.addEventListener != "undefined") window.addEventListener("load", popUpCal.init, false); 
else if (typeof window.attachEvent != "undefined") window.attachEvent("onload", popUpCal.init); 
else { 
    if (window.onload != null) { 
     var oldOnload = window.onload; 
     window.onload = function(e) { 
      oldOnload(e); 
      popUpCal.init(); 
     }; 
    } 
    else window.onload = popUpCal.init; 
} 

/* Functions Dealing with Dates */ 

function formatDate(Day, Month, Year) { 
    Month++; 
    // adjust javascript month 
    if (Month < 10) Month = '0' + Month; 
    // add a zero if less than 10 
    if (Day < 10) Day = '0' + Day; 
    // add a zero if less than 10 
    var dateString = Year + '-' + Month + '-' + Day; 
    return dateString; 
} 

function getMonthName(month) { 
    var monthNames = new Array('Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'); 
    return monthNames[month]; 
} 

function getDayName(day) { 
    var dayNames = new Array('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') 
    return dayNames[day]; 
} 

function getDaysInMonth(year, month) { 
    return 32 - new Date(year, month, 32).getDate(); 
} 

function getFirstDayofMonth(year, month) { 
    var day; 
    day = new Date(year, month, 0).getDay(); 
    return day; 
} 

/* Common Scripts */ 

function getElementsByClass(searchClass, node, tag) { 
    var classElements = new Array(); 
    if (node == null) node = document; 
    if (tag == null) tag = '*'; 
    var els = node.getElementsByTagName(tag); 
    var elsLen = els.length; 
    var pattern = new RegExp("(^|\s)" + searchClass + "(\s|$)"); 
    for (i = 0, j = 0; i < elsLen; i++) { 
     if (pattern.test(els[i].className)) { 
      classElements[j] = els[i]; 
      j++; 
     } 
    } 
    return classElements; 
} 

/* Position Functions */ 

function setPos(targetObj, moveObj) { 
    var coors = findPos(targetObj); 
    moveObj.style.position = 'absolute'; 
    moveObj.style.top = coors[1] + 18 + 'px'; 
    moveObj.style.left = coors[0] + 'px'; 
} 

function findPos(obj) { 
    var curleft = curtop = 0; 
    if (obj.offsetParent) { 
     curleft = obj.offsetLeft 
     curtop = obj.offsetTop 
     while (obj = obj.offsetParent) { 
      curleft += obj.offsetLeft 
      curtop += obj.offsetTop 
     } 
    } 
    return [curleft, curtop]; 
} 

我已經加入了

x[i].onblur=function(){ 
     popUpCal.hideCalendar(); 
    } 

在初始化函數 而//結束drawCalendar功能後,一個新的功能hideCalendar

// end drawCalendar function 
    hideCalendar:function(){ 
     var calendarDiv=document.getElementById(popUpCal.calendarId); 
     calendarDiv.style.display = 'none'; 
    }, 

請記住,這是一個簡單的修復。我會建議使用另一個庫。您可以嘗試的jQuery或其它許多datepickers在那裏的一個..

--Cheers,防爆

0

事情是這樣的:

HTML

<div id="closeCalendar"></div> 

CSS

#closeCalendar {display:none;position:fixed; top:0; left:0; height:100%; width:100%; z-index:100;} 
#calendarDiv {z-index: 200;} 

js

document.getElementById('closeCalendar').onclick = function() { 
    document.getElementById('calendarDiv').style.display = 'none'; 
    document.getElementById('closeCalendar').style.display = 'none'; 
} 

... 
init: 
... 
document.getElementById('closeCalendar').style.display = 'block'; 
... 
相關問題