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;
- }
- };
这样就可以在外部响应点击事件。
JGUI源码:JS菜单动态绑定(8)的更多相关文章
- JGUI源码:从头开始,建一个自己的UI框架(1)
开篇 1.JGUI是为了逼迫自己研究底层点的前端技术而做的框架,之前对web底层实现一直没有深入研究,有了技术瓶颈,痛定思痛从头研究, 2.虽然现在vue技术比较火,但还在发展阶段,暂时先使用JQue ...
- JGUI源码:鼠标中键滚动再次优化(5)
//电脑端中键滚动事件 var mousewheel = getBrowserInfo() == "Firefox" ? "DOMMouseScroll" : ...
- JGUI源码:Accordion鼠标中键滚动和手机端滑动实现(2)
本文是抽屉组件在PC端滚动鼠标中键.手机端滑动时,滚动数据列表实现方法,没有使用iscroll等第三方插件,支持火狐,谷歌,IE8+等浏览器. 演示在:www.jgui.com Github地址:ht ...
- JGUI源码:右键菜单实现(12)
1.要想实现右键菜单,就要先能响应右键函数 $('#down').mousedown(function(e){ if(3 == e.which){ alert('这是右键单击事件'); }else i ...
- JGUI源码:实现图标按钮及下拉菜单(16)
效果如下 代码片段如下 <div class="jgui-btn" id="personalbtn" style="float:right;&q ...
- JGUI源码:组件及函数封装方法(7)
以Accordion为例1.在base.js定义一个对象,这样可以和JQuery对象区分开,用户使用组件时比较清晰一点,也可以在这里引用多个库. var JGUI = J = { version : ...
- JGUI源码:实现简单MVVM单项绑定学习笔记(15)
前面几节都是jquery界面方面的东西,本节研究些数据方面的东西:MVVM. MVVM由三部分组成:Model <=> ViewModel <=> View,当Model数据改 ...
- JGUI源码:响应式布局简单实现(13)
首先自我检讨下,一直没有认真研究过响应式布局,有个大致概念响应式就是屏幕缩小了就自动换行或者隐藏显示,就先按自己的理解来闭门造车思考实现过程吧. 1.首先把显示区域分成12等分,bootstrap是这 ...
- JGUI源码:Accordion折叠到侧边栏实现(6)
折叠和非折叠效果如左右图所示 代码如下 //折叠 $.fn.jAccordionfold = function() { return this.each(function() { var obj = ...
随机推荐
- 【转】网页禁止后退键BackSpace的JavaScript实现(兼容IE、Chrome、Firefox、Opera)
var forbidBackSpace = function (e) { // 获取event对象 var ev = e || window.event; // 获取事件源 var obj = ev. ...
- android测试用例编写
说明:android中写测试用例也是用junit,测试用例代码风格是junit3的风格.java中测试用例中使用junit3需要继承TestCase(junit4则不需要,直接用annotation即 ...
- kvm热添加和热迁移
a.热添加磁盘 1.创建磁盘 qemu-img create -f qcow2 web01-add01.qcow2 5G 2.附加磁盘设备 virsh attach-disk web01 /opt/w ...
- 一文读懂 JAVA 异常处理
JAVA 异常类型结构 Error 和 Exeption 受查异常和非受查异常 异常的抛出与捕获 直接抛出异常 封装异常并抛出 捕获异常 自定义异常 try-catch-finally try-wit ...
- LA3971 组装电脑
思路:二分,就是在不超过b的预算下,使得品质的最小值最大化.关键还是判断函数吧. 假设答案为x,判断函数,就是每一个种类的配件的品质最基本的品质要大于x,然后找出最小的值.这样的配件品质之和的价格要小 ...
- Python--day11(函数的参数)
今日主要内容 1. 函数的参数 2. 函数的嵌套调用 1. 形参与实参 1. 参数介绍: 函数为什么要有参数:因为内部的函数体需要外部的数据 怎样定义函数的参数:在定义函数阶段,函数名在后面( ...
- 关于win7+VS2017环境下的opencv-contirb配置的一个坑
问题出现背景: 由于课题需要用到SURF detector, 我依照网上的一下教程,把opencv-contrib的配置了一遍.但是,当我写了一个小demo来测试模块是否能正常使用的时候,程序能正常编 ...
- Python----支持向量机SVM
1.1. SVM介绍 SVM(Support Vector Machines)——支持向量机.其含义是通过支持向量运算的分类器.其中“机”的意思是机器,可以理解为分类器. 1.2. 工作原理 在最大化 ...
- ES6 Promise 用法讲解
Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...
- Python基础:第一个Python程序(2)
1.Python Shell 1.1 Windows命令 (1)[开始]|[运行],输入cmd回车,进入Windows命令界面. (2)输入python,回车,进入Python Shell. 1.2 ...