我们知道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;
}
};

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

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. [20190416]process allocation latch.txt

    [20190416]process allocation latch.txt --//看链接:http://andreynikolaev.wordpress.com/2010/12/16/hidden ...

  2. Redis笔记-Sentinel哨兵模式

    Redis以主从的模式搭建集群后,如果主节点Master挂掉,虽然可以实现将备用节点Slave切换成主节点,但是Redis本身并没有自动监控机制,需要借助Sentinel哨兵模式,实现监控并实现自动切 ...

  3. cmd黑客入侵命令大全

    nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写 tracert -参数 ip(或计算机名) 跟踪路由(数据包 ...

  4. P4013 数字梯形问题 网络流

    题目描述 给定一个由 nn 行数字组成的数字梯形如下图所示. 梯形的第一行有 mm 个数字.从梯形的顶部的 mm 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径. 分别 ...

  5. docker的基本知识

    Docker 是什么? Docker 是一个开源的应用容器引擎,是基于go语言的,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. ...

  6. QPushButton class

    Help on class QPushButton in module PyQt5.QtWidgets: class QPushButton(QAbstractButton) |  QPushButt ...

  7. 浅谈background-size的几个属性值

    前言: css应用中,我们常会碰到background-size的用法,不妨下面总结一下,以便后续查看. 一.先弄个简单的box框. <!DOCTYPE html> <html la ...

  8. 洛谷 P1962 斐波那契数列

    题目链接:https://www.luogu.org/problemnew/show/P1962 题目大意: 略 分析: 由于数据规模很大,需要用矩阵快速幂来解. 代码如下: #pragma GCC ...

  9. MarkdownPad

    MarkdownPad Markdown编辑器,只能在windows下使用 下载地址 :http://markdownpad.com/ 破解: 邮箱:Soar360@live.com 授权证书 GBP ...

  10. Linux C Socket简单实例与详细注释

    最近做的东西与socket十分紧密,所以很好奇它具体是如何实现的,以前也有了解过,但是又忘记了,于是把它记录下来,以便日后查看. 服务器端:server.c #include <sys/type ...