2013-07-11 5 views
0

У меня есть несколько интервалов с метками.Обнаружение узла, который был нажат в javascript

<span class="viewEdit">View and edit class one.</span> 
<span class="viewEdit">View and edit class two.</span> 
<span class="viewEdit">View and edit class three.</span> 
<span class="viewEdit">View and edit class four.</span> 
<span class="viewEdit">View and edit class five.</span> 

Я хотел бы создать функцию, которая добавляет «на клик» событие, которое определяет, какой из пролетов была нажата. То есть если первая была нажата первая она будет возвращать «0», то второй «1» ... и т.д.

Я понимаю, что я могу использовать

document.getElementByClassName("viewEdit) 

создать массив, но я не знаю, как чтобы определить, какой из них был нажат.

Я пытался исследовать этот вопрос здесь, но подозреваю, что я неправильно формулирую его, поскольку ничего не могу найти. Извините, если этот решех аналогичного вопроса ответил в другом месте.

+1

Добавив его в качестве идентификатора, это будет легко Sunny

+0

Эмм, 'this', внутри события функция, относится к объекту, который активировал функцию. Если вам нужен номер, э-э, возможно, есть функция, которая вам скажет, не знаю. Или вы можете сделать это дешево, грязно и дать каждому уникальный идентификатор/имя. – Ariane

+1

Подробнее об обработке событий: http://www.quirksmode.org/js/introevents.html. –

ответ

1

Таким образом, это позволит вам найти индекс, по которым щелкнули элемента в коллекции.

var elements = document.getElementsByClassName("viewEdit"); 

for (var i = 0; i < elements.length; i++) { 
    (function (index) { 
     elements[index].addEventListener("click", function() { 
      for (var x = 0; x < elements.length; x++) { 
       if (elements[x] === this) alert(x); 
      } 

     }, false); 
    })(i); 
} 

Это халтура, но должны делать то, что вы спрашиваете, до сих пор ... Here is a fiddle for you.

2

jsFiddle Demo

Присоединить обработчик щелчка к каждому элементу. При нажатии на ссылку обратного вызова возникает элемент, из-за которого обработчик запускается, а затем делает некоторые выводы о том, что индекс относится к другим элементам.

Внутри обработчика событий this будет ссылаться на элемент, который активировал событие.

Для достижения этой цели, вы можете перемещаться по набору элементов с вашим именем класса

var els = document.getElementsByClassName("viewEdit"); 
var elClicked = {};//a public variable in case you wish to use it. the requirements for storage was vague 
for(var i = 0; i < els.length; i++){ 

А потом внутри итерации, назначить обработчик события, и хранить индекс, который был использован, чтобы вы могли знать, какой номер был нажат (для этого требуется закрытие).

for(var i = 0; i < els.length; i++){ 
(function(local){ 
    els[i].onclick = function(){ 
    elClicked.element = this; 
    elClicked.text = this.innerText; 
    elClicked.index = local; 
    }; 
})(i) 
} 
+0

очень круто, но как вам получить 1 или 2 или 3 и т. Д., Когда вы нажимаете на каждый тег span. позицию длины этого конкретного элемента при нажатии? – blackhawk

+0

@blachawk - Если бы вы хотели, чтобы вместо индекса вы использовали 'elClicked.index = local + 1', так как индекс в настоящее время представляет позицию на основе 0 в массиве элементов. –

+0

Большое вам спасибо за понимание. Если вы не зададите мне еще один вопрос, и я вообще не хочу отвлекаться от контекста этой оригинальной дискуссии, но я действительно люблю ваше решение. часть в конце вашего скрипта ... (i), я замечаю, что если я удалю i, я получу неопределенные результаты, но если я использую (i), я получаю значения appriopriate. Что происходит в этой части вашего кода? например, зачем (i) начинать с вашей функции самозапускания? спасибо за любое понимание. – blackhawk

5

Обработчик будет передан объект события.

function myHandler(event) { 
    var el = event.target; 
    // Use el here 
} 

event.target будет держать узел, который был щелкнули.

-2
<span class="viewEdit" onclick:"fn(this)">View and edit class one.</span> 
<span class="viewEdit" onclick:"fn(this)">View and edit class two.</span> 
<span class="viewEdit" onclick:"fn(this)">View and edit class three.</span> 
<span class="viewEdit" onclick:"fn(this)">View and edit class four.</span> 
<span class="viewEdit" onclick:"fn(this)">View and edit class five.</span> 

<script type="text/javascript"> 
    function fn(sender){ 
    //add the sender object to your array 
    //or maybe even just the sender's id 
} 
</script> 
+1

Лучше использовать ненавязчивый Javascript. –

+0

Я ценю конструктивный комментарий, поэтому многие люди просто убивают с downvotes. – Seano666

1

Самый простой способ получить родительский узел ваших пролетных элементов, а затем добавить обработчик событий ...
Live Demo

var eles = document.getElementsByClassName("viewEdit"); 

eles[0].parentNode.addEventListener("click", function (e) { 
    // if (e.target.classList.contains("viewEdit")) { 
    if (e.target.nodeName.toLowerCase() === "span") { 
     alert([].indexOf.call(eles, e.target)); 
    } 
}, false); 
0

Вы можете добавить прослушиватель событий нажмите чтобы document.body, который будет ловить все щелчки, а затем отфильтровать по типу тега и класс элементов. Что-то вроде этого.

Javascript

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

(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 whatClicked(e) { 
     var target = e.target; 

     if (target.tagName.toUpperCase() === "SPAN" && /(^|)viewEdit(|$)/.test(target.className)) { 
      console.log(target); 
     } 
    } 

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

На jsfiddle

Смежные вопросы