2013-06-25 25 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 
    } 
} 
相關問題