Ik ben bezig met het omzetten van een stuk oud javascript naar
iets wat algemeen geaccepteerd wordt.
Het gaat om een interactief menu script (soort outlook-bar) wat ik ooit
ergens gevonden heb en daarna sterk aangepast voor eigen doeleinden.
Dit script bevatte nog veel "document.all" en ik heb inmiddels alle
referenties omgezet naar getElementById().
De code draait (nog steeds) goed in Internet Explorer, maar in Firefox
werkt het niet omdat die een bepaald ID niet kan vinden.
Dus in IE komt een call naar getElementById gewoon terug met een object,
maar in Firefox komt ie met 'null' terug.
Het script maakt veel gebruik van document.write() en ik vermoed dat er iets
vreemd loopt bij de creatie van objecten via die call.
Iets wat IE onder water (wellicht niet helemaal volgens de DOM spec) wel goed
doet, maar in Firefox (en dergelijke browsers) niet goed gaat.
Anyway, het volgende stuk code komt uit de file outbar.js.
Deze file wordt samen met een ander script (wat de menu-items definieert) geinclude
in mijn html file.
Ik heb er voor de overzichtelijkheid wat code tussenuit geknipt.
Firefox (javaconsole) klaagt nu over de code in functie Clipfolder (regel 69),
omdat getElementById('OB_Folder'+folder) geen bruikbaar object oplevert
Wat doe ik hier fout?
iets wat algemeen geaccepteerd wordt.
Het gaat om een interactief menu script (soort outlook-bar) wat ik ooit
ergens gevonden heb en daarna sterk aangepast voor eigen doeleinden.
Dit script bevatte nog veel "document.all" en ik heb inmiddels alle
referenties omgezet naar getElementById().
De code draait (nog steeds) goed in Internet Explorer, maar in Firefox
werkt het niet omdat die een bepaald ID niet kan vinden.
Dus in IE komt een call naar getElementById gewoon terug met een object,
maar in Firefox komt ie met 'null' terug.
Het script maakt veel gebruik van document.write() en ik vermoed dat er iets
vreemd loopt bij de creatie van objecten via die call.
Iets wat IE onder water (wellicht niet helemaal volgens de DOM spec) wel goed
doet, maar in Firefox (en dergelijke browsers) niet goed gaat.
Anyway, het volgende stuk code komt uit de file outbar.js.
Deze file wordt samen met een ander script (wat de menu-items definieert) geinclude
in mijn html file.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
| /***************************
* *
* OUTLOOK-LIKE BAR *
* *
****************************/
document.write("<DIV id='OutlookLikeBar' style='position:absolute;top:"+OB_Top+";left:"+OB_Left+";width:"+OB_Width+";height:"+OB_Height+";border:"+OB_BorderWidth+" "+OB_BorderStyle+" "+OB_BorderColor+";background-color:"+OB_BackgroundColor+";z-index:0;visibility:hidden;clip:rect(0,"+OB_Width+","+OB_Height+",0)'>");
document.write("[img]'"+OB_DownArrow+"'[/img]");
document.write("[img]'"+OB_UpArrow+"'[/img]");
j=1;
while(eval("window.OutBarFolder"+j))
{
j++;
}
i=j-1;
while(i>0)
{
Folder=eval("OutBarFolder"+i);
window.status="Outlook-Like Bar is making folder '"+Folder[0]+"'";
if(i==1)
{
document.write("<INPUT position='UP' id='OB_Button1' onDblClick='OutlookLikeBar.FolderClicked("+i+");this.blur()' onClick='OutlookLikeBar.FolderClicked("+i+");this.blur()' TYPE='button' value='"+Folder[0]+"' style='background:"+OB_ButtonColor+";position:absolute;top:0;left:0;width:"+OB_ButtonWidth+";height:"+OB_ButtonHeight+";font-family:"+OB_ButtonFontFamily+";font-size:"+OB_ButtonFontSize+"px;cursor:hand;color:"+OB_ButtonFontColor+";z-index:100'>");
MakeItems(Folder,i,OB_ButtonHeight);
}
else
{
document.write("<INPUT position='DOWN' id='OB_Button"+i+"' onDblClick='OutlookLikeBar.FolderClicked("+i+");this.blur()' onClick='OutlookLikeBar.FolderClicked("+i+");this.blur()' TYPE='button' value='"+Folder[0]+"' style='background:"+OB_ButtonColor+";position:absolute;top:"+(OB_Height-(j-i)*OB_ButtonHeight-OB_BorderWidth*2)+";left:0;width:"+OB_ButtonWidth+";height:"+OB_ButtonHeight+";font-family:"+OB_ButtonFontFamily+";font-size:"+OB_ButtonFontSize+"px;cursor:hand;color:"+OB_ButtonFontColor+";z-index:100'>");
MakeItems(Folder,i,(OB_Height-(j-i)*OB_ButtonHeight-OB_BorderWidth*2)+OB_ButtonHeight);
}
i--;
}
document.write("</DIV>");
var OutlookLikeBar=new OutBar(OB_Width,OB_Height,j-1,OB_ButtonHeight,OB_BorderWidth,OB_SlideSpeed,OB_IconsHeight+OB_ItemsSpacing,OB_ArrowSlideSpeed);
document.getElementById("OutlookLikeBar").style.visibility="visible";
function MakeItems(Folder,zorder,top)
{
var items=0;
var folderWidth=(OB_Width-OB_BorderWidth*2);
while(Folder[items+1])
{
items+=4;
}
items/=4;
document.write("<DIV id='OB_Folder"+zorder+"' style='border:black;background:"+OB_ItemBackground+";position:absolute;left:0;top:"+top+";width:"+folderWidth+";height:"+(OB_Margin*2+items*OB_IconsHeight+(items-1)*OB_ItemsSpacing)+";z-index:"+zorder+";clip:rect(0 0 0 0);'>");
for(var i=1;i<items*4;i+=4)
{
document.write("<div align='center' valign='middle' targetFrame='"+Folder[i+3]+"' link='"+Folder[i+2]+"' onMouseDown='OutlookLikeBar.ItemClicked(this)' onMouseUp='OutlookLikeBar.ItemSelected(this)' onMouseOver='OutlookLikeBar.OverItems(this)' onMouseOut='OutlookLikeBar.OutItems(this)' ");
document.write("style='image-align:left;text-align:left;border:none;position:absolute;left:"+OB_ItemsMargin+";top:"+(OB_Margin+Math.ceil((i-1)/4)*(OB_ItemsSpacing+OB_ItemsHeight))+";width:"+OB_ItemsWidth+";height:"+OB_ItemsHeight+";cursor:hand;font-family:"+OB_LabelFontFamily+";font-size:"+OB_LabelFontSize+"px;color:"+OB_LabelFontColor+"'>");
document.write("[img]'"+Folder[i]+"'[/img]");
document.write("  "+Folder[i+1]+"</div>");
}
document.write("</DIV>");
}
.....
function ClipFolder(folder,top,right,bottom,left)
{
document.getElementById('OB_Folder'+folder).style.clip=clip='rect('+top+' '+right+' '+bottom+' '+left+')';
}
function Start()
{
if(!this.started)
{
this.ClipFolder(1,0,this.visibleAreaWidth,this.visibleAreaHeight,0);
this.SetArrows();
}
} |
Ik heb er voor de overzichtelijkheid wat code tussenuit geknipt.
Firefox (javaconsole) klaagt nu over de code in functie Clipfolder (regel 69),
omdat getElementById('OB_Folder'+folder) geen bruikbaar object oplevert
Wat doe ik hier fout?