繁体   English   中英

jQuery单击事件触发多次

[英]JQuery click event firing multiple times

我知道这里已经触发了许多单击事件,我想我已经读完了所有事件,但仍然看不到这里出了什么问题。

完全希望我缺少其他人可以轻松接上的明显东西...

一些背景

我的代码在Enterprise Social Networking平台内运行,并创建了一个BI仪表盘用于内容分析(大约1000行内容,大部分是特定于域的,太多了以至于无法完整发布)。

使我感到悲伤的部分是构建仪表板可视化本身的功能。

开始...

function makePage(){
 $("#policyCount").text(policyCount);
  var docTypes=getGlobalDocTypes(polOwners); //returns a constrained vocab array
  var statusTypes=getGlobalStatusTypes(polOwners); //returns a constrained vocab array
  $.each(polOwners,function(){ // polOwners is a global array that contains the BI data to be visualised
   html=""
   var ownerName = this.name.split(":")[1]; // name is a str in format "Owner:HR"
   html += "<div id='" + ownerName + "' class='ownerData'>";
   html += "<div class='ownerHeading'>" + ownerName + "</div>";
   html += this.policies.length + " Policy documents maintained<br />"; // policies is an array of docs managed by owner

   divIDReview = "dboard_" + ownerName + "reviewchart";
   html += "<div id='" + divIDReview + "' class='dboardelement'></div>";

   divIDType = "dboard_" + ownerName + "typechart";
   html += "<div id='" + divIDType + "' class='dboardelement'></div>";

   divIDStatus = "dboard_" + ownerName + "statuschart";
   html += "<div id='" + divIDStatus + "' class='dboardelement'></div>";

   html += "<div id='" + ownerName + "ToggleTable' class='toggletable' owner='" + ownerName + "'>";
   html += "Click to display all " + ownerName + " documents<br /></div>";
   html += "<div id='" + ownerName + "polTable' class='poltable'>";
   html += getPolTable(this.policies); // Returns an HTML table of doc metadata
   html += "</div>";

   html += "</div>";
   $("#owners").append(html); // When this function is called #owners is an empty div

   $(".toggletable").mouseover(function(){
     $(this).css({'cursor':'pointer','text-decoration':'underline'});
    });

   $(".toggletable").mouseout(function(){
     $(this).css( {'cursor':'default','text-decoration':'none'});
    });


   $(".toggletable").each(function(i, elem){
    $(elem).click(function(){
      if ($(this).next(".poltable").css("display")=="none"){
       // Currently hidden - so show
       if (debug){console.log($(this).attr("id") + " was clicked")}
       $(this).html("Click to hide " + $(this).attr('owner') + " documents<br/>");
       $(this).next(".poltable").css("display","block");
       } else {
       if (debug){console.log($(this).attr("id") + " was clicked")}
       $(this).html("Click to display all " + $(this).attr('owner') + " documents<br    />");
       $(this).next(".poltable").css("display","none");
       }      
    });
   });

   // the next section calls functions that use the Google vis api to draw  pie charts

   drawPie(300,200, "Review Status", "Status", "Policies",    getReviewStatus(this.policies), ["green","orange","red"], divIDReview); 

   drawPie(300,200, "Document Types", "Type", "Docs", getDocTypes(this.policies, docTypes), [], divIDType); 


   drawPie(300,200, "Document Status", "Status", "Docs", getStatusTypes(this.policies, statusTypes), [], divIDStatus); 
 }); 
 }

希望这足以说明问题。

您将看到代码为每个polOwner构建一个仪表板显示,该显示由三个饼图和一个用于隐藏或显示基础数据表的选项组成。

我首先将click事件应用于.toggletable类。 当多次触发时,我使用了.each另一个答案中描述的方法,将唯一事件附加到该类的每个实例。

那么,会发生什么呢?

当前有9个polOwners ,乍一看,单击事件似乎只是在切换其他所有表的显示状态。 但是,控制台日志显示这是因为它首先触发9次,第二次触发8次,第三次触发7次,依此类推。奇数使表处于备用状态(当此操作有效时,显示将更改为.toggle动画)。

有关信息,当我是文本编辑人员时,我确实有MS Expression Web 4的副本,它是用于错误检查HTML的有用工具。 我粘贴了整个生成的标记的副本(近4000行),看不到任何不良的嵌套或结构错误。

大家有什么想法吗?

您有一些嵌套循环:

// jQuery each on polOwners
$.each(polOwners,function(){
    // ... code that appends .toggletable class 

    // jQuery each on .toggletable class
    $(".toggletable").each(function(i, elem){
        // code that runs on the toggletable element
    });
});

对于每个polOwner,您要添加一个带有toggletable类的div。 然后在其中,您可以通过一个可toggletable类循环遍历每个div,并添加一个click事件。

这将为第一个polOwner添加1单击,为第二个polOwner添加2单击,为第三个增加3单击,依此类推。

移动toggletable每个外的polOwner每次,你应该是好的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM