• jQuery-为动态添加的元素绑定事件


    样例:

    $("#modify_nick").click(function () {
    $(this).css("display","none");
    $("#nickname_span").empty();
    var input = document.createElement("input");
    $(input).attr("type", "text");
    $(input).attr("id", "user_nick_id");
    $(input).attr("name", "user_nick");
    $(input).attr("maxlength", "20");
    $(input).attr("value", "<?php echo $userinfo->nickname ?>");
    $(input).appendTo("#nickname_span");
    $(input).focusEnd();
    });

    $("#nickname_span").on("blur","input[name='user_nick']",function(){
    var startVal = "<?php echo $userinfo->nickname ?>";
    var endVal = $(this).val();
    $("#modify_nick").css("display","block");
    if(endVal != startVal){
    if(endVal != ""){
    $.ajax({
    type: "GET",
    url: "<?php echo Yii::app()->createUrl('user/modifyUserInfo') ?>",
    data: {user_nick: endVal},
    dataType: "json",
    success: function (msg) {
    if(msg == 666){
    window.location.href = "<?php echo Yii::app()->createUrl('user/userManager') ?>";
    }
    }
    });
    }
    }
    });

    说明:

    在使用jQuery的方式为元素绑定事件时,我经常使用bind或者click,但这只能为页面已经加载好的元素绑定事件。像需要用ajax的方式请求远程数据来动态添加页面元素时,显然以上几种绑定事件的方式是无效的,具体写法如下图。

    $(selector).bind(event,data,function)
    $(selector).click(function)
    
    
    
    
    [javascript] view plain copy
     
    1. $("#searchMoveVideoResult ul li").bind("click",function(){  
    2.     $(this).css("border","5px solid #000");  
    3. });  
    4. $("#searchMoveVideoResult ul li").click(function(){  
    5.     $(this).css("border","5px solid #000");  
    6. });  

    为动态添加的元素绑定事件有以下几种方式:

    1.delegate():向匹配元素的当前或未来的子元素附加一个或多个事件处理器

    $(selector).delegate(childSelector,event,data,function)

    目前大多数jquery版本都可用,不过我一般不用它。

    [javascript] view plain copy
     
    1.  $("#searchMoveVideoResult").delegate("ul li","click",function(){  
    2.     $(this).css("border","5px solid #000");  
    3. });  
    [javascript] view plain copy
     
    1. $("#searchMoveVideoResult").delegate("click","ul li",function(){  
    2.     $(this).css("border","5px solid #000");  
    3. });  
    看出它们的不同了吗,第二种写法是错误的,记住一定要把事件写在元素的后面。


    2.live():为当前或未来的匹配元素添加一个或多个事件处理器

    $(selector).live(event,data,function)
    
    
    

    jquery1.8版本以前推荐使用该方法;jquery1.8版本之后就不建议使用了,我试了下,也是无效的,所以高版本的jquery推荐使用on()方法绑定事件。

    [javascript] view plain copy
     
    1. $("#searchMoveVideoResult ul li").live("click",function(){  
    2.      $(this).css("border","5px solid #000");  
    3. });  
    3.on():适用于当前及未来的元素(比如由脚本创建的新元素)
    $(selector).on(event,childSelector,data,function,map)


    试验了下,大多数版本的jquery都是支持这个方法的,也是我比较喜欢使用的方法。

    [javascript] view plain copy
     
    1. $("#searchMoveVideoResult").on("click","ul li",function(){  
    2.     $(this).css("border","5px solid #000");  
    3. });  
    [javascript] view plain copy
     
    1. //下面这样写就是错的了,一定要把动态添加的元素放到on()方法里面才行。</span>  
    [javascript] view plain copy
     
    1. $("#searchMoveVideoResult ul li").on("click",function(){  
    2.     $(this).css("border","5px solid #000");  
    3. });  

    4.onclick事件:动态添加数据时,就为元素绑定onclick事件
    [javascript] view plain copy
     
      1. function searchMoveVideo(){  
      2.     $.ajax({  
      3.         type:"POST",  
      4.         url:"http://op.juhe.cn/onebox/movie/video",  
      5.         data:{"q":$("#moveVideo").val(),"key":"346f79df993776748b242236464d565d"},  
      6.         dataType:"JSONP",  
      7.         success:function(data){  
      8.             console.log(data);  
      9.             if(data.error_code=="0"){  
      10.                 var result=data.result;  
      11.                 console.log(result);  
      12.                 var html=result.title+"<br>"+result.tag+"<br>"+result.act+"<br>"+result.year+"<br>"                                          +result.area+"<br>"+result.dir+"<br>"+result.desc;  
      13.                 html+="<br><img src='"+result.cover+"'/><br>";  
      14.                 html+='<ul style="list-style: none; float: left;">';  
      15.                 var act_s=result.act_s;  
      16.                 for(var i=0;i<act_s.length;i++){  
      17.                     html+='<li style="float: left;" <span style="color:#cc0000;">onclick="showSource(this);"</span>><a target="_bla                                                nk"><img src="'+act_s[i].image+'"><br>'+act_s[i].name+'</a></li>';  
      18.                 }  
      19.                 html+='</ul>'  
      20.                 $("#searchMoveVideoResult").html(html);  
      21.             }else{  
      22.                 $("#searchMoveVideoResult").html(data.reason);  
      23.             }  
      24.         }  
      25.     });    }  
  • 相关阅读:
    .Net Core 微服务学习一
    微服务学习一
    软件开发基本接口学习二
    浏览器根对象window之操作方法
    浏览器根对象window之caches
    Angular面试题三
    浏览器根对象window之performance
    Angular面试题二
    浏览器根对象window之screen
    浏览器根对象window之history
  • 原文地址:https://www.cnblogs.com/ps-blog/p/7281192.html
Copyright © 2020-2023  润新知