JavaScript/jQuery可以做一些改进

JavaScript/jQuery可以做一些改进,javascript,jquery,datetime,filter,Javascript,Jquery,Datetime,Filter,我正在剥离我为时间框架选择器函数编写的一些代码,该函数根据选定的时间框架(上个月、上个季度和去年)过滤搜索结果,方法是根据创建时间隐藏所有不相关的结果。函数由表单submit上提交的GET变量调用?time\u frame\u query=Last+Month 现在代码按原样工作,这是一个开始。然而,我觉得它可以大大改善,不幸的是,我已经用尽了所有的选择试图这样做自己。我遇到的问题是,当我开始为去年的过滤器编写函数时,我不得不编写大量的代码,我觉得这些代码并不是完全必要的。我曾想过将所有月份变量

我正在剥离我为时间框架选择器函数编写的一些代码,该函数根据选定的时间框架(上个月、上个季度和去年)过滤搜索结果,方法是根据创建时间隐藏所有不相关的结果。函数由表单submit
上提交的GET变量调用?time\u frame\u query=Last+Month

现在代码按原样工作,这是一个开始。然而,我觉得它可以大大改善,不幸的是,我已经用尽了所有的选择试图这样做自己。我遇到的问题是,当我开始为去年的过滤器编写函数时,我不得不编写大量的代码,我觉得这些代码并不是完全必要的。我曾想过将所有月份变量放入一个数组中,然后将一个特定的“Last month”、“Last Quarter”、“Last Year”函数组合在一起,这个函数将为我完成这项工作。但是再一次考虑到我目前对JS/jQuery的了解,我根本不知道该怎么做

下面是一段代码,我觉得这段代码与我的问题相关,也有助于说明我所面临的问题。如果你还需要看的话,请告诉我

编辑:多亏了Doug,整个工作代码可以在这里找到:

如有任何帮助/建议,将不胜感激

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;

对于上述格式不良的代码,请首先提交到此站点。所见即所得FTL!:(

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

好的,这是我最能说明我有多累的方法:)一般来说有几件事。你需要用分号来结束每一行,这非常重要。此外,我的代码假设年份为四位数(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;
      }
    });
});
$(文档).ready(函数(){
$扩展({
getUrlVars:function(){
var vars=[],散列;
var hashes=window.location.href.slice(window.location.href.indexOf('?')+1).split('&');
for(var i=0;i对于(var i=monthRange;i Hey Josh,你能将整个代码发布到,保存它,并将链接粘贴到评论中吗?它当然可以优化。但更容易看到整个内容。嘿,Doug,谢谢你指出pastie.org!这是你可以看到的链接,我甚至没有尝试编辑“去年”在意识到我必须把基本上相同的代码打12遍之后,函数。很酷,现在就看一遍。正如我所理解的,“上一季度”不是真正的“财政季度”这仅仅是过去的三个月。这就是你想要的吗?没错,道格,如果还有什么不清楚的地方,请告诉我。此外,你很可能会注意到代码本身中的一些新手错误,可以说我还没有松开我的JavaScript训练轮。看起来很有希望。感谢链接Vava。但是,我不会uld希望避免向站点添加额外的JS库。这将作为最后的手段。我感谢您的输入。好的,只是对它进行了测试。在第37行,您忘记了更新$(This.parent().addClass(m+y).hide()的变量
。没有问题,尽管我只是简单地添加了正确的变量来解决这个问题,但不幸的是,现在firebug抛出了以下错误:错误:未捕获异常:[异常…“无法转换JavaScript参数arg 0”nsresult:“0x80570009(NS_error\u XPC\u BAD\u convert\u JS)”位置:“JS frame::::匿名::第22行”数据:否],有什么想法吗?非常感谢你的帮助,道格!:)好的,除了你发现的错误之外,我在代码中还发现了一个错误(我也修复了这个错误)。试试这个,虽然我担心它仍然会抛出同样的错误。但至少我们可以缩小它的范围。然后让我知道!嗯,是的,同样的错误,我刚刚尝试了另一个版本的jQuery插件jQuery-1.3.2.min,它现在返回以下错误:this[H].style是未定义的源文件:jquery-1.3.2.min.js行:19我会继续挖掘,看看我发现了什么。我有一个想法,这是我用来测试这个脚本的整个页面源代码,在它被实现到一个实时站点之前。只是为了让你知道它是如何工作的。希望它有帮助。太棒了……制作一些食物,我会看看。嘘我能在几分钟内让它工作。谢谢!