我寫了過濾日期的項目列表的JavaScript/jQuery UI的。
一個<li class="list-group-item listItem" id="0001">
- 一個項目。
每個<input type="hidden" id="01_0001" class="form-control dateItem dataField_0001" value="11/23/2012">
爲每個項目日期。
任務是顯示項目,如果它至少有一個日期是在datepicker的範圍內。 如果沒有一個項目的日期 - 它需要隱藏。
因此,一切正常,但速度很慢。
大約有300個項目和2000個以上的日期,當我的腳本解析數據需要30秒以上。
問題:有什麼方法可以優化我的代碼,或者我應該使用其他任何方法來完成此任務嗎?
請在開機後看小提琴。
最好的問候, 亞歷克斯
想到的/* Create dates +/- 7 for each "from" and "to" fields */
var prevWeek = new Date();
prevWeek.setDate(prevWeek.getDate() - 7);
var prevMonth = (prevWeek.getMonth() + 1);
var prevDay = prevWeek.getDate();
var prevYear = prevWeek.getFullYear();
var prevWeekDate = ((prevMonth < 10 ? '0' : '') + prevMonth + "/" + (prevDay < 10 ? '0' : '') + prevDay + "/" + prevYear);
/*console.log('prevWeekDate =' + prevWeekDate);*/
var nextWeek = new Date();
nextWeek.setDate(nextWeek.getDate() + 7);
var nextMonth = (nextWeek.getMonth() + 1);
var nextDay = nextWeek.getDate();
var nextYear = nextWeek.getFullYear();
var nextWeekDate = ((nextMonth < 10 ? '0' : '') + nextMonth + "/" + (nextDay < 10 ? '0' : '') + nextDay + "/" + nextYear);
/*console.log('nextWeekDate =' + nextWeekDate); */
/*function - datepicker setup*/
$(function() {
$("#from").datepicker({
defaultDate: "-1w",
changeMonth: true,
numberOfMonths: 1,
onClose: function(selectedDate) {
$("#to").datepicker("option", "minDate", selectedDate);
//console.log (selectedDate);
filterDates();
} });
$("#to").datepicker({
defaultDate: "+1w",
changeMonth: true,
numberOfMonths: 1,
onClose: function(selectedDate) {
$("#from").datepicker("option", "maxDate", selectedDate);
//console.log (selectedDate);
filterDates();
} });
});
/*parse date string to array*/
function dateToArray(date) {
var dateArray = date.split('/');
return dateArray;
}
function filterDates() {
var from = dateToArray($('#from').val());
//console.log (from);
var from = new Date(parseInt(from[2], 10),
parseInt(from[0], 10) - 1,
parseInt(from[1], 10));
//console.log (from);
var to = dateToArray($('#to').val());
//console.log (to);
var to = new Date( parseInt(to[2], 10),
parseInt(to[0], 10) - 1,
parseInt(to[1], 10));
//console.log (to);
$('.block').each(function() {
var itemId = $(this).attr('class');
var itemId = itemId.split('_');
var itemId = itemId[1];
var displayBlock = false;
$('.dataField_'+ itemId).each(function() {
var inputValue = $(this).attr('value');
var inputId = $(this).attr('id');
//console.log (inputValue + ' ' +inputId);
var testField = ($(this).attr('value')).split('/');
console.log (testField);
var testField = new Date( parseInt(testField[2], 10),
parseInt(testField[0], 10) - 1,
parseInt(testField[1], 10));
// console.log (testField);
var result = (testField < from || testField > to);
if (!result) { displayBlock = true; }
});
if (displayBlock) {
$('.listItem#' + itemId).removeClass('hideItem');
} else {
$('.listItem#' + itemId).addClass('hideItem');
}
})
}
$(document).ready(function(){
$("#checkAllBox").click(function() {
if ($("#checkAllBox").prop('checked')) {
$(".checkBoxItem").prop("checked", true);
} else {
$(".checkBoxItem").prop("checked", false);
}
});
$("#from").val(prevWeekDate);
$("#to").val(nextWeekDate);
$("#dialog").dialog({
autoOpen: false,
width: 600,
position:['middle',120],
});
$(".startDialog").click(function() {
$("#dialog").dialog("open");
});
filterDates();
$('.listItem').click(function(){
var itemId = $(this).attr('id');
console.log (itemId);
});
})
請在此處發佈您的代碼,而不僅僅是小提琴的鏈接。 – Barmar
經驗法則是,如果您在函數中多次發現$(this),請緩存該對象以減少額外的函數調用,以創建一個您已經創建並扔掉的新jQuery對象。與任何重複選擇符一樣var $ this = $(this)'...'$ this.doSomething()'..also ....'this.id&this.value'比'attr() '因爲它們是本地屬性。這些不會對你的代碼有很大的改進,但是有點幫助 – charlietfl
感謝這一點。我將更多地瞭解緩存。 – A1exandr