DataViewWebPartsを使い3階層のTreeView その2

原因はJavaScriptの不具合(仕様?)です。
TreeViewはJavaScriptで実装されています。
”+”のクリックイベントに”ExpGroupBy”という関数が設定されています。
WS000458

この関数は、”Core.js”で実装されています。
WS000459

直接修正しても良いのですが、運用的に問題が発生する可能性が高いので、外だしにします。
関数名を変更して、、”ExpGroupBy” → ”HogeExpGroupBy”として不具合(仕様?)を修正します。
当然、修正した関数を呼び出すようにクリックイベントを書き換えます。
SharePoint Designer 2007を使用して一括置換しても良いです。
WS000460

JavaScriptのコード、、、下記のコードをページ中に埋め込みます。
コンテンツエディタWebパーツ等を使用すると便利です。
オリジナルから変更箇所は黄色くしているのでJS読めば何が悪かったか判るでしょう!

<script language=”JavaScript”>
<!–
function HogeExpGroupBy(formObj)
{
if ((browseris.w3c) && (!browseris.ie)) {
document.all=document.getElementsByTagName(“*”);
}
docElts=document.all;
numElts=docElts.length;
images=formObj.getElementsByTagName(“IMG”);
img=images[0];
srcPath=img.src;
index=srcPath.lastIndexOf(“/”);
imgName=srcPath.slice(index+1);
var displayStr=”auto”;
if (imgName==’plus.gif’)
{
displayStr=””;
img.src=’/_layouts/images/minus.gif’;
}
else
{
displayStr=”none”;
img.src=’/_layouts/images/plus.gif’;
}
oldName=img.name;
img.name=img.alt;
img.alt=oldName;
spanNode=img;
while(spanNode !=null)
{
spanNode=spanNode.parentNode;
if (spanNode !=null &&
spanNode.id !=null &&
spanNode.id.length > 5 &&
spanNode.id.substr(0, 5)==”group”)
break;
}
parentNode=spanNode;
while(parentNode !=null)
{
parentNode=parentNode.parentNode;
if (parentNode !=null &&
parentNode.tagName==”TABLE”)
break;
}
lastNode=null;
if (parentNode !=null)
{
lastNode=parentNode.lastChild;
if (lastNode !=null && lastNode.tagName==”TBODY”)
lastNode=lastNode.lastChild;
if (lastNode !=null && lastNode.tagName==”TR” && lastNode.lastChild !=null)
lastNode=lastNode.lastChild;
}
for(var i=0;i<numElts;i++)
{
var childObj=docElts.item(i);
if (childObj==spanNode)
break;
}
ID=spanNode.id.slice(5);
displayStyle=displayStr;
var parentGroup1 = “”;
for(var j=i+1; j<numElts; j++)
{
var childObj=docElts.item(j);
if (childObj.id.length > 5 &&
childObj.id.substr(0, 5)==”group”)
{
curID=childObj.id.slice(5);
if (curID <=ID)
return;
}
parentNode=childObj;
while(parentNode !=null)
{
parentNode=parentNode.parentNode;
if (parentNode==spanNode)
break;
}
if (parentNode==spanNode)
continue;
if (childObj.id !=null && childObj.id.substring(0, 5)==”group”)
{
if (ID==”0″ && curID==”2″ && imgName==’plus.gif’)
{
displayStr=parentGroup1;
}
else

displayStr=displayStyle;
}
if (childObj.id !=null && childObj.id.substring(0, 8)==”footer”+ID)
displayStr=displayStyle;
if (displayStyle !=”none” &&
childObj !=img &&
childObj.tagName==”IMG” &&
childObj.src !=null)
{
if (childObj.src.slice(childObj.src.length – 25)==’/_layouts/images/plus.gif’)
{
displayStr=”none”;
}
else if (childObj.src.slice(childObj.src.length – 26)==’/_layouts/images/minus.gif’)
{
if (curID==”2″ && parentGroup1==”none”)
displayStr=”none”;
else

displayStr=””;
}
if (curID==”1″)
parentGroup1=displayStr;

}
if (childObj.tagName==spanNode.tagName &&
childObj.id !=”footer”)
{
childObj.style.display=displayStr;
}
if ((childObj.tagName==”TABLE” && lastNode==null) || childObj==lastNode)
break;
}
}
// –>
</script>