23

As a relative beginner with JS, I am struggling to try and find a solution to this.

I need to find out which line of an unordered list was clicked

<ul onclick="alert(this.clicked.line.id);">
  <li id=l1>Line 1</li>
  <li id=l2>Line 2</li>
  <li id=l3>Line 3</li>
</ul>

I don't really want to add a onclick event to each individual line, I'm sure there must be a way ??

crankshaft
  • 2,607
  • 4
  • 45
  • 77
  • Have you tried setting a breakpoint on the onclick event, and examining the this.clicked object? – Marcin Feb 25 '11 at 11:59

5 Answers5

46

You can use event.target for this:

JS:

// IE does not know about the target attribute. It looks for srcElement
// This function will get the event target in a browser-compatible way
function getEventTarget(e) {
    e = e || window.event;
    return e.target || e.srcElement; 
}

var ul = document.getElementById('test');
ul.onclick = function(event) {
    var target = getEventTarget(event);
    alert(target.innerHTML);
};

HTML:

<ul id="test">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
</ul>

Example: http://jsfiddle.net/ArondeParon/2dEFg/5/

Please note that this is a very basic example and you will likely encounter some problems when you delegate events to elements containing more than one level. When this happens, you will have to traverse the DOM tree upwards to find the containing element.

Aron Rotteveel
  • 81,193
  • 17
  • 104
  • 128
  • 2
    +1 The key here is taking the Javascript out of the HTML attribute. – lonesomeday Feb 25 '11 at 12:04
  • This is correct as long as there are no other elemens in the li's. When you have
  • Item 1
  • than event.target will be the strong element (in that case you have to check the parents). – Stefaan Colman Feb 25 '11 at 12:06
  • is it also possible to add all mouse events to an element and then determine in the handler function what event it was ?? – crankshaft Feb 25 '11 at 12:13
  • @crankshaft nope, you will have to bind each event manually (and this makes your code a lot more understandable as well) – Aron Rotteveel Feb 25 '11 at 12:21
  • Hmm, doesn't seem to work in IE, I get the error: Error: 'target' is null or not an object – crankshaft Feb 25 '11 at 12:31
  • @cranckshaft IE uses event.srcElement. I will edit the answer accordingly. – Aron Rotteveel Feb 25 '11 at 12:32
  • hi can you explain the js used above i mean what we are doing in this js technically ul.Onclick =function....i am new in js and i know basic js – Tanmay Feb 26 '16 at 05:32