ホームページ > ウェブフロントエンド > jsチュートリアル > JSON無限折りたたみメニュー作成例_JavaScriptスキル

JSON無限折りたたみメニュー作成例_JavaScriptスキル

WBOY
リリース: 2016-05-16 17:08:59
オリジナル
1417 人が閲覧しました

最近、JSON の無限折りたたみメニューに関する記事を読み、よく書かれていると思い、コードも勉強したので、独自のコーディング方法を使用してデモも作成しました。実際、そのようなメニュー項目は Web サイトまたはプロジェクトにあります。ナビゲーション メニュー項目。特に一部の電子商取引 Web サイトでは、左側にカテゴリがあることもよくあります。また、ナビゲーション メニューにドロップダウン効果があることもよくあります。つまり、ページ上のコードは直接書き込まれます。そして、そのドロップダウン効果を実現するために、今日では JSON 形式を通じてドロップダウン効果を自動的に生成します。つまり、この折りたたみメニュー効果を実現するためであると言えます。必要なのは、開発者がフロントエンド開発用の JSON 形式を提供することだけです。そうでない場合は、フロントエンドがそのような形式を設定できます。他のものはすべて、このコードを直接参照できます。私の JS コードを共有しましょう。

次のように具体的な効果を見てみましょう:

JSON無限折りたたみメニュー作成例_JavaScriptスキル

JSON 形式がどのようなものかを見てみましょう。形式は次のとおりです。

コードをコピー コードは次のとおりです:

var testmenu = [
"" サブメニュー ": [
{
" 名前 ":" レベル 4 メニュー ",
" URL ":"
}

},
}
「セカンドメニュー」,
"url": ""
}、
"name": "3番目のレベルのメニュー"、
"submenu":[
""
🎜> "submenu":[
"name": "5レベルのメニュー"、
" name ":" 5レベルのメニュー "、
]
、、
: "Second Level Menu"、
"url": ""
}
]
}、 "name": "First Level Menu"、
"サブメニュー」: [
」 🎜> "名前": "第 2 レベルのメニュー ",
"url": ""


}
];


この JSON 形式が問題なく、上記のパラメータ名サブメニュー URL がこの名前である限り、次のようにページ HTML に直接追加できます。





コードをコピー


コードは次のとおりです:





CSS コードは次のとおりです:

コードをコピー コードは次のとおりです:CSS スタイルを自分で設定できれば問題ありません。 JS コードは次のとおりです:



コードをコピー


コードは次のとおりです:

/**
 * JSON无限折叠菜单
 * @constructor {AccordionMenu}
 * @param {options} 对象
 * @date 2013-12-13
 * @author tugenhua
 * @email 879083421@qq.com
 */

 function AccordionMenu(options) {
    this.config = {
        containerCls        : '.wrap-menu',                // 外层容器
        menuArrs            :  '',                         //  JSON传进来的数据
        type                :  'click',                    // 默认为click 也可以mouseover
        renderCallBack      :  null,                       // 渲染html结构后回调
        clickItemCallBack   : null                         // 每点击某一项时候回调
    };
    this.cache = {

    };
    this.init(options);
 }


 AccordionMenu.prototype = {

    constructor: AccordionMenu,

    init: function(options){
        this.config = $.extend(this.config,options || {});
        var self = this,
            _config = self.config,
            _cache = self.cache;

        // 渲染html结构
        $(_config.containerCls).each(function(index,item){

            self._renderHTML(item);

            // 处理点击事件
            self._bindEnv(item);
        });
    },
    _renderHTML: function(container){
        var self = this,
            _config = self.config,
            _cache = self.cache;
        var ulhtml = $('

    ');
            $(_config.menuArrs).each(function(index,item){
                var lihtml = $('
  • '+item.name+'

  • ');

                if(item.submenu && item.submenu.length > 0) {
                    self._createSubMenu(item.submenu,lihtml);
                }
                $(ulhtml).append(lihtml);
            });
            $(container).append(ulhtml);

            _config.renderCallBack && $.isFunction(_config.renderCallBack) && _config.renderCallBack();

            // 处理层级缩进
            self._levelIndent(ulhtml);
        },
        /**
         * 创建子菜单
         * @param {array} 子菜单
         * @param {lihtml} li项
         */
        _createSubMenu: function(submenu,lihtml){
            var self = this,
                _config = self.config,
                _cache = self.cache;
            var subUl = $('

      '),
                  callee = arguments.callee,
                  subLi;

              $(submenu).each(function(index,item){
                  var url = item.url || 'javascript:void(0)';

                  subLi = $('

    • '+item.name+'
    • ');
                  if(item.submenu && item.submenu.length > 0) {

                      $(subLi).children('a').prepend('');
                      callee(item.submenu, subLi);
                  }
                  $(subUl).append(subLi);
              });
              $(lihtml).append(subUl);
          },
          /**
           * 处理层级缩进
           */
          _levelIndent: function(ulList){
              var self = this,
                  _config = self.config,
                  _cache = self.cache,
                  callee = arguments.callee;

              var initTextIndent = 2,
                  lev = 1,
                  $oUl = $(ulList);

              while($oUl.find('ul').length > 0){
                  initTextIndent = parseInt(initTextIndent,10) + 2 + 'em';
                  $oUl.children().children('ul').addClass('lev-' + lev)
                              .children('li').css('text-indent', initTextIndent);
                  $oUl = $oUl.children().children('ul');
                  lev++;
              }
              $(ulList).find('ul').hide();
              $(ulList).find('ul:first').show();   
          },
          /**
           * 绑定事件
           */
          _bindEnv: function(container) {
              var self = this,
                  _config = self.config;

      $('h2,a',container).unbind(_config.type);
      $('h2,a',container).bind(_config.type,function(e){
      if ($(this).siblings('ul').length > 0) {
      $(this).siblings('ul').slideToggle('slow').end().children('img' ).toggleClass('unfold');
      }


      });
      }

      };



      コードの初期化メソッドは次のとおりです:


      コードをコピー コードは次のとおりです。$(function(){
      new AccordionMenu( {menuArrs:testMenu});
      });


      上記の JSON 形式を自分で定義して、私の CSS JS を引用することもできます。独自の CSS を持っています。スタイルも CSS スタイルで書き換えることができます。やめてください! JSON 形式は上で述べたものと同じでなければならず、名前も同じである必要があります。問題ありません。上記のような初期化
      new AccordionMenu({menuArrs:testMenu}); ここで、testMenu は上で定義した JSON 形式です。

      JSON 無限折りたたみメニューのデモのダウンロード

      関連ラベル:
      ソース:php.cn
      このウェブサイトの声明
      この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
      人気のチュートリアル
      詳細>
      最新のダウンロード
      詳細>
      ウェブエフェクト
      公式サイト
      サイト素材
      フロントエンドテンプレート