複数のクリックイベントが発生していることはすでにたくさんあることを私は知っています。私はそれらをすべて読んだと思いますが、それでもここで何が問題になっているのかわかりません。
他の誰かが簡単に拾うことができる明らかな何かが欠けていることを完全に願っています...
いくつかの背景
私のコードはエンタープライズソーシャルネットワーキングプラットフォーム内で機能し、コンテンツ分析用の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);
});
}
うまくいけば、それは問題を説明するのに十分です。
このコードは、3つの円グラフと基になるデータのテーブルを非表示または表示するオプションで構成される各polOwnerのダッシュボード表示を構築していることがわかります。
まず、クリックイベントを.toggletable
クラスに適用しました。それが複数回発生したとき.each
、クラスの各インスタンスに一意のイベントをアタッチするために、ここで別の回答に記載されているメソッドを使用しました。
それで、何が起こりますか?
現在9つpolOwners
あり、一見すると、クリックイベントは他のすべてのテーブルの表示状態を切り替えているように見えます。ただし、コンソールログには、最初のインスタンスで9回、2番目のインスタンスで8回、3番目のインスタンスで7回などが起動し、奇数がテーブルを代替状態のままにしているためであることが示されています(これが機能すると、表示が次のように変わります。.toggle
アニメーション)。
参考までに、私はテキストエディタの担当者ですが、HTMLのエラーチェックに役立つツールであるMS ExpressionWeb4のコピーを持っています。生成されたマークアップ全体(4000行近く)のコピーを貼り付けましたが、ネストや構造のエラーが見られません。
アイデアはありますか?