JavaScript / jQuery可以做一些改进

时间:2010-01-14 03:15:03

标签: javascript jquery datetime filter

我正在删除我为时间帧选择器函数编写的一些代码,该函数根据选定的时间范围(上个月,上一季度和去年)过滤搜索结果,隐藏所有不相关的结果什么时候创建它们。该函数由表单提交?time_frame_query=Last+Month

上提交的GET变量调用

现在代码正常工作,这是一个开始。但是我觉得它可以大大改进,不幸的是我已经用尽了所有尝试自己做的选择。我遇到的问题是,当我编写去年过滤器的函数时,我不得不编写大量的代码,我觉得这并不是完全必要的。我已经玩弄了将所有月份变量放入数组然后将特定的“上个月”“上一季度”“去年”功能放在一起的想法,它将为我完成工作。但是,鉴于我目前对JS / jQuery的了解,我根本不知道如何去做这件事。

以下是我认为与我的问题相关的代码片段,也有助于说明我面临的问题。如果您需要再看,请告诉我。

编辑:感谢Doug,可以在此处找到整个工作代码:http://pastie.org/private/wl2qvnyar5xpibu4ot1lig

非常感谢任何帮助/建议。

var timezone = "Australia/ACT";
$.getJSON("http://json-time.appspot.com/time.json?tz="+timezone+"&callback=?",
  function(data){
    var datetime = data.datetime
      var date = datetime.split(" ")
      var day = date[1]
      var month = date[2]
      var year = date[3]
      var prevYear = year - 1
      var jan = 'Jan'
      //etc etc etc
      var dec = 'Dec'
      var timeFrame = $.getUrlVar('time_frame_query');
      switch(timeFrame){
      //****************************
      // Begin Last Quarter function
      //****************************
      case 'Last+Quarter': 
        switch(month){
          case 'Jan':
            $('#searchResults div.'+oct+prevYear+',#searchResults div.'+nov+prevYear+',#searchResults div.'+dec+prevYear+',#searchResults div.'+jan+year).show();
            break;
          case 'Feb':
            $('#searchResults div.'+nov+prevYear+',#searchResults div.'+dec+prevYear+',#searchResults div.'+jan+year+',#searchResults div.'+feb+year).show();
            break;
          case 'Mar':
            $('#searchResults div.'+dec+prevYear+',#searchResults div.'+jan+year+',#searchResults div.'+feb+year+',#searchResults div.'+mar+year).show();
            break;
          case 'Apr':
            $('#searchResults div.'+jan+year+',#searchResults div.'+feb+year+',#searchResults div.'+mar+year+',#searchResults div.'+apr+year).show();
            break;
            // etc etc etc
        }
        break;

对于上面格式错误的代码的应用,首先提交到此站点。 WYSIWYG FTL! :(

2 个答案:

答案 0 :(得分:1)

尝试datejs,解析日期字符串并返回实际日期的库。它非常灵活,可以理解上一个/下一个概念。它不知道什么季度,所以你可能需要调整它,如果我没有弄错的话,有一个API。

答案 1 :(得分:1)

好的,这是我最好的拍摄我有多累啊:)一般情况下。你需要以分号结束每一行,这非常重要。此外,我的代码假定为四位数年份(2009年对09年)。没有你的网站的其余部分,很难测试。如果您有任何疑问,请与我们联系:

$(document).ready(function(){
  $.extend({
    getUrlVars: function(){
      var vars = [], hash;
      var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
      for(var i = 0; i < hashes.length; i++)
      {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
      }
      return vars;
    },
    getUrlVar: function(name){
      return $.getUrlVars()[name];
    }
  });
  var timezone = "Australia/ACT";
  $.getJSON("http://json-time.appspot.com/time.json?callback=?",
    { tz: timezone },
    function(data) {
      var datetime   = data.datetime,
          date       = datetime.split(" "),
          month      = date[2],
          year       = date[3],
          months     = ['Jan', 'Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
          curr_month = $.inArray(month, months), // Zero based return
          curr       = new Date(year, curr_month),
          time_frame = $.getUrlVar('time_frame_query');

      $('#searchResults p.report-date').each(function(){
        var reportDate  = $(this).text(),
            dateExtract = reportDate.split(" "),
            month       = dateExtract[1],
            year        = dateExtract[2];

        $(this).parent().addClass(month + year).hide();
      });

      var buildSelector = function(date) {
          return "div." + months[date.getMonth()] + date.getFullYear();
      }

      var selectorRange = function(monthStart, monthRange, yearStart){
        var range = [];
        for(var i = monthRange; i <= 0; i++){
          range.push( buildSelector(new Date(yearStart, monthStart + i)));
        };
        return range;
      }

      var searchResults = $('#searchResults')[0];

      switch(time_frame){
        case 'Last+Month': 
          $( selectorRange( curr_month, -1, year).join(), searchResults ).show();
          break;

        case 'Last+Quarter': 
          $( selectorRange( curr_month, -3, year).join(), searchResults ).show();
          break;

        case 'Last+Year':
          $( selectorRange( curr_month, -12, year).join(), searchResults ).show();
          break;
      }
    });
});