我们知道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. C语言货架02

    第1章 程序设计和C语言  最简单的C语言程序举例 #include<stdio.h> int main() { printf("这是一个C程序\n"); : } C语 ...

  2. 从0开始的Python学习018更多的Python内容

    特殊的方法 之前学习的都是一些常用的方法,为了使我们的学习更加的完整,我们在这里学习一些特殊的方法. 一般说来,特殊的方法都被用来模仿某个行为.例如,如果你想要为你的类使用x[key]这样的索引操作( ...

  3. 如何自己制作CHM电子书?

    软件介绍: EasyCHM 非常适合个人和单位制作高压缩比的有目录.索引,同时具有全文检索及高亮显示搜索结果的网页集锦.CHM格式的帮助文件.专业的产品说明书.公司介绍.文章集锦.CHM电子书等等. ...

  4. ios定义数组和字典快捷方式

    //标准写法 NSNumber * number = [NSNumber numberWithInt:1]; NSArray * array = [NSArray arrayWithObjects:@ ...

  5. SQL COUNT() 函数

    COUNT() 函数返回匹配指定条件的行数. SQL COUNT() 语法 SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL ...

  6. centos7下给bond网卡配置bridge桥接

    这篇的主题可以用几个关键字组合:centos7+kvm + bond + bridge .brige主要用在KVM虚拟化环境下,而bond是进行物理层面的冗余.具体配置信息如下 物理网卡名称:enp0 ...

  7. eval、exec及元类、单例实现的5种方法

    eval内置函数 # eval内置函数的使用场景:#   1.执行字符串会得到相应的执行结果#   2.一般用于类型转化,该函数执行完有返回值,得到dict.list.tuple等​dic_str = ...

  8. ABP之session

    ABP提供了一个IAbpSession接口,可以在不使用ASPNET的session的情况下获取当前用户和租户.IAbpSession还被ABP中的其他结构(如设置和授权系统)完全集成和使用. 注入s ...

  9. vmware workstation安装教程以及其中出现的错误解决方法

    VMware Workstation 安装教程   1 下载好虚拟机,然后运行,点击下一步 2 选择我接受,下一步 3 选择安装的位置,可以自己选择,也可以默认不更改,这个无影响(图中I:\下面的VM ...

  10. C#中的PropertyGrid绑定对象,通过改变某一值而动态设置部分属性的特性

    问题:如下,我定义了一个对象,默认设置属性WindowSize ,WindowSize 为不可见,通过改变SaveOnClose的值,动态的改变不可见的属性的显示和隐藏. [DefaultProper ...