flashnfantasy: href="JavaScript:alert('hallo')" für eine DIV simulieren

Ich bastele gerade eine leichte JS-Verwaltung für Fly-Menüs

Eine Routine soll dann einem Menü-Beitrag eine Handlung zuweisen, die mit MouseDown dann ausgelöst wird:

flyMenu_Action(indexOfElement, action)

nun kann diese Action

a) ein Link sein
   flyMenu_Action(10, "http://forum.de.selfhtml.org/cgi-bin/fo_post");

b) eine JS-Handlung
   flyMenu_Action(10, "JavaScript:alert('Hallo Team-One');");

Nun schaffe ich es nicht, beides gleichzeitig zu behandenl:
a - behandele ich mit Windows.Location
b - mit eval und RegExp

Das ist aber ziemlich aufwendig und bestimmt nicht die beste Lösung...
Es muß irgendwie doch möglich sein, das so zu behandeln wie ein Link und wie ein href-Link aufzurufen ?

Gruß,
Mathias

  1. Hallo,

    flyMenu_Action(10, "http://forum.de.selfhtml.org/cgi-bin/fo_post");
       flyMenu_Action(10, "JavaScript:alert('Hallo Team-One');");
    Nun schaffe ich es nicht, beides gleichzeitig zu behandenl:
    a - behandele ich mit Windows.Location
    b - mit eval und RegExp

    Ich würde es so lösen (abstrahiert):

    <p id="a">bla</p>  
    <script type="text/javascript">  
    [code lang=javascript]function MenuItem (elem) {  
     /* private properties */  
     /* var elem */  
     var functions = new Array();  
     var href;  
     /* construct */  
     elem.onclick = handler;  
     /* private methods */  
     function handler (e) {  
      var i = 0;  
      while (functions[i]) {  
       functions[i](e);  
       i++;  
      }  
      location.href = href;  
     }  
     /* public methods */  
     this.addAction = function (arg) {  
      if (typeof(arg) == "function") {  
       functions[functions.length] = arg;  
      } else if (typeof(arg) == "string") {  
       href = arg;  
      }  
     }  
    }  
    var elem = document.getElementById("a");  
    var item = new MenuItem(elem);  
    item.addAction(function (e) { window.alert("Hallo Welt!") });  
    item.addAction("http://de.selfhtml.org/");  
    item.addAction(function (e) { window.alert("Bla blub, laber sülz.") });  
    
    ~~~</script>[/code]  
      
    Im Prinzip ganz einfach, man übergibt eine Funktion, die dann im functions-Array gespeichert wird. Wenn der Event feuert, führt die Funktion handler alle gespeicherten Funktionen aus und öffnet zuletzt die angegebene Adresse. (Geht mit mehr Aufwand natürlich noch flexibler und ausbaubarer, z.B. kann man location.href = href auch in einer Funktion in functions unterbringen, die immer am Ende des Arrays steht.)  
      
    Mathias
    
    1. Habe das Problem noch einfacher gelöst:

      addFlyAction (orign, action)

      var dlink = document.createElement("a");
        dlink.href = action;
        dlink.style.textDecoration = "none";
        while (0 < orign.childNodes.length) dlink.appendChild(orign.childNodes[0]);
        orign.appendChild(dlink);

      Die Idee ist, daß man zwischen der DIV, die sich wie ein Link verhalten soll, und all den Children, ein A-Tag einschiebt.

      Das Problem ist halt nur, daß dieser A-Tag den Style verändern kann.
      Aber wenn man das weiß, dann kann man da entsprechend drauf reagieren.

      Gruß,
      Mathias