如何在opencart过滤器模块中包含AJAX?

时间:2016-06-04 04:33:38

标签: jquery ajax opencart2.x

我正在使用Opencart 2.2.0.0,并搜索任何代码示例以在过滤器模块中包含AJAX。

我试过以下代码。它有效但经过一些选项检查后变得很慢

$().ready(function(){
 function init() {
  var $content  = $('#content').css('position', 'relative');

  if( ! $content.length )
   return;

  var $productFilter = $content.find('.product-filter');
  //var $productList = $content.find('.product-list');

  function createParams( url, o ) {
   var p = url.split('?')[1];

   if( typeof o == 'undefined' )
    o = {};

   if( typeof p != 'undefined' ) {
    p = p.replace(/&/g, '&');
    p = p.split('&');

    for( var i = 0; i < p.length; i++ ) {
     var key = p[i].split('=')[0];
     var val = p[i].split('=')[1];

     if( typeof key != 'undefined' && typeof val != 'undefined' )
      o[key] = val;
    }
   }

   return o;
  }

  function createLoader() {
   var top = $productFilter.length ? $productFilter.offset().top +     $productFilter.height() - 20 : $content.height() / 4;

   if( $content.offset().top + top + 80 > $content.offset().top + $content.height() )
    top -= 80;

   return $('<i>')
    .css({
     'display' : 'block',
     'position' : 'absolute',
     'z-index' : '9',
     'width'  : $content.outerWidth() + 'px',
     'height' : $content.outerHeight() + 'px',
     'background': 'rgba(255,255,255,0.5)',
     'text-align': 'center',
     'padding' : '0',
     'margin' : '0',
     'cursor' : 'wait'
    })
    .append($('<img>')
     .attr( 'src', 'catalog/view/theme/default/image/ajax-loading.gif' )
     .css('margin-top', top + 'px')
    )
    .prependTo( $content );
  }

  var remembers  = [ 'limit', 'sort' ];
  var url   = document.location.href;
  var params  = createParams( url );
  var isLocked  = false;

  $productFilter.find('select').unbind('change').removeAttr('onchange').bind('change', function(){
   params = createParams( $(this).val(), params );

   ajax();

   return false;
  });

  $('.pagination a').bind('click', function(){
   params = createParams( $(this).attr('href'), params );

   ajax();

   return false;
  });

  $('#button-search').unbind('click').bind('click', function(){
   var hasFilter = false;

   function _set( $this ) {
    var name = $this.attr('name');
    var value = $this.val();

    if( $this.prop('tagName').toLowerCase() == 'input' ) {
     switch( $this.attr('type') ) {
      case 'checkbox' :
      case 'radio' : {
       if( ! $this.is(':checked') )
        value = '';
      }
     }
    }

    params[name] = value;
   }

   $content.find('[name^="filter_"]').each(function(){
    _set( $(this) );

    hasFilter = true;
   });

   if( ! hasFilter ) {
    $content.find('[name="search"],[name="category_id"],[name="description"]').each(function(){
     _set( $(this) );
    });
   }

   ajax();

   return false;
  }).each(function(){
   var $input = $content.find('input[name="filter_name"]');

   if( ! $input.length )
    $content.find('input[name="search"]');

   $content.unbind('keydown').bind('keydown', function(e){
    if( e.keyCode == 13 ){
     $('#button-search').trigger('click');

     return false;
    }

    return true;
   });
  });


  $(".checkbox").change(function() {

   var filter = [];
if(this.checked) {

    filter.push( $(this).val() );
    params['filter'] = filter.join(',');
}

   ajax();
   return false;
});

  function ajax() {
   if( isLocked )
    return;

   isLocked = true;

   // aktywuj loader
   var loader  = createLoader();
   var response = null;
   var ready  = false;
   var interval = setInterval(function(){
    onLoad();
   }, 100);

   $('html, body').animate({
    scrollTop: $productFilter.length ? $productFilter.offset().top : $content.offset().top
   }, 800).promise().done(function(){
    clearInterval( interval );

    ready = true;

    setTimeout(function(){
     onLoad();
    }, 100);
   });

   function onLoad() {
    if( response === null || ! ready )
     return;

    clearInterval( interval );

    loader.remove();
    isLocked = false;

    var contents = $('<div>').append( response ).find('#content > *');

    /*if( ! contents.length ) {
     contents = $("<div>").append( response ).find("#content-center > *");

     $content = $('#content-center');
    }*/

    if( contents.length ) {
     $content.html( contents );

     if( typeof display == 'function' ) {
      var dis = null;

      if( typeof $.cookie == 'function' )
       dis = $.cookie('display');

      if( ! dis && typeof $.totalStorage == 'function' )
       dis = $.totalStorage('display');

      if( dis )
       display( dis );
     }
    } else {
     window.location.href = url;
    }

    init();
   }

   $.ajax({
    'type'  : 'GET',
    'data'  : params,
    'url'  : url.split('?')[0],
    'cache'  : false,
    'timeout' : 10000,
    'success' : function( res ) {
     response = res;
    },
    'error'  : function() {
     window.location.href = url;
    }
   });
  }
 }

 init();
});

0 个答案:

没有答案