首先,我們必須準備一些元素。既然你不想每年都保存,最好是動態創建的select
元素:當頁面加載
var monthSelection = document.createElement('select');
var yearSelection = document.createElement('select');
var quartalWrapper = document.createElement('div');
填寫並將其添加到文檔:
window.addEventListener('load',function(){
var monthNames = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var i;
var option;
for(i = 0; i < 12; ++i){
option = document.createElement('option');
option.value = i;
option.appendChild(document.createTextNode(monthNames[i]));
monthSelection.appendChild(option);
}
for(i = firstYear; i <= lastYear; ++i){
option = document.createElement('option');
option.value = i;
option.appendChild(document.createTextNode(i));
yearSelection.appendChild(option);
}
// Append elements to the document
document.getElementById('quartal').appendChild(monthSelection);
document.getElementById('quartal').appendChild(yearSelection);
// Add an event listener
monthSelection.addEventListener('change',updateQuartals);
yearSelection.addEventListener('change',updateQuartals);
});
請請注意,您必須在版本9(?)之前的Internet Explorer中使用attachEvent
或.onload
/.onchange
而不是addEventListener
。您也可以在腳本的開頭創建並填充元素,但在DOM加載之前不能追加它們。
現在,當用戶在任何monthSelection
或yearSelection
updateQuartals
變化值被稱爲:
window.updateQuartals = function(){
var i;
if( oldMonth === monthSelection.value &&
oldYear === yearSelection.value)
{
return;
}
如果quartalWrapper
了我們創建標籤和複選框沒有父節點,因爲這意味着它沒有附加到文件:
if(!quartalWrapper.parentNode){
for(i = 0; i < 3; ++i){
var label = document.createElement('label');
var input = document.createElement('input');
input.type = 'checkbox';
input.name = 'quartal[]';
label.appendChild(input);
label.appendChild(document.createTextNode('Please choose a date'));
quartalWrapper.appendChild(label);
}
document.getElementById('quartal').appendChild(quartalWrapper);
}
然後,我們將更新所有三個兒童標籤和複選框。請注意,label.firstChild
是複選框,而label.lastChild
是我們在上面創建的textNode
。 quartalWrapper.childNodes[i]
實際上是label
之一。
for(i = 0; i < 3; ++i){
var quartals = getQuartals(monthSelection.value);
var year = quartals[i][1] + parseInt(yearSelection.value);
quartalWrapper.childNodes[i].firstChild.value = 'q'+quartals[i][0]+'/'+year;
quartalWrapper.childNodes[i].firstChild.checked = false;
quartalWrapper.childNodes[i].lastChild.data = quartals[i][0]+'Q '+year;
}
};
由於以下quartals對於給定的月份總是被定義我們可以硬編碼它們變成功能getQuartals
:
window.getQuartals = function(month){
var quartArray = [];
if (month < 3)
return [[2,0],[3,0],[4,0]];
if (month < 6)
return [[3,0],[4,0],[1,1]];
if (month < 9)
return [[4,0],[1,1],[2,1]];
return [[1,1],[2,1],[3,1]];
}
注意,第一個值是季,第二個是今年偏移。你也可以計算出這些陣列:
window.getQuartals = function(month){
var quartArray = [];
var i;
month = parseInt(month);
for(i = 0; i < 3; ++i){
month+=3;
quartArray.push([Math.floor(month/3)%4+1,Math.floor(month/12)]);
}
return quartArray;
}
的jsfiddle演示:using hardcoded values,using calculation。
請注意,此解決方案不使用jQuery。如果你想用jQuery隨意更改代碼(使用$()
或.on
而不是addEventListener()
,.append
,...)。
我們需要源代碼來查看到目前爲止所做的工作。一張圖片說超過幾千個字。 – reporter 2012-03-28 13:55:16
是的。這聽起來像你可以創建一個關聯數組,然後將其分配給q3,12月到q4,1月到q1等等。然後每一個都已經有了一年。 – maxhud 2012-03-28 14:04:39
我認爲數組方法可能適用於,在確定哪個季度變量月落入函數後,然後通過顯示陣列中接下來三個的某個邏輯顯示以下三個季度(如果需要,包括明年) – Yasir 2012-03-28 18:02:07