js动态加载HTML元素时出现的无效的点击事件

项目中列表数据中隐藏着详情数据,

图一:

详情数据是:根据当前行的数据作为参数,通过ajax请求到后台返回的数据,再根据返回的结果动态生成HTML页面

图二:

js文件中的这些js的点击事件无效:

js代码:

// 推荐商家点击标题展开与收起
$(‘.toggle-tag‘).on(‘click‘, function(){
    var ele = $(this).parents(‘tr‘).next().find(‘.pro-details‘);
    if(ele.is(‘:hidden‘)){
        $(‘.pro-details‘).slideUp();
        ele.slideDown();
    }else{
        ele.slideUp();
    }
});

// 推荐商家点击收起
$(‘.toggle‘).on(‘click‘, function(){
    $(this).parents(‘.pro-details‘).slideUp();
});

后面找到原因: 是因为这些动态加载的这些HTML页面(图二),是在列表数据页面(图一)的HTML元素,css,js代码加载完后,再添加的HTML元素,

在浏览器解析到图一的页面元素时, 解析到js的这些绑定标签事件的js代码(上面的JS代码)的时候,这些绑定事件的标签元素还没有生成,

(因为js代码加载完后,才会有这些绑定事件的标签),所以这些JS 代码的绑定的事件,根本就没有绑定到这些动态加载的标签上,所以哪些事件不会触发。

解决方案:

类似动态加载的HTML元素需要绑定事件可以用 jQuery 事件 - delegate() 方法;

-------------------------------------------------------------------------------------

定义和用法

delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。

使用 delegate() 方法的事件处理程序适用于当前或未来的元素(比如由脚本创建的新元素)。

语法

$(selector).delegate(childSelector,event,data,function)
参数 描述
childSelector 必需。规定要附加事件处理程序的一个或多个子元素。
event
必需。规定附加到元素的一个或多个事件。

由空格分隔多个事件值。必须是有效的事件。

data 可选。规定传递到函数的额外数据。
function 必需。规定当事件发生时运行的函数。

亲自试一试 - 实例

向未来的元素添加事件处理程序
如何使用 delegate() 方法向尚未创建的元素添加事件处理程序。
-----------------------------------------------------------------------------------------------------------
我的解决方案 :(红色代码部分, 其余是别的逻辑代码)
    /**
       * 材价详情显示和隐藏
       */
      $("body").delegate(".toggle-tag","click", function(){
         //点击再加载材价详情数据
         var rowData = $(this).parents(‘tr‘).find("td").eq(0).find("input").val();
        var row = eval("("+rowData+")");
        var id = row.id;
        var name = row.stdName;
        var spec = row.spec;
        var unit = row.unit;
        var city = row.city;
        var province = row.province;
        if($(‘#detailTr_‘+id+‘_‘+city).find("td").length==0){
            var html = std_matpriceLib_list.getMatPriceDetailData(id,row);
            
            $(‘#detailTr_‘+id+‘_‘+city).html(html);
        }
         // 推荐商家
        $(‘.business-icon li a‘).hoverIntent({
            over:function(){
                $(this).find(‘.name,.opacity‘).fadeIn(‘fast‘);
            },
            out:function(){
                $(this).find(‘.name,.opacity‘).fadeOut(‘fast‘);
            }
        });
    
          var ele = $(this).parents(‘tr‘).next().find(‘.pro-details‘);
          if(ele.is(‘:hidden‘)){
              $(‘.hideTr‘).hide();
              $(‘#detailTr_‘+id+‘_‘+city).show();
             $(‘.pro-details‘).slideUp();
              ele.slideDown();
              //获取材价点评统计
//          getCommentStatis(id,city);
          }else{
              $(‘#detailTr_‘+id+‘_‘+city).hide();
              ele.slideUp();
          }
          loadCharts(id,name,spec,unit,city,province);
      });
  
      // 推荐商家点击收起    
      $("body").delegate(".toggle","click", function(){
          $(this).parents(‘.pro-details‘).slideUp();
          $(this).parents(‘tr‘).hide();
      });
时间: 2024-12-24 14:18:37

js动态加载HTML元素时出现的无效的点击事件的相关文章

JS 动态加载脚本 执行回调[transfer]

JS 动态加载脚本 执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数. 我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发现

JS 动态加载脚本 执行回调

JS 动态加载脚本  执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数. 我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发

对于页面动态加载的元素事件无效的解决方案

当用ajax动态获取的数据放在新建的div中进行展示时,当你提前写一些 mouseover,click 操作时会发现不起作用 解决方法: 把事件绑定到它的父元素上面 例如,每次读到数据会将它放在新建的 class = data的div中显示,并且用append方法把他添加在 id= parent 的div中.这个时候假如对data这个块有点击事件,平常可能会写 $('.data').click(function(){...}); 当点击这个div时,不会有反应.这时候可以再一开始将事件绑定到父元

JS动态加载JS与CSS文件

JS动态加载JS与CSS文件 DEMO 一 HTML页面   jsforjscss.html 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"&

js动态加载css和js

js动态加载css和js用处挺多,特意提出来 var loadUtil = { /* * 方法说明:[动态加载js文件css文件] * 使用方法:loadUtil.loadjscssfile("http://libs.baidu.com/jquery/1.9.1/jquery.js","js") * @param fileurl 文件路径, * @param filetype 文件类型,支持传入类型,js.css */ loadjscssfile:function(

Android之根布局动态加载子布局时边距设置无效问题

Android大部分的控件都会有padding和layout_margin两个属性,一般来说它们的区别是: padding:控件中的内容离控件边缘的距离. margin:  控件离它的父控件边缘的距离. 今天做了一个由根布局动态加载子布局的实验,结果发现子布局中的这两个属性可以按预期的效果显示,但是给根布局设置的padding并没有对被加载的子布局产生效果. 代码如下: 根布局文件名为activity_main.xml,其xml文件定义的内容为: <LinearLayout xmlns:andr

js 动态加载事件的几种方法总结

本篇文章主要是对js 动态加载事件的几种方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 有些时候需要动态加载javascript事件的一些方法往往我们需要在 JS 中动态添加事件,这就涉及到浏览器兼容性问题了,以下谈及的几种方法,我们也常常混合使用. 方法一.setAttributevar obj = document.getElementById("obj");obj.setAttribute("onclick", "javasc

js动态加载脚本

首先我们需要一个被加载的js文件,我在一个固定文件夹下创建了一个package.js,打开后在里面写一个方法functionOne,很简单,代码如下: [javascript] view plain copy function functionOne(){ alert("成功加载"); } 后面的html文件都创建在同一个目录下. 方法一:直接document.write 在同一个文件夹下面创建一个function1.html,代码如下: [html] view plain copy

JS 动态加载脚本的4种方法

有时候我们需要动态的加入适合的js,因为有时候不需要将所有的js都加载进来,以来提高效率,但这种方法比较适合单个js文件比较大的情况 如果js文件都比较小,还是一个js好,这样可以减少连接数.下面是4种比较常用的方法,大家可以根据情况选择,最后脚本之家 将会给推荐一个. 1.直接document.write  <script language="javascript"> document.write("<script src='test.js'><