zoukankan      html  css  js  c++  java
  • JGUI源码:JS菜单动态绑定(8)

    我们知道Jquery绑定事件后的新添加的对象是不响应事件的,为了解决这个问题,动态添加的对象需要从新绑定,使用一个init方法实现代码如下

    //Accordion封装
    (function($) {
      J.Accordion = function($p_selector) {
        init = function(p_options, p_datas, p_param) {
          return $p_selector.each(function() {
            var $accordion = $(this);
            var datas = $accordion.extend(
              {
                _sumdelta: 0,
                _mouseintervalhandle: undefined,
                _startmousewheeldatetime: null
              },
              p_datas
            );
            var events = {
              onNavItemClick: undefined
            };
            $accordion.data("datas", datas);
            $accordion.data("events", events);
            //Accordion目录点击绑定
            $accordion.find("dt.jgui-accordion-navitem").unbind("click"); //先解绑
            $accordion.find("dt.jgui-accordion-navitem").click(function(event) {
              var $accordionnavitem = $(this);
              if ($accordion.data("events").onNavItemClick != undefined) {
                var ret = $accordion.data("events").onNavItemClick(this);
                if (ret == false) return;
              }
              $accordionnavitem.removeClass("selected");
              $accordionnavitem.siblings("dd").slideToggle(300, function() {
                if ($(this).is(":hidden")) {
                  $(this)
                    .siblings("dt")
                    .children()
                    .children(".jgui-accordion-navitem-more")
                    .removeClass("expanded", 0);
                } else {
                  $(this)
                    .siblings("dt")
                    .children()
                    .children(".jgui-accordion-navitem-more")
                    .addClass("expanded", 0);
                }
              });
              $accordionnavitem
                .closest(".jgui-accordion")
                .find(".jgui-accordion-navitem")
                .removeClass("selected");
              $accordionnavitem
                .closest(".jgui-accordion")
                .find(".jgui-accordion-navitem-child")
                .removeClass("selected");
              $accordionnavitem.addClass("selected");
              stopPropagation(event);
            });
            //Accordion内容条目点击绑定
            $accordion.find(".jgui-accordion-navitem-child").unbind("click");
            $accordion.find(".jgui-accordion-navitem-child").click(function(event) {
              var $accordionnavitemchild = $(this);
              $accordionnavitemchild
                .closest(".jgui-accordion")
                .find(".jgui-accordion-navitem")
                .removeClass("selected");
              $accordionnavitemchild
                .closest(".jgui-accordion")
                .find(".jgui-accordion-navitem-child")
                .removeClass("selected");
              $accordionnavitemchild.addClass("selected");
              stopPropagation(event);
            });
            //手机端鼠标拖动事件,手机端可以屏蔽下面改成用css3隐藏滚动条,毕竟手机端不用考虑兼容性
            $accordion.unbind("touchstart");
            $accordion.on("touchstart", function(e) {
              startY = e.originalEvent.changedTouches[0].pageY;
            });
            $accordion.unbind("touchmove");
            $accordion.on("touchmove", function(e) {
              e.preventDefault();
              (moveEndY = e.originalEvent.changedTouches[0].pageY),
                (Y = moveEndY - startY);
              startY = moveEndY;
              var cur_top = $accordion.scrollTop(); //当前滚过的高度
              $accordion.stop().animate({ scrollTop: -Y + cur_top }, 0);
            });
          });
        };
        //折叠成工具条样式
        fold = function() {
          return $p_selector.each(function() {
            var $accordion = $(this);
            $accordion
              .find(".jgui-accordion-navitem")
              .siblings("dd")
              .slideUp();
            $accordion.find(".jgui-accordion-navitem span").hide();
            $accordion
              .find(".jgui-accordion-navitem .jgui-accordion-navitem-more")
              .hide();
          });
        };
        //展开成面板样式
        unfold = function() {
          return $p_selector.each(function() {
            var $accordion = $(this);
            $accordion
              .find(".jgui-accordion-navitem-more.expanded")
              .closest(".jgui-accordion-navitem")
              .siblings("dd")
              .slideDown();
            $accordion.find(".jgui-accordion-navitem span").show();
            $accordion
              .find(".jgui-accordion-navitem .jgui-accordion-navitem-more")
              .show();
          });
        };
        return {
          init: init,
          fold: fold,
          unfold: unfold
        };
      };
    })(J.$); 

    当使用ajax向according里添加html数据后,可以调用一次init即可实现从新绑定(先unbind,再bind)。

    示例:J.Accordion($(".jgui-accordion")).init();

    如果后期优化,可以判断哪些绑定过的不再绑定。另外为了通知外部页面点击了NavItem操作,做了一个回调函数

      //NavItem点击事件
     var events = $('#menuaccordion').data("events");
     events.onNavItemClick=function (obj)
      {
          if (!$("#leftpanel").is(".unfold")) {//折叠状态展开
            $("#leftpanel").width(300);
            $("#centerpanel").css("left", "300px");
            $("#mainlogo").html("JGUI DEMO");
            J.Accordion($(obj).closest(".jgui-accordion")).unfold();
            $("#leftpanel").toggleClass("unfold");
            $("#folderbtn").toggleClass("icon-menu-unfold icon-menu-fold");
            return false;
          }
      };

    这样就可以在外部响应点击事件。

  • 相关阅读:
    Windows2003 Webshell默认权限
    Windows安装Centos7双系统后Windows启动项消失
    GCC编译流程及常用编辑命令
    swoole的websockte例子
    PhpStorm 增加Swoole智能提示
    Centos7/RHEL 7 配置静态路由
    webpack介绍和使用
    Webpack中的sourcemap以及如何在生产和开发环境中合理的设置
    什么是 PWA
    php实现excel单元格合并,字体加粗居中等操作
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/10447251.html
Copyright © 2011-2022 走看看