2017-05-24 3 views
0

Ich versuche, ein benutzerdefiniertes Ereignis in einem übergeordneten Element aus dem Kind Elemente Ereignis auszulösen. Das übergeordnete Element ist HelpMenuHeader und das benutzerdefinierte Ereignis wird in HTML als "onsubmenu_click" definiert.Javascript - triggern benutzerdefinierte Eltern HTML-Ereignis von Kind Element

Hier ist ein Ausschnitt des HTML, der nur einen Menübaum zeigt.

<span class="formMenu" id="HelpMenuHeader" onsubmenu_click="OnMenuClick()">Help 
    <div class="formMenu" id="HelpAbout" onmouseup="MenuChildClick()">About us...</div> 
</span> 

Im Kind-Element, Helpabout, muss das MenuChildClick Ereignis der Eltern onsubmenu_click Ereignis auszulösen, so dass das (die Event-Handler der Eltern Informationen verwendet) ausgeführt wird.

Hier ist ein Ausschnitt aus der JavaScript-I für MenuChildClick habe:

function MenuChildClick() 
{ 
    var srcElement = this.event.srcElement; 
    if (srcElement.id != "spacer" && srcElement.tagName != "HR") 
    { 
     // NONE OF THE LINES BELOW WORK 
     //parent.$(srcElement).trigger('onsubmenu_click'); 
     //$(srcElement).trigger('onsubmenu_click'); 
     //var event = document.createEvent('Event'); 
     //event.initEvent('submenu_click', true, true, null); 
     //srcElement.dispatchEvent(event); 
     //oEvent = createEventObject(); 
     //oEvent.result = srcElement.id; 
     //onsubmenu_click.fire(oEvent); 
    } 
} 
  1. ich einen Verweis auf das richtige übergeordnete Element in dem MenuChildClick Ereignisse ein Problem mit immer da, wenn ich die übergeordneten Referenz überprüfen hat nicht die Eltern-ID.

  2. Und sobald ich die richtige Elternreferenz habe, muss ich das benutzerdefinierte Ereignis onsubmenu_click des Elterns ausführen. (Die Mutter Ereignis wird bereits angehört, da es in der HTML definiert ist, nicht wahr?)

Ich habe IE Kompatibilitätsansicht zu unterstützen, damit ich es brauche auch für frühere IE-Versionen zu arbeiten.

Wer mir sagen, wie ich diese Dinge tun kann (1 & 2 oben) Verlassen der HTML wie es ist?

Vielen Dank im Voraus.

+0

Kann man 'OnMenuClick()' nicht innerhalb von 'MenuChildClick()' aufrufen? Außerdem definieren Sie nicht das Element 'parent' (Sie suchen nach '$ (srcElement) .parent()') und überschreiben das JavaScript-Schlüsselwort 'event'. –

+0

Warum rufst du das Ereignis nicht direkt auf 'MenuChildClick()'? – LebCit

+0

Wie rufe ich das Ereignis der Eltern an? Ich kann OnMenuClick() nicht direkt aufrufen, weil es einen Verweis auf das übergeordnete Element benötigt, da es das Objekt "event" verwendet, um eine Menge Material auf dem übergeordneten Objekt zu erstellen. – johnr2000

Antwort

0

Zuerst müssen Sie das Element übergeben, indem Sie Ihre HTML dies das Ereignis in Ihrem HTML auslöst:

<span class="formMenu" id="HelpMenuHeader" onsubmenu_click="OnMenuClick()">Help 
    <div class="formMenu" id="HelpAbout" onmouseup="MenuChildClick(this); return false;">About us...</div> 
</span> 

Beachten Sie, dass ich das Element übergeben, die den Funktionsaufruf auslöst von ‚this‘ vorbei durch den onmouseup Funktionsaufruf.

Dann können Sie das übergebene Element verwenden, um die Elemente, die Sie definieren möchten, wie folgt überwachen:

function MenuChildClick(element) 
{ 
    var srcElement = element; 
    var parent = element.parentNode 
    if (srcElement.id != "spacer" && srcElement.tagName != "HR") 
    { 
     //parent.trigger('onsubmenu_click'); 
    } 
} 
+0

Ich habe ein paar dieser Vorschläge ausprobiert und das Ereignis löst nicht aus. Also habe ich einen einfachen Test gemacht: var parent = $ (document.getElementById ('HelpAbout')). Parent(); parent.trigger ('onsubmenu_click'); Die übergeordnete Referenz befindet sich auf dem rechten Element, aber das Ereignis wird immer noch nicht ausgelöst. Ich verstehe es nicht. Das sollte funktionieren. Könnte es daran liegen, dass das Ereignis in HTML definiert wurde? – johnr2000

0

Sie Methoden verwenden jQuery .on() und .trigger() statt Ereignishandler Attribut

$(function() { 
 
    function parentHandler(event, args) { 
 
    console.log(event.type, args) 
 
    } 
 
    $("#HelpMenuHeader").on("submenu_click", parentHandler); 
 
    $("#HelpAbout").on("mouseup", function() { 
 
    $(this).parent().trigger("submenu_click" 
 
    , ["triggered from #" + this.id]) 
 
    }) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> 
 
</script> 
 
<span class="formMenu" id="HelpMenuHeader">Help 
 
    <div class="formMenu" id="HelpAbout">About us...</div> 
 
</span>
können

+0

Ich habe das versucht, aber wenn ich es ausführe, geht der Code nicht in die Funktionen, d. H. Onmouseup geht nicht in die Funktion, wenn ich auf HelpAbout klicke. – johnr2000

+0

Was meinen Sie mit "geht nicht in die Funktion, wenn ich auf HelpAbout klicke"? – guest271314

+0

Ich führe es im Debug-Modus und habe Haltepunkte in den Funktionen und wenn ich auf HelpAbout klicke geht es nicht in die Funktion. Ich muss in der IE-Kompatibilitätsansicht laufen, also frage ich mich, ob das es stoppt. – johnr2000