molily: Onresize-Event triggert nicht nach setzen eines Ankers.

Beitrag lesen

Hallo,

nach einigen Änderungen habe ich endlich verstanden, was das Script tun soll. Allgemein machst du es dir sehr kompliziert und es ließe sich vereinfachen.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

In der Sprachangabe sollte wahrscheinlich »de« stehen für Deutsch.

.menu {
background-color: #99CC33;
width: 200px;
color: #006633;
float: left;
<!-- top: 20px;-->
<!-- left: 20px;-->
<!-- padding: 5px;-->
position: absolute;
}

Den position-Kram habe ich entfernt, sonst liegen die Navigationseinträge nicht nebeneinander, sondern übereinander.

var Navigation = new Object();
Navigation.buttonbreite = 50;
Navigation.buttonpressed = 0;
Navigation.breite = 0;

Kurzschreibweise:

var Navigation = {
   buttonbreite: 50,
   buttonpressed: 0,
   breite: 0
};

buttonpressed sollte ein Boolean-Wert sein, also true oder false.

if(Navigation.buttonpressed==1) {
     st = st + 10;
     if(st < Navigation.breite - document.body.offsetWidth - Navigation.buttonbreite)

Ich würde hier nicht mit document.body.offsetWidth arbeiten. Dieser Wert ist weitesgehend uninteressant, dich interessiert die Breite der Navigation selbst.

window.onload = function() {
var all_obj;
if(document.all) {
all_obj=document.all;
}
else if(document.getElementsByTagName && !document.all) {
all_obj=document.getElementsByTagName("*");
}
for(i=0; i<all_obj.length;i++) {
if(all_obj[i].className == "menu") {
Navigation.breite = Navigation.breite + all_obj[i].offsetWidth;
}
}

Das ist unnötig umständlich. Hole dir das Navigationselement, das die Menü-Einträge umschließt, und durchlaufe mit .getElementsByTagName('li') seine Kinder.

document.getElementById("block").style.width = document.body.offsetWidth - Navigation.buttonbreite + "px";
document.getElementById("buttons").style.width = Navigation.buttonbreite + "px";

Das kannst du alles mit CSS-Positionierung lösen.
Lediglich die maximalen Scrollwert muss man mit JavaScript berechnen.

function doResize() {
location.href = location.href;
}

window.onresize = doResize;

Beim Resize musst du nicht neu laden, sondern lediglich einige Breiten neu berechnen, wie du es beim onload auch tust.

<table border="0" cellpadding="0" cellspacing="0">

Layouttabellen sind überflüssig, verwende CSS zur Positionierung.

  		<div id="block2">  
  			<div class="menu">Navigation1</div >  
  			<div class="menu">Navigation1</div >  
  			<div class="menu">Navigation1</div >  
  			<div class="menu">Navigation1</div >  
  			<div class="menu">Navigation1</div >  
  			<div class="menu">Navigation1</div >  
  		</div>  

Das sollte eine Liste mit ul/li oder ol/li werden.

  	<div id="buttons">  

<a href="#" onmousedown="Navigation.buttonpressed=1;moveItLeft()" onmouseup="Navigation.buttonpressed=0">left</a>&nbsp;<a href="#" onmousedown="Navigation.buttonpressed=1;moveItRight()" onmouseup="Navigation.buttonpressed=0">right</a>
</div>

Hier fehlt das Unterdrücken der Standard-Ereignisbehandlung des click-Events, um zu verhindern, dass der Browser # anspringt.

Außerdem solltest du Event-Handler mit JavaScript registrieren, am besten so, dass mehrere Event-Handler eines Typs registriert werden können (Unobtrusive JavaScript).

Hier ein Gegenvorschlag zur Strukturierung:

http://jsfiddle.net/VgxXZ/2/

Schau dir den Aufbau mal genauer an.

Beim Laden wird erst einmal init aufgerufen. Darin werden die benötigten Elemente geholt und beim Navigation-Object gespeichert. Außerdem werden die Event-Handler registriert:

    n.addEvent(window, 'resize', n.setupWidths);  
  
    n.container = document.getElementById('navigation-container');  
    n.element = document.getElementById('navigation');  
  
    var buttonLeft = document.getElementById('button-left');  
    n.addEvent(buttonLeft, 'mousedown', n.buttonLeftDown);  
    n.addEvent(buttonLeft, 'click', n.buttonUp);  
  
    var buttonRight = document.getElementById('button-right');  
    n.addEvent(buttonRight, 'mousedown', n.buttonRightDown);  
    n.addEvent(buttonRight, 'click', n.buttonUp);

Schließlich wird setupWidths aufgerufen, welches auch beim Resize wieder aufgerufen wird:

    // Container-Breite  
    n.containerWidth = n.container.offsetWidth;  
  
    // Summe der Breite aller Navigations-Items  
    n.width = 0;  
    var lis = n.element.getElementsByTagName('li');  
    for (var i = 0, l = lis.length; i < l; i++) {  
      n.width += lis[i].offsetWidth;  
    }  
    n.element.style.width = n.width + 'px';  
  
    // Beides wird für die maximale Scroll-Position benötigt  
    n.maxScrollLeft = n.width - n.containerWidth;

Der Rest sind Event-Handler für die Button-Klicks sowie die beiden scrollLeft- und scrollRight-Funktionen. Neu hinzugekommen ist eigentlich nur buttonUp als click-Handler bei den Buttons:

  buttonUp: function (e) {  
    Navigation.buttonPressed = false;  
    if (e.preventDefault) {  
      e.preventDefault();  
    } else {  
      e.returnValue = false;  
    }  
  },

Darin wird wie gesagt verhindert, dass der Browser # anspringt.

Mathias