zoukankan      html  css  js  c++  java
  • 关于label的点击事件(原创)

    通常做网页时不会用radio和checkbox的原有样式,通常会进行样式美化,手机端我用的jqurey weui框架,他的原理是这样的:

    <label class="check_label" for="sort_4">
           <input type="radio" class="weui_check" name="sort" id="sort_4">
           <i class="weui_icon_checked">Price Low to High </i>
    </label>
    <style>
    .check_label{position:relative;}
    .weui_check{position:absolute;left:-9999em;}
    </style>

    将input移出屏幕,样式加在i标签上,在电脑端我自己写代码的时候出现个问题:

    .weui_check{position:absolute;left:9999em;}

    时,当input被选中时,屏幕居然诡异的聚焦至这个input,跳出了原页面;当我改成:

    .weui_check{position:absolute;left:-9999em;}

    就没有问题了,没去深研究,暂时不管;如果有同行碰到这情况,且知道原因,感谢留言告知。

    主要谈谈label的点击事件中遇到的坑,(jq写的):

    <label class="check_label" for="sort_4">
           <input type="radio" class="weui_check" name="sort" id="sort_4">
           <i class="weui_icon_checked">Price Low to High </i>
    </label>
    
    $("label").on("click",function(){
           $(this).next().slideToggle();
           console.log(1);
    })

    原本想给其后边的元素添加个toggle事件,就是如果显示就收起,收起就显示;这下好,点了后,就展开后马上收起。。。

    什么鬼,不知道代码出啥问题了,console.log()后发现,被执行了两次!!

    自行猜测:(如果有错,欢迎高手指正)

    点击label后,点击事件会trigger(触发了)label的for的那个input,以上代码,是正好是其内部的input的click事件(来触发被选中或未被选中事件),然后input的点击事件,冒泡至父级label上,所以导致了两次点击的情况。

    我的解决思路:

    1.改变结构,将input从label便签中取出放在别的地方:

    <label class="check_label" for="sort_4">
           <i class="weui_icon_checked">Price Low to High </i>
    </label>
    <input type="radio" class="weui_check" name="sort" id="sort_4">

    $("label").on("click",function(){console.log(1); })

    亲测可行,只执行了一次,上述的原因判断应该是正确的!

    1.在不改变原有结构的情况下,因为我label里边的i标签实际是充满label的,所以将点击事件加在i上(坑来了):

    <label class="check_label" for="sort_4">
           <input type="radio" class="weui_check" name="sort" id="sort_4">
           <i class="weui_icon_checked">Price Low to High </i>
    </label>
    
    $("i").on("click",function(){
           $(this).next().slideToggle();
           console.log(1);
    })

    我去!坑来了,完全没有用,console中什么都没输出,出了什么事???

    再改:

    <label class="check_label" for="sort_4">
           <input type="radio" class="weui_check" name="sort" id="sort_4">
           <i class="weui_icon_checked">Price Low to High </i>
    </label>
    
    $("label").children().on("click",function(){
           $(this).next().slideToggle();
           console.log(1);
    })

    我去!执行了,而且是执行了一次!

    什么鬼?噢噢噢...应该是label触发了input的click事件,所以执行了!

    再改:

    <label class="check_label" for="sort_4">
           <input type="radio" class="weui_check" name="sort" id="sort_4">
           <i class="weui_icon_checked">Price Low to High </i>
    </label>
    
    $("label input").on("click",function(){
           $(this).next().slideToggle();
           console.log(1);
    })

    成功执行!上述判断是正确的!

    我那个去,那问题来了,放在label便签中的所有的元素,你其实是点不到的!你其实是点不到的!你其实是点不到的!

    亲测:确实是这样!!

    有时间去探索具体原因了!知其然,标记下!

    如有错误!欢迎指正!

  • 相关阅读:
    进程和线程的概念、区别和联系
    Python高级语法-GIL-理解(4.1.1)
    Web服务器-并发服务器-Epoll(3.4.5)
    Web服务器-并发服务器-长连接(3.4.4)
    Web服务器-并发服务器-单进程单线程非堵塞方式(3.4.3)
    Web服务器-并发服务器-协程 (3.4.2)
    Web服务器-并发服务器-多进程(3.4.1)
    Web服务器-服务器开发-返回浏览器需要的页面 (3.3.2)
    Web服务器-服务器开发-返回固定页面的HTTP服务器(3.3.1)
    Web服务器-HTTP相关-快速整一个服务器响应浏览器(3.2.1)
  • 原文地址:https://www.cnblogs.com/zhu-shixin/p/6218266.html
Copyright © 2011-2022 走看看