onClick: id abfangen | KontextMenü verstecken

Status
Nicht offen für weitere Antworten.

HPB

Erfahrenes Mitglied
Hi,
ich schreibe gerade ein Kontextmenü, dass sich öffnet, wenn der User auf verschiedene Zellen einer Tabelle klickt. (LINKS KLICK!)
Probleme bereitet mir das Verstecken des Kontextmenüs, wenn der der Besucher der Seite irgendwo anders hinklickt als auf einen Link, der das Kontextmenü öffnet.

Hat jemand ne Idee?

Mein Ansatz:

<body onclick="hideKontextMenu()"> vesteckt das Kontextmenü.
Problem: Dann wird es immer vesteckt, auch wenn man auf einen Link klickt, der das Menü eigentlich öffnen sollte.
Frage: Kann man mit JS ermitteln, von welchem Tag aus das Event onClick ausgelöst wurde?
Bsp:
...<td id="myIDA" onclick="showMenu()">Link</td>

In der Funktion hideKontextMenu() möchte ich dann nur das Menü verstecken, falls die Funktion nicht von einem Tag aus aufgerufen wurde dessen ID mit "myID" beginnt.

Oder hat jemand eine andere Idee?

Danke für die Hilfe,

Gruß,

PETER
 
Am einfachsten rufst Du dazu an jeder Stelle showMenu mit einem Parameter auf:

..<td id="myIDA" onclick="showMenu('myIDA')">Link</td>

dazu mußt du dann natürlich an allen Stellen die Id mitgeben und in

showMenu entsprechend reagieren.
vop
 
versteh ich nicht ganz...

Kannst du mir deine Idee bitte noch etwas näher erläutern?

Eigentlich gebe ich der Funktion auch schon eine ID mit, um zu ermitteln, wo das Menü auftauchen soll / womit es gefüllt sein soll. (habe ich nur der Einfachheit halber weggelassen:-( )

Das Öffnen klappt auch gut. Mein Problem ist das Schließen. Da ich mit der linken Maustaste schließen will (beliebiger Click auf der Seite, es sei denn klick auf Element, das KontextMenü hat).

Wenn ich nun das KontextMenü öffne mit
...<td id="myIDA" onclick="showMenu('myIDA')">Link</td>...
dann kann ich in der Funktion abfragen, ob eine Id übergeben wurde. (z.B. if (typeof id!="undefined"))

Aber was soll ich mit <body onclick=... aufrufen?
Wenn ich die gleiche Funktion showMenu() ohne ID aufrufe, kann ich zwar abfangen, dass keine ID übergeben wurde und daraufhin das Kontextmenü schließen. Aber body onclick... wird ja auch dann ausgeführt, wenn ich auf einen Link mit Kontextmenü klicke. D.h. die Funktion wird 2x aufgerufen.
1. mit ID --> ContextMenü öffnen
2. ohne ID-->ContextMenü schließen.

Dann wird das KontextMenü ja gar nicht mehr angezeigt, oder?

Gruß,

PETER
 
Hallo....

dein Problem nennt sich Event-Bubbling, und ist normal bei dieser Art von Skriptaufruf.
Es gibt zwar Möglichkeiten, dieses "Bubblen" prinzipiell abzustellen, das wäre aber in deinem Fall wohl umständlicher,
als wie schon von dir angesonnen, die ID des Ursprungselements abzufragen.

Rufe deine Anti-Kontext-Funktion nicht im <body> auf , sondern so....
Code:
<script type="text/javascript">
<!--
function hideKontextMenu(e)
{
oId=(e)?e.target.id:window.event.srcElement.id;
if(!oId.match(/^myID/))
    {
    //Menu verstecken
    }
else
    {
    return;
    }
}
document.onclick=hideKontextMenu;
//-->
</script>
...auf, dann sollte es bei den speziellen Zellen nicht in Erscheinung treten.
 
Danke! (kannst du mir noch den Quellcode etwas erklären?)

Danke für die Hilfe, genau so etwas habe ich gesucht.
Wenn du mir jetzt noch die Zeile oId=(e)?e.target.id:window.event.srcElement.id; erklärst, dann bin ich absolut zufrieden. Oder wo finde ich dazu Infos im http://WWW.

DANKE,

PETER
 
Zu der Sache ansich findest du z.B. etwas bei SelfHTML unter dem Stichwort "Eventüberwachung".


die Zeile liest sich so:

wenn "e" bekannt ist, dann handelt es sich um einen nicht-IE-Browser.
Der Funktion wird ja ansich kein Parameter übergeben, in nicht-IE-Browsern ist aber durch die Eventüberwachung das"e" bekannt.... es beinhaltet den Event selbst(anstatt "e" könnte man auch "blubb" oder sonstwas schreiben.
Ist also das ominöse "e" bekannt, kann man auf das Ursprungsobjekt, welches das Ereignis auslöste, per "target" zugreifen.

Ist "e" nicht bekannt, handelt es sich höchstwahrscheinlich um einen IE(oder auch Opera).... dann kann man per "window.event.srcElement" das Ursprungsobjekt ermitteln.

Ist also im Groben eine kleine Browserweiche.

Dann muss man nur noch die ID des Elements abfragen, und kann dann per RegExp das gewünschte suchen.

Ne weitere Seite, welche auf das Bubbling etwas tiefer als SelfHTML eingeht, ist z.b. jene
 
Status
Nicht offen für weitere Antworten.

Neue Beiträge

Zurück