JavaScript / JQuery может сделать с некоторыми улучшениями - PullRequest
2 голосов
/ 14 января 2010

Я нахожусь в процессе извлечения некоторого кода, который я написал для функции выбора таймфреймов, которая фильтрует результаты поиска на основе выбранного таймфрейма (последний месяц, последний квартал и последний год), скрывая все не относящиеся к делу результаты на основе когда они были созданы. Функция вызывается переменной GET, отправленной в форме submit ?time_frame_query=Last+Month

Теперь код работает, и это только начало. Однако я чувствую, что это может быть значительно улучшено, и, к сожалению, я исчерпал все варианты, пытаясь сделать это самостоятельно. Проблема, с которой я сталкиваюсь, заключается в том, что к тому времени, когда я пишу функции для фильтра «Прошлый год», мне приходится писать огромное количество кода, который, я считаю, не совсем необходим. Я поиграл с идеей поместить все переменные месяца в массив, а затем собрать определенную функцию «Последний месяц», «Последний квартал» и «Последний год», которая будет выполнять эту работу за меня. Но, опять же, учитывая мои текущие знания JS / jQuery, я просто не знаю, как это сделать.

Ниже приведен фрагмент кода, который, по моему мнению, имеет отношение к моему вопросу, а также помогает проиллюстрировать проблему, с которой я сталкиваюсь. Пожалуйста, дайте мне знать, если вам нужно больше.

РЕДАКТИРОВАТЬ: Благодаря Дагу весь рабочий код можно найти здесь: 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 ]

1 голос
/ 14 января 2010

ОК, вот мой лучший снимок того, как я устала. Вы должны заканчивать каждую строку точкой с запятой, это действительно важно. Кроме того, мой код предполагает четырехзначный год (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;
      }
    });
});
1 голос
/ 14 января 2010

Попробуйте datejs , библиотека, которая анализирует строки даты и возвращает фактические даты. Это действительно гибко и понять последнюю / следующую концепцию. Он не знает, что такое четверть, хотя, возможно, вам придется его настроить, есть API, если я не ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...