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 = ...
随机推荐
- IKAnalyzer结合Lucene实现中文分词
1.基本介绍 随着分词在信息检索领域应用的越来越广泛,分词这门技术对大家并不陌生.对于英文分词处理相对简单,经过拆分单词.排斥停止词.提取词干的过程基本就能实现英文分词,单对于中文分词而言,由于语义的 ...
- js坚持不懈之12:var b = {a:1};
今天看到一篇博客,在声明一个变量的时候用了如下格式的语法: var b = {a:1}; 不明白,百度一下.作如下解释: var: 声明一个变量 b: 表示变量的名称 =: 赋值符号 {}: 表示一个 ...
- 在xp下无人值守自动安装系统
无人值守安装可以大大缩短安装系统的时间.我在虚拟机测试成功. 先给文件链接https://files.cnblogs.com/files/sishenzaixian/%E8%87%AA%E5%8A%A ...
- crontab的笔试题随想
最近看到一道题目,具体如下: 下列哪个是创建一个每周三01:00~04:00每3分钟执行一次的crontab指令? A: 1,4 3 /bin/bash /home/sijiaomao/ok.sh B ...
- memcached 学习
memcached 是什么 特点 协议简单 基于 libevent 的事件处理 内置内存存储方式 memcached 不互相通信的分布式 启动 安装 依赖 libevent 安装命令 下载地址在这个网 ...
- 随机排序std::vector,扑克牌,麻将类尤其合用
有些需要重新对std::vector对象重新排序,特别是游戏,例如说:扑克牌,麻将,抽奖等,C++标准已经为std::vector写好了随机排序的方式,这里做个笔记: #include <alg ...
- #034Python选修课第二届Turtle绘图大赛
Pythonturtle库选修课作业 目录 目录 代码效果 题目要求 合作同学 程序实现 最初目标 实现方式 代码如下 代码效果 题目要求 具体内容可参阅课程教学网站或超星学习通. 按照2人一组,结对 ...
- python学习笔记4_类和更抽象
python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...
- Cleartext HTTP traffic to xxx not permitted解决办法
,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 ...
- hbuilder IOS APP 打包与发布
---恢复内容开始--- 准备:苹果开发者账号,一个Mac系统 没有账号可以再这里注册 https://developer.apple.com/ 因为账号是公司的,自己并没有注册过,这里就不进行阐述了 ...