zoukankan      html  css  js  c++  java
  • jQuery1.9及其以上版本中动态元素on绑定事件无效解决方案

    jQuery 1.9/2.0/2.1及其以上版本无法使用live函数了,然而jQuery 1.9及其以上版本提供了on函数来代替。本文讲解了jQuery on函数的使用方法,以及在使用jQuery函数中遇到的一些问题。

    $(selector).on(event,childSelector,data,function,map)

    各个参数说明如下:

    参数 描述
    event 必需。规定要从被选元素移除的一个或多个事件或命名空间。由空格分隔多个事件值。必须是有效的事件。
    childSelector 可选。规定只能添加到指定的子元素上的事件处理程序(且不是选择器本身,比如已废弃的 delegate() 方法)。
    data 可选。规定传递到函数的额外数据。
    function 可选。规定当事件发生时运行的函数。
    map 规定事件映射 ({event:function, event:function, …}),包含要添加到元素的一个或多个事件,以及当事件发生时运行的函数。

    按照上面的语法下面的例子是可以实现的

    <!DOCTYPE html>
    <html>
    <head>
    <scriptsrc="http://libs.baidu.com/jquery/1.10.2/jquery.min.js">
    </script>
    <script>
    $(document).ready(function(){
      $("p").on("click",function(){
        alert("The paragraph was clicked.");
      });
    });
    </script>
    </head>
    <body>
      
    <p>Click this paragraph.</p>
      
    </body>

    但是如果要绑定的on方法是动态加载出来的元素,那么这样使用就是没有用的。看下面的例子:

    <!DOCTYPE html>
    <html>
    <head>
    <scriptsrc="http://libs.baidu.com/jquery/1.10.2/jquery.min.js">
    </script>
    <script>
    $(document).ready(function(){
      $("#div1").click(function(){
        $("<divclass='test'>test</div>").appendTo($("#div1"));
      });
      $(".test").on("click",function(){
        $(".test").css("background-color","pink");
      });
      $("#div2").bind("click",function(){
        $(this).css("background-color","pink");
      });
    });
    </script>
    </head>
    <body>
      
    <h4style="color:green;">This example demonstrates how to achieve the same effect using on() and bind().</h4>
      
    <divid="div1"style="border:1px solid black;">This is some text.
    <p>Click to set background color using the <b>on() method</b>.</p>
    </div><br>
      
    <divid="div2"style="border:1px solid black;">This is some text.
    <p>Click to set background color using the <b>bind() method</b>.</p>
    </div>
      
    </body>
    </html>
    
    

    上面例子中.test元素是动态加载的,但是给它绑定click方法的时候,明明使用了

    $(".test").css("background-color","pink");

    将背景色设为pink,但是没有起作用,什么原因呢,原因就在于.test是动态加载的元素,而使用上面的方法不能绑定动态加载元素的事件,修正的方法为使用下面的代码代替:

    <!DOCTYPE html>
    <html>
    <head>
    <scriptsrc="http://libs.baidu.com/jquery/1.10.2/jquery.min.js">
    </script>
    <script>
    $(document).ready(function(){
      $("#div1").click(function(){
        $("<divclass='test'>test</div>").appendTo($("#div1"));
      });
      $(document).on("click",".test",function(){//修改成这样的写法
        $(".test").css("background-color","pink");
      });
      $("#div2").bind("click",function(){
        $(this).css("background-color","pink");
      });
    });
    </script>
    </head>
    <body>
      
    <h4style="color:green;">This example demonstrates how to achieve the same effect using on() and bind().</h4>
      
    <divid="div1"style="border:1px solid black;">This is some text.
    <p>Click to set background color using the <b>on() method</b>.</p>
    </div><br>
      
    <divid="div2"style="border:1px solid black;">This is some text.
    <p>Click to set background color using the <b>bind() method</b>.</p>
    </div>
      
    </body>
    </html>

    究其原因就在于使用$(document)意义就在于使元素加载完后才执行方法,所以当为jQuery动态加载的元素绑定on方法的时候,使用$(document)设置代码脚本在DOM元素加载完成后开始执行。之前一个移动站项目中遇到了这个问题,动态添加选项卡并操作选项卡,就是用文中的$(document).on()绑定来解决的,想起来记忆犹新,重新温习下;

  • 相关阅读:
    React元素渲染
    初识JSX
    微信小程序复制文本到剪切板
    微信小程序报错request:fail url not in domain list
    小程序,通过自定义编译条件,模拟推荐人功能
    积分抵扣逻辑
    微信小程序 switch 样式
    tomcat 配置开启 APR 模式
    tomcat8 传输json 报错 Invalid character found in the request target. The valid characters are defined in RFC 3986
    c++数组初始化误区
  • 原文地址:https://www.cnblogs.com/xuechenlei/p/5940398.html
Copyright © 2011-2022 走看看