你的这个函数的算法思路是:对指定节点开始,寻找其兄弟节点和所有字节是否被选中。
第一步:判断当前节点hItem是否被选中
第二步:循环获取hItem的兄弟节点,也就是你的这个循环
HTREEITEM hSibling = m_OrgInfoGetNextItem(hItem, TVGN_NEXT);
while (hSibling)
{
hSibling = m_OrgInfoGetNextItem(hSibling, TVGN_NEXT);
}
m_OrgInfoGetNextItem(hSibling, TVGN_NEXT)是查找hSibling的下一个兄弟节点
如此循环,直到hSibing的下一个节点不是兄弟节点,那么hSibing就返回NULL,即0
跳出while循环。
第三步:查找当前节点的所有子节点。
首先给 span 设定一个 id(或者 class,这是为了方便 jQuery 获取),例如 span#span。
其次,兄弟节点是单个还是多个,这里例子给出的是 span 的下一个。
$(function(){$("#span")click(function(){
var $this = $(this);
// 获取 span 的下一个节点 B
// 如果需要获取 span 兄弟节点是上一个的话,可以使用 prev
// 如果是多个的话,需要使用 siblings,详细参考 jQuery api 手册
var B = $thisnext();
if( $thishasClass("A") ){ // 判断是否有 A class
$thisremoveClass("A")addClass("C");
Bhide();
}else{
$thisremoveClass("C")addClass("A");
Bshow();
}
});
});
仅供参考
PS 下次提问记得设定分类,否则可能没人回答哦~
<style>
red{
background-color: red;
}
</style>
<div id="demo">
<a href="javascript:void(0)">萝卜</a>
<a href="javascript:void(0)">青椒</a>
<a href="javascript:void(0)">白菜</a>
<a href="javascript:void(0)">土豆</a>
</div>$(function(){
//绑定单击事件
//将事件绑定在DIV上,是利用事件的冒泡原理, 这样使用,
//使代码结构看起来更整洁,更容易搜索到单击事件发生的位置
//推荐在开发插件,或者其它比较复杂的功能时候,将事件绑定到父级容器
//这样即使此例中的A标签是后来通过 JAVASCRIPT脚本添加进来的,
//同样能够正确地处理
$('#demo')click(function(event){
var $target = $(eventtarget);
//判断如果点击的A标签,则执行以下代码
if(/^a$/itest(eventtargettagName)){
$targetaddClass('red')
siblings('a')removeClass('red');
alert('你点击了我:'+$targettext());
}
});
});
分布式锁的三种实现方式分别是:基于数据库实现分布式锁、基于缓存(Redis等)实现分布式锁、基于Zookeeper实现分布式锁。
一、基于数据库实现分布式锁
1、悲观锁
利用select … where … for update 排他锁。
注意:其他附加功能与实现一基本一致,这里需要注意的是“where name=lock ”,name字段必须要走索引,否则会锁表。有些情况下,比如表不大,mysql优化器会不走这个索引,导致锁表问题。
2、乐观锁
所谓乐观锁与前边最大区别在于基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源, *** 作过程中认为不存在并发冲突,只有update version失败后才能觉察到,抢购和秒杀就是用了这种实现以防止超卖,通过增加递增的版本号字段实现乐观锁。
二、基于缓存(Redis等)实现分布式锁
1、使用命令介绍:
(1)SETNX
SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。
(2)expire
expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
(3)delete
delete key:删除key
在使用Redis实现分布式锁的时候,主要就会使用到这三个命令。
2、实现思想:
(1)获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。
(2)获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。
(3)释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。
三、基于Zookeeper实现分布式锁
ZooKeeper是一个为分布式应用提供一致性服务的开源组件,它内部是一个分层的文件系统目录树结构,规定同一个目录下只能有一个唯一文件名。
基于ZooKeeper实现分布式锁的步骤如下:
(1)创建一个目录mylock。
(2)线程A想获取锁就在mylock目录下创建临时顺序节点。
(3)获取mylock目录下所有的子节点,然后获取比自己小的兄弟节点,如果不存在,则说明当前线程顺序号最小,获得锁。
(4)线程B获取所有节点,判断自己不是最小节点,设置监听比自己次小的节点。
(5)线程A处理完,删除自己的节点,线程B监听到变更事件,判断自己是不是最小的节点,如果是则获得锁。
扩展资料;
一、数据库分布式锁实现的缺点:
1、db *** 作性能较差,并且有锁表的风险。
2、非阻塞 *** 作失败后,需要轮询,占用cpu资源。
3、长时间不commit或者长时间轮询,可能会占用较多连接资源。
二、Redis(缓存)分布式锁实现的缺点:
1、锁删除失败,过期时间不好控制。
2、非阻塞, *** 作失败后,需要轮询,占用cpu资源。
三、ZK分布式锁实现的缺点:
性能不如redis实现,主要原因是写 *** 作(获取锁释放锁)都需要在Leader上执行,然后同步到follower。
1、首先获取要添加的节点的节点,然后创建一个节点,添加到节点的前面。
2、<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>DOM树 *** 作</title> <script> function f1(){。
3、找到狮子狗这个节点 通过id查找到狮子狗节点 var ul=documentgetElementById("d1")。
4、</head> <body> <!--在ul列表中追加一个蛮王英雄--> <ul id="d1"> <li>亚索</li> <li>狮子狗</li> <li>披甲龙龟</li>。
5、 </ul> <input type="button" value="追加蛮王" onclick="f2()" /> </body></html>。
6、在狮子狗节点后追加一个<li>蛮王</li> a找到狮子狗这个节点 通过id查找到狮子狗节点 var li=documentgetElementById("l1"); b创建<li>蛮王</li>节点对象和内容。
以上就是关于MFC 树控件全部的内容,包括:MFC 树控件、点击span显示span的兄弟节点B,同时设span的class为A,再点span隐藏B,同时设s、关于jquery *** 作兄弟节点CSS的简单问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)