2016-07-11 6 views
1

Ich arbeite an jemandes bestehenden Code. In dem Code gibt es einige Inline-onClick Ereignisse bestimmte Eingabeelemente angebracht, wie diese:Triggering-Element der onClick-Funktion finden

<input type="button" id="inputID" onClick="someFunction()"/> 

Problem ist, dass ich nicht, dass die Eingabe des HTML bearbeiten kann, aber ich kann die JavaScript-Funktion Erklärung dieser Funktion bearbeiten.

function someFunction(){ 
    //want to console log the ID of the triggering input element e.g. #inputID 
} 

Gibt es eine Möglichkeit, dass ich die ID des Triggereingangs innerhalb der Funktion, ohne den Weg alle Parameter zum Zeitpunkt des Aufrufs der Funktion (wie ich den HTML-Code bearbeiten kann)

+1

Öffnen Sie die Konsole, und Sie können Debugger hinzufügen; 'direkt vor der' someFunction() 'direkt im HTML. Dann können Sie mit dem Debugger darauf zugreifen. Für die ID selbst, statt Debugger (oder sobald der Debugger geöffnet ist) $ (this) .attr ('id') verwenden. Sie können es in eine console.log() verschachteln oder es direkt in die Konsole einfügen, sobald der Debugger ausgelöst wird. – nurdyguy

+1

@nurdyguy 1) Ich würde annehmen, dass das OP dies programmatisch tun möchte 2) die 'this'-Referenz wird das' window' in einer Funktion sein, die von einem event-Attribut aufgerufen wird, es sei denn, die Referenz wird als Parameter an die Funktion übergeben OP sagt, dass er nicht kann. –

+0

@RoryMcCrossan 1.Warum solltest du das annehmen? 2. Nein, diese Referenz wird nicht auf das Fenster, sondern auf das angeklickte Element angewendet. Sie können diese Referenz in der Funktion sogar als Parameter übergeben. – nurdyguy

Antwort

0

finden konnte Sie könnten verwenden Sie die globale event Objekt dieses Ziel zu erreichen:

function someFunction() { 
    var el = window.event.target; 
    console.log(el.id); 
} 

Example fiddle

Seien Sie sich bewusst, dass dies Probleme bei älteren br haben Owen. Eine Alternative wäre, das someFunction() leer zu lassen (wie Sie sagen, dass Sie es im HTML nicht entfernen können) und stattdessen die Ereignishandler durch unauffälliges Javascript zuweisen, von dem Sie auf das Element zugreifen können, das das Ereignis über die this-Referenz ausgelöst hat.

+0

Ich denke Ziel nicht auf window.event https://msdn.microsoft.com/en-us/library/ unterstützt wird ms535863 (v = vs.85) .aspx – sarepta

+0

Es ist in neueren Versionen von IE (beachten Sie, dass Sie mit dem * Legacy * -Browser-Ereignisleitfaden verknüpfen), aber wie gesagt, ältere Browser können ein Problem sein. –

+0

Du hast Recht, Inline-Event jura sind sowieso, und der Umgang mit ihnen sind oft Kopfschmerzen – sarepta

0

Sie können, aber es ist nicht Cross-Browser, in IE ist es

window.event.srcElement.id 

In FF und Chrome, müssen Sie es an die Inline-Funktion übergeben wie

someFunction(event) 

Und dann können Sie zugreifen es von Ziel Eigenschaft

event.target.id 
0

Da Sie in den Tags, die Sie mit jQuery, nur leav aufgeführt e der Körper von someFunction leeren und an Ihre Eingaben, die diese Funktion aufrufen, einen Ereignis-Listener anhängen.

$('[onclick="someFunction()"]').click(function() { 
    console.log(this.id); 
}); 

https://jsfiddle.net/k8o1umo4/

2

keine Inline-Event-Handler anwenden. Verwenden Sie Ereignis-Listener:

function someFunction(event) { 
 
    // Use `this` or `event.currentTarget` to get the current target 
 
    console.log(this.id); 
 
} 
 
document.getElementById("inputID").addEventListener('click', someFunction);
<input type="button" id="inputID" value="Click me" />

+0

Beachten Sie, dass OP sagt, dass er den HTML-Code nicht ändern kann. Sie müssten also sicherstellen, dass "someFunction()" aufgerufen wird, ohne dass ein "Event" übergeben wird. Wenn alle Dinge gleich sind, ist dies die beste Lösung. –

+0

@RoryMcCrossan Das Ändern des HTML ist nicht notwendig. 'someFunction' sollte in eine Schließung verschoben werden, anstatt den globalen Geltungsbereich zu verschmutzen. Dann wird der Inline-Event-Handler einen 'ReferenceError' im Hintergrund werfen, und der Event-Listener wird korrekt funktionieren. – Oriol

0
function someFunction() { 
    console.log(this.id); 
} 

var el = document.getElementById("inputID") 
//remove inline click event 
el.removeAttribute("onclick"); 
//attach click event 
el.addEventListener("click", someFunction); 

Innerhalb der Funktion, die von addEventListener 'this' genannt wurde, wird nun Referenz das Element, von dem das Ereignis ausgelöst wurde.

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#The_value_of_this_within_the_handler