2013-06-25 27 views
1

比方说,我们有一个一流的无序列表:如何检测某个类中的哪个元素是用Javascript单击的?

<ul class="list-class"> 
     <li><a href="#">All</a></li> 
     <li><a href="#">Breakfast</a></li> 
     <li><a href="#">Lunch</a></li> 
     <li><a href="#">Dinner</a></li> 
     <li><a href="#">Snack</a></li> 
    </ul> 

现在,让我们说,我想创造一些函数,它根据不同的东西放在哪个项目已被点击:

function whichElement() { 
    alert("The -- Link has been clicked"); 
} 

如何可以这样做,而不必为每个项目创建一个单独的函数,并写入内联onclick =“”事件?我也愿意使用jQuery。

+0

为什么不使用jquery –

+0

最简单的方法就是给列表中的项目或链接他们自己的班级。有什么特别的东西会使这个主意变得糟糕? –

+0

http://stackoverflow.com/questions/1207939/adding-an-onclick-event-to-a-table-row – manas

回答

1

这个怎么样,如果我理解正确:

var items = document.querySelectorAll('.list-class li'); 

[].forEach.call(items, function(item){ 

    var text = item.textContent.trim().toLowerCase(); 

    item.addEventListener('click', function(){ 
    if (text == 'all') { 
     //... 
    } 
    //... 
    }); 
}); 
+0

值得一提的是,其中一些方法需要现代浏览器,或者这些方法需要匀场。即'querySelectorAll','forEach','textContent','trim'和'addEventListener',当前的代码需要IE9 +,但是POJS解决方案需要+1。 – Xotic750

+0

''.forEach.call'将在内存中创建一个空的'Array',而'Array.prototype.foreach.call'则不会。 –

0

添加一个单击处理程序到ul,是这样的:

$('.list-class').on(
    'click', 
    function(e){ 
    e = e || event; 
    var from = e.target || e.srcElement; 
    if (/^a$/i.test(from.tagName)){ 
     alert('you clicked '+from.innerHTML); 
    } 
    }); 

看到这个jsFiddle

+0

使用jquery的事件委托而不是测试标记以及为什么不使用简单的'from.tagName ===“a”'而不是正则表达式'test'会不会更好? – Xotic750

+0

也许,但你知道什么 - 这是*事件代表团。 JQuery将在内部使用相同的机制。 '测试':一些浏览器报告'A',其他'a'为标记名,所以与'from.tagName ==='a“相比,测试有点短。 from.tagName ===“A”'。 – KooiInc

+0

也许我没有这么好解释自己,是的,你有一种“直接授权”的形式,请参阅[事件代理jquery](http://api.jquery.com/on/)。 jquery也应该照顾'e ||事件“和”目标||“ srcElement'给你[[normalization]](http://api.jquery.com/category/events/event-object/),因此是不必要的。然后关于John Resig自己的['tagName'](http://ejohn.org/blog/nodename-case-sensitivity/)。按照[jsfiddle](http://jsfiddle.net/Xotic750/buYp8/)为您提供jquery中的最终代码。这正是我想传达的。 – Xotic750

0

做一个jQuery的伎俩

$("#list-class li").click(function() { 
    alert($(this).prevAll().length+1); 
}); 

这里是FIDDLE

0

编辑:引发事件event.target回报DOM元素。

$('.list-class').click(function(e){ 
    alert(e.target.nodeName); 
}); 

入住这JSFiddle

+0

有了这个,我当然可以点击一个'li'元素,而不是专门包含的'a'元素,它会触发警报。 – Xotic750

0

你可以做到这一点在像这样POJS,这应该是跨浏览器兼容,并且不使用任何第三方库。其他的优点是每个命名类的元素只有一个事件监听器,它使用事件传播。

Javacsript

/*jslint maxerr: 50, indent: 4, browser: true */ 
/*global alert */ 

(function() { 
    "use strict"; 

    function addEvent(elem, event, fn) { 
     if (typeof elem === "string") { 
      elem = document.getElementById(elem); 
     } 

     function listenHandler(e) { 
      var ret = fn.apply(null, arguments); 

      if (ret === false) { 
       e.stopPropagation(); 
       e.preventDefault(); 
      } 

      return ret; 
     } 

     function attachHandler() { 
      window.event.target = window.event.srcElement; 

      var ret = fn.call(elem, window.event); 

      if (ret === false) { 
       window.event.returnValue = false; 
       window.event.cancelBubble = true; 
      } 

      return ret; 
     } 

     if (elem.addEventListener) { 
      elem.addEventListener(event, listenHandler, false); 
     } else { 
      elem.attachEvent("on" + event, attachHandler); 
     } 
    } 

    function whichElement(e) { 
     var target = e.target; 

     if (target.tagName === "A" && target.parentElement.tagName === "LI" && target.parentElement.parentElement.className === "list-class") { 
      alert("The " + target.firstChild.nodeValue + " Link has been clicked"); 
     } 
    } 

    addEvent(document.body, "click", whichElement); 
}()); 

jsfiddle

如果你使用一些较新的/自定义HTML标记或XML,那么你可能需要考虑tagName case sensitivity,并写了下面几点是一定的。

if (target.tagName.toUpperCase() === "A" && target.parentElement.tagName.toUpperCase() === "LI" && target.parentElement.parentElement.className === "list-class") { 

jQuery的条款上面可以写成

的Javascript

$(document).on('click', '.list-class>li>a', function (e) { 
    alert("The " + e.target.firstChild.nodeValue + " Link has been clicked"); 
}); 

jsfiddle

jQuery中,他们称这种。

+0

+1对于为什么喜欢jQuery的:) –

+0

明白了,当然,如果你把你自己的函数库,然后jQuery的漂亮变得多余了,你不再神秘隐藏的神奇提醒我。 :) – Xotic750

+1

噢,我不是那些不明白jQuery只是一个JS库的人之一。它只是让一些东西很容易写!虽然btw很好的答案!很高兴看到一些POJS –

1

你可以试试这个

function addEvent(elem, event, fn) 
{ 
    if (elem.addEventListener) 
    { 
     elem.addEventListener(event, fn, false); 
    } 
    else 
    { 
     elem.attachEvent("on" + event, function() { 
      return(fn.call(elem, window.event)); 
     }); 
    } 
} 

addEvent(window, 'load', function(e){ 
    var list = document.querySelector('.list-class'); 
    addEvent(list, 'click', function(e){ 
     e = e || window.event; 
     var el = e.target || e.srcElement; 
     alert(el.innerHTML); 
    }); 
}); 

DEMO.

+0

我不确定为什么你只使用了跨浏览器POJS解决方案的一半?你创建了一个跨浏览器的'addEvent',但是你使用需要IE8 +的'querySelector'。但是,POJS解决方案的+1。 – Xotic750

+0

@ Xotic750,'IE8'支持[querySelector](http://caniuse.com/queryselector)。 –

+0

是的,我提到的是IE8 + – Xotic750

0
<ul class="list-class"> 
     <li><a href="#" id="hrefID1">All</a></li> 
     <li><a href="#" id="hrefID2">Breakfast</a></li> 
     <li><a href="#" id="hrefID3">Lunch</a></li>   
    </ul> 
<script> 
$(".list-class li").find('a').each(function(){ 
    $(this).click(function(){ 
     switch($(this).attr('id')) 
     { 
      case "hrefID1"; 
        //do what ever 
        break; 
      case "hrefID2"; 
        //do what ever 
        break; 
      case "hrefID3"; 
        //do what ever 
        break; 
     } 
    }); 
}); 
</script> 
+0

写这段代码在文档准备事件 – Manish

+0

它不工作4我 – Nickool

0

不要在赶时髦,因为这是类似于其他人(但不是完全)......

$('.list-class>li').on('click', 
    function(){ 
     alert('clicked ' + $('a',this)[0].innerHTML); //eg "clicked Lunch" etc 
    } 
); 

http://jsfiddle.net/znySy/

这只是提醒链接的文本点击,但功能内平均分配,你可以switch上的文字如...

function(){ 
    switch ($('a',this)[0].innerHTML) { 
     case 'Lunch'  : // do something for Lunch 
     case 'Breakfast' : // do something for Breakfast 
     default   : // do something for not Lunch or Breakfast 
    } 
} 
相关问题