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

  1. //Accordion封装
  2. (function($) {
  3. J.Accordion = function($p_selector) {
  4. init = function(p_options, p_datas, p_param) {
  5. return $p_selector.each(function() {
  6. var $accordion = $(this);
  7. var datas = $accordion.extend(
  8. {
  9. _sumdelta: 0,
  10. _mouseintervalhandle: undefined,
  11. _startmousewheeldatetime: null
  12. },
  13. p_datas
  14. );
  15. var events = {
  16. onNavItemClick: undefined
  17. };
  18. $accordion.data("datas", datas);
  19. $accordion.data("events", events);
  20. //Accordion目录点击绑定
  21. $accordion.find("dt.jgui-accordion-navitem").unbind("click"); //先解绑
  22. $accordion.find("dt.jgui-accordion-navitem").click(function(event) {
  23. var $accordionnavitem = $(this);
  24. if ($accordion.data("events").onNavItemClick != undefined) {
  25. var ret = $accordion.data("events").onNavItemClick(this);
  26. if (ret == false) return;
  27. }
  28. $accordionnavitem.removeClass("selected");
  29. $accordionnavitem.siblings("dd").slideToggle(300, function() {
  30. if ($(this).is(":hidden")) {
  31. $(this)
  32. .siblings("dt")
  33. .children()
  34. .children(".jgui-accordion-navitem-more")
  35. .removeClass("expanded", 0);
  36. } else {
  37. $(this)
  38. .siblings("dt")
  39. .children()
  40. .children(".jgui-accordion-navitem-more")
  41. .addClass("expanded", 0);
  42. }
  43. });
  44. $accordionnavitem
  45. .closest(".jgui-accordion")
  46. .find(".jgui-accordion-navitem")
  47. .removeClass("selected");
  48. $accordionnavitem
  49. .closest(".jgui-accordion")
  50. .find(".jgui-accordion-navitem-child")
  51. .removeClass("selected");
  52. $accordionnavitem.addClass("selected");
  53. stopPropagation(event);
  54. });
  55. //Accordion内容条目点击绑定
  56. $accordion.find(".jgui-accordion-navitem-child").unbind("click");
  57. $accordion.find(".jgui-accordion-navitem-child").click(function(event) {
  58. var $accordionnavitemchild = $(this);
  59. $accordionnavitemchild
  60. .closest(".jgui-accordion")
  61. .find(".jgui-accordion-navitem")
  62. .removeClass("selected");
  63. $accordionnavitemchild
  64. .closest(".jgui-accordion")
  65. .find(".jgui-accordion-navitem-child")
  66. .removeClass("selected");
  67. $accordionnavitemchild.addClass("selected");
  68. stopPropagation(event);
  69. });
  70. //手机端鼠标拖动事件,手机端可以屏蔽下面改成用css3隐藏滚动条,毕竟手机端不用考虑兼容性
  71. $accordion.unbind("touchstart");
  72. $accordion.on("touchstart", function(e) {
  73. startY = e.originalEvent.changedTouches[0].pageY;
  74. });
  75. $accordion.unbind("touchmove");
  76. $accordion.on("touchmove", function(e) {
  77. e.preventDefault();
  78. (moveEndY = e.originalEvent.changedTouches[0].pageY),
  79. (Y = moveEndY - startY);
  80. startY = moveEndY;
  81. var cur_top = $accordion.scrollTop(); //当前滚过的高度
  82. $accordion.stop().animate({ scrollTop: -Y + cur_top }, 0);
  83. });
  84. });
  85. };
  86. //折叠成工具条样式
  87. fold = function() {
  88. return $p_selector.each(function() {
  89. var $accordion = $(this);
  90. $accordion
  91. .find(".jgui-accordion-navitem")
  92. .siblings("dd")
  93. .slideUp();
  94. $accordion.find(".jgui-accordion-navitem span").hide();
  95. $accordion
  96. .find(".jgui-accordion-navitem .jgui-accordion-navitem-more")
  97. .hide();
  98. });
  99. };
  100. //展开成面板样式
  101. unfold = function() {
  102. return $p_selector.each(function() {
  103. var $accordion = $(this);
  104. $accordion
  105. .find(".jgui-accordion-navitem-more.expanded")
  106. .closest(".jgui-accordion-navitem")
  107. .siblings("dd")
  108. .slideDown();
  109. $accordion.find(".jgui-accordion-navitem span").show();
  110. $accordion
  111. .find(".jgui-accordion-navitem .jgui-accordion-navitem-more")
  112. .show();
  113. });
  114. };
  115. return {
  116. init: init,
  117. fold: fold,
  118. unfold: unfold
  119. };
  120. };
  121. })(J.$);

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

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

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

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

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

JGUI源码:JS菜单动态绑定(8)的更多相关文章

  1. JGUI源码:从头开始,建一个自己的UI框架(1)

    开篇 1.JGUI是为了逼迫自己研究底层点的前端技术而做的框架,之前对web底层实现一直没有深入研究,有了技术瓶颈,痛定思痛从头研究, 2.虽然现在vue技术比较火,但还在发展阶段,暂时先使用JQue ...

  2. JGUI源码:鼠标中键滚动再次优化(5)

    //电脑端中键滚动事件 var mousewheel = getBrowserInfo() == "Firefox" ? "DOMMouseScroll" : ...

  3. JGUI源码:Accordion鼠标中键滚动和手机端滑动实现(2)

    本文是抽屉组件在PC端滚动鼠标中键.手机端滑动时,滚动数据列表实现方法,没有使用iscroll等第三方插件,支持火狐,谷歌,IE8+等浏览器. 演示在:www.jgui.com Github地址:ht ...

  4. JGUI源码:右键菜单实现(12)

    1.要想实现右键菜单,就要先能响应右键函数 $('#down').mousedown(function(e){ if(3 == e.which){ alert('这是右键单击事件'); }else i ...

  5. JGUI源码:实现图标按钮及下拉菜单(16)

    效果如下 代码片段如下 <div class="jgui-btn" id="personalbtn" style="float:right;&q ...

  6. JGUI源码:组件及函数封装方法(7)

    以Accordion为例1.在base.js定义一个对象,这样可以和JQuery对象区分开,用户使用组件时比较清晰一点,也可以在这里引用多个库. var JGUI = J = { version : ...

  7. JGUI源码:实现简单MVVM单项绑定学习笔记(15)

    前面几节都是jquery界面方面的东西,本节研究些数据方面的东西:MVVM. MVVM由三部分组成:Model <=> ViewModel <=> View,当Model数据改 ...

  8. JGUI源码:响应式布局简单实现(13)

    首先自我检讨下,一直没有认真研究过响应式布局,有个大致概念响应式就是屏幕缩小了就自动换行或者隐藏显示,就先按自己的理解来闭门造车思考实现过程吧. 1.首先把显示区域分成12等分,bootstrap是这 ...

  9. JGUI源码:Accordion折叠到侧边栏实现(6)

    折叠和非折叠效果如左右图所示 代码如下 //折叠 $.fn.jAccordionfold = function() { return this.each(function() { var obj = ...

随机推荐

  1. 【转】网页禁止后退键BackSpace的JavaScript实现(兼容IE、Chrome、Firefox、Opera)

    var forbidBackSpace = function (e) { // 获取event对象 var ev = e || window.event; // 获取事件源 var obj = ev. ...

  2. android测试用例编写

    说明:android中写测试用例也是用junit,测试用例代码风格是junit3的风格.java中测试用例中使用junit3需要继承TestCase(junit4则不需要,直接用annotation即 ...

  3. kvm热添加和热迁移

    a.热添加磁盘 1.创建磁盘 qemu-img create -f qcow2 web01-add01.qcow2 5G 2.附加磁盘设备 virsh attach-disk web01 /opt/w ...

  4. 一文读懂 JAVA 异常处理

    JAVA 异常类型结构 Error 和 Exeption 受查异常和非受查异常 异常的抛出与捕获 直接抛出异常 封装异常并抛出 捕获异常 自定义异常 try-catch-finally try-wit ...

  5. LA3971 组装电脑

    思路:二分,就是在不超过b的预算下,使得品质的最小值最大化.关键还是判断函数吧. 假设答案为x,判断函数,就是每一个种类的配件的品质最基本的品质要大于x,然后找出最小的值.这样的配件品质之和的价格要小 ...

  6. Python--day11(函数的参数)

    今日主要内容 1.  函数的参数 2.  函数的嵌套调用 1.  形参与实参 1.  参数介绍: 函数为什么要有参数:因为内部的函数体需要外部的数据 怎样定义函数的参数:在定义函数阶段,函数名在后面( ...

  7. 关于win7+VS2017环境下的opencv-contirb配置的一个坑

    问题出现背景: 由于课题需要用到SURF detector, 我依照网上的一下教程,把opencv-contrib的配置了一遍.但是,当我写了一个小demo来测试模块是否能正常使用的时候,程序能正常编 ...

  8. Python----支持向量机SVM

    1.1. SVM介绍 SVM(Support Vector Machines)——支持向量机.其含义是通过支持向量运算的分类器.其中“机”的意思是机器,可以理解为分类器. 1.2. 工作原理 在最大化 ...

  9. ES6 Promise 用法讲解

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...

  10. Python基础:第一个Python程序(2)

    1.Python Shell 1.1 Windows命令 (1)[开始]|[运行],输入cmd回车,进入Windows命令界面. (2)输入python,回车,进入Python Shell. 1.2 ...