J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Jag har en äldre webb med en för sin tid så populär lagerscroll.
Den fungerar inte i Firefox, men i IE6, NN8 och O8.5.
Följande kod är början på en mängd kod som räknar ut lagerrelaterade grejor, var scrollen ska vara, hur lagret ska scrolla etc.
function niceLayer( layerID ) {
this.ID = layerID;
if( document.layers ) {
this.layer = document.layers[ this.ID ];
this.style = this.layer;
} else if( document.all ) {
this.layer = document.all[ this.ID ];
this.style = this.layer.style;
} else {
this.layer = document.getElementById( this.ID );
if( !this.layer ) alert( "Error, layer: " + this.ID );
}
...
}
Genom felsökning med Alert-metoden har jag kommit fram till att FF använder sig av sista else-satsen. Innan jag tittade på problemet trodde jag att det berodde på en saknad sådan kodbit, men den fanns alltså.
Varför förstår inte Firefox detta, som den ska göra?
Lagrena har de namn de ska ha, tex
<div id="bar" style="position: absolute; visibility: hidden; z-index:1;"></div>
I övriga webbläsare körs ovanstånde kod igenom fem gånger, med nytt lagernamn för varje gång, för att skapa en korrekt scroll.
I FF kommer första lagernamnet, sedan en alert med [object HTMLDivElement], och sedan är det stopp, med ett felmeddelande som härrör från att ovanstånde kod inte fungerar.
Peter SMedlem sedan dec. 20025 483 inlägg Hejsan!
Du råkar inte ha ett pyttelitet exempel att visa?
emissionMedlem sedan dec. 19996 721 inlägg Det känns som att felet ligger någon annanstans. Visa gärna ett komplett exempel.
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Okej, ni får den riktiga adressen, för mycket att sätta ihop annars.
Peter SMedlem sedan dec. 20025 483 inlägg I layers.js:
function niceLayer( layerID ) {
this.ID = layerID;
if( document.layers ) {
this.layer = document.layers[ this.ID ];
this.style = this.layer;
} else if( document.all ) {
this.layer = document.all[ this.ID ];
this.style = this.layer.style;
} else {
this.layer = document.getElementById( this.ID );
[b]this.style = this.layer.style;[/b]
if( !this.layer ) alert( "Error, layer: " + this.ID );
}
...
I centerwindow.js:
...
if([b]oppna && [/b]oppna.window.focus){
oppna.window.focus();
}
I hooks.js:
function doOnMouseMove( Events ) {
if( document.layers ) {
objMouseMove.mouseX = Events.pageX;
objMouseMove.mouseY = Events.pageY;
}[b] else if (document.all) {
objMouseMove.mouseX = event.x + document.body.scrollLeft;
objMouseMove.mouseY = event.y + document.body.scrollTop;
} else {
// Använd Events här för Firefox m.fl.
}[/b]
if( objMouseMove.onMouseMove.length )
eval( "" + objMouseMove.onMouseMove );
}
:)
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Din kodkomplettering i layers.js kan jag förstå, men varför måste du komplettera centerwindow.js? (Har tagit bort den popup som kommer för FF.)
Vad ska det egentligen stå i hooks.js där du skrivit
// Använd Events här för Firefox m.fl.?
Jag önskar jag hade bättre Javascript-kunskaper, men tyvärr inte. Det närmsta jag kom var detta.
objMouseMove.mouseX = event.x + document.getElementById("bar");
objMouseMove.mouseY = event.y + document.getElementById("scrollbar");
Scrollen kommer fram, men alert-rutan också, fem gånger.
Det går att scrolla ned, och upp, men ställer den in sig på autodarrning.
Dessutom går den ända ned, den stannar inte.
Peter SMedlem sedan dec. 20025 483 inlägg centerwindow.js kompletterade jag p.g.a. att om man som jag har blockerat popupfönster, kommer oppna att vara null.
I hooks.js skall det vara samma kod som för document.layers, d.v.s. Events.pageX/-Y. Med andra ord kan if-satserna skrivas om litet grand.
Även i doOnMouseUp-/Down måste du skriva om if-satserna. Firefox hamnar i else-sektionen, men förstår inte event. Däremot går which bra, precis som för NS4 m.fl.
Så
function doOnMouseUp( Events ) {
if( document.layers ) {
if( Events.which == 1 ) objMouseUp.leftMouse = false;
if( Events.which == 2 ) objMouseUp.middleMouse = false;
if( Events.which == 3 ) objMouseUp.rightMouse = false;
} else if (document.all) {
if( ( event.button == 1 ) || ( event.button == 0 ) ) objMouseUp.leftMouse = false;
if( event.button == 4 ) objMouseUp.middleMouse = false;
if( event.button == 2 ) objMouseUp.rightMouse = false;
} else {
// Använd Events.which här för Firefox
}
...
Som sagt kan du ju skriva om if-satserna om du vill. :)
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Att öppna är null, innebär att? Dvs är det endast för att det "ska bli rättkodat" du vill ha det så?
Nu fungerar scrollen som den ska, men var kommer alert-rutan in?
Jag har skrivit om if-satserna som du önskade, dvs enklaste koden.
function doOnMouseUp( Events ) {
if( document.all ) {
if( ( event.button == 1 ) || ( event.button == 0 ) ) objMouseUp.leftMouse = false;
if( event.button == 4 ) objMouseUp.middleMouse = false;
if( event.button == 2 ) objMouseUp.rightMouse = false;
} else {
if( Events.which == 1 ) objMouseUp.leftMouse = false;
if( Events.which == 2 ) objMouseUp.middleMouse = false;
if( Events.which == 3 ) objMouseUp.rightMouse = false;
}
if( objMouseUp.onMouseUp.length ) eval( "" + objMouseUp.onMouseUp );
return true;
}
doOnMouseMovedo och OnMouseDown på motsvarande sätt.
Har Eventbutton olika värde för mittknappen för olika webbläsare? Det verkar omständligt!
Peter SMedlem sedan dec. 20025 483 inlägg Det innebär att window.open()-satsen returnerat null. Längre ned i koden göres ingen test för detta, utan egenskaper försökes kommas åt direkt:
oppna.window.focus
Nu, som bekant har inte null några egenskaper alls (jämför null.window.focus). Genom att ändra koden enligt exempelvis ovan, slipper de med popupblockerare felmeddelanden.
Var vill du att alert()-rutan skall komma upp?
Det verkar som att olika webbläsare använder olika värden för samma saker. Men det är ju ingenting nytt ;)
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Okej, jag lägger till oppna också.
Det ska inte komma fram en alert, men det gör det.
När jag går in på webben får jag upp 5xAlert som tidigare, får inte du det?
Sedan presenteras sidan, precis som den ska, och fungerar rätt.
Peter SMedlem sedan dec. 20025 483 inlägg Aha, ok :)
function niceLayer( layerID ) {
...
} else {
alert( this.layer );
}
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Nu tror jag vi förvirrar varandra, såhär kan du inte mena?
function niceLayer( layerID ) {
this.ID = layerID;
if( document.layers ) {
this.layer = document.layers[ this.ID ];
this.style = this.layer;
} else if( document.all ) {
this.layer = document.all[ this.ID ];
this.style = this.layer.style;
} else {
alert( this.layer );
/*bort med allt detta
this.layer = document.getElementById( this.ID );
this.style = this.layer.style;
if( !this.layer ) alert( "Error, layer: " + this.ID );*/
}
...
}
Då tar vi ju bort det som gäller för Firefox, och som du lade till tidigare?
(Alerten ger undefined)
Som du ser har jag inte ändrat layers/all alls här, det kanske du trott?
Peter SMedlem sedan dec. 20025 483 inlägg Det jag menade var att du skulle ta bort alert():en och alert():en endast. :)
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Okej, det verkar bättre, men det blir inte rätt ändå!
Det är inte den alerten som kommer upp, "Error, layer: " står det inte, utan som tidigare, "[object HTMLDivElement]".
Jag har kontrollerat på en annan dator, med samma resultat. Får du inte upp det?
function niceLayer( layerID ) {
this.ID = layerID;
if( document.layers ) {
this.layer = document.layers[ this.ID ];
this.style = this.layer;
} else if( document.all ) {
this.layer = document.all[ this.ID ];
this.style = this.layer.style;
} else {
this.layer = document.getElementById( this.ID );
this.style = this.layer.style;
}
...
}
Peter SMedlem sedan dec. 20025 483 inlägg Jo, jag får också upp dem. Men den enda alert():en jag hittar i koden, finns i layers.js:
function niceLayer( layerID ) {
this.ID = layerID;
if( document.layers ) {
this.layer = document.layers[ this.ID ];
this.style = this.layer;
} else if( document.all ) {
this.layer = document.all[ this.ID ];
this.style = this.layer.style;
} else {
this.layer = document.getElementById( this.ID );
this.style = this.layer.style;
}
if( this.layer.document ) {
this.doc = this.layer.document;
this.images = this.doc.images;
[b]} else {
alert( this.layer );
}[/b]
...
:)
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
:r
Ja, den borde jag ju hittat själv, OM man sänkt blicken...
Kan du gissa varför den koden överhuvudtaget finns där, den kan knappast tillföra något?
I vilket fall fungerar det perfekt nu.
TACK!
Bifogar även en uppdaterad MM_findobj som behövs för att hitta objekt till MM_showHideLayers. Listade ut att det var det som fixade att inte submenyer visades.
function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}
function MM_showHideLayers() { //v3.0
var i,p,v,obj,args=MM_showHideLayers.arguments;
for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v='hide')?'hidden':v; }
obj.visibility=v; }
}
Används med MM_showHideLayers('div-id-namn','','show');
Peter SMedlem sedan dec. 20025 483 inlägg Kul att det löste sig! :bire
Ingen aning om varför den satsen finns där. Kanske är den en kvarlämna sedan utvecklingsstadiet?
Glöm inte att använda funktionen acceptera som slutgiltigt svar.
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Super, helt enkelt.
Ska försöka lista ut varför vissa klasser inte gäller här, FF verkar inte acceptera den sistnämnda stilen när det finns två, tex texten nere till vänster.
Läs mer är ett annat problem, där finns endast klass.
[edit]Det visade sig att javascriptkontrollen som avgör vilken css som ska infogas resulterade i Netscape-varianten, vilken är en pixel större. Se http://www.webforum.nu/showthread.php?postid=1104790#post1104790 för att avgöra om det är Firefox.[/edit]
Det verkar nästan som att js-koden är kvarlämnad, men vad tillför if-satsen egentligen då, vad gäller den för?
if( this.layer.document ) {
this.doc = this.layer.document;
this.images = this.doc.images;
}
Klart man inte glömmer acceptera svar när det är klart!
Peter SMedlem sedan dec. 20025 483 inlägg Den verkar gälla för NS4, om jag inte tar fel. :)
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Okej, då rensar jag bort den när jag ändå fixat till det andra!