Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Отмена события действующего на строку таблицы при клике на определенной ячейке? (https://javascript.ru/forum/events/29848-otmena-sobytiya-dejjstvuyushhego-na-stroku-tablicy-pri-klike-na-opredelennojj-yachejjke.html)

Rig 13.07.2012 21:10

Отмена события действующего на строку таблицы при клике на определенной ячейке?
 
Прошу прощения если не очень грамотно сформулировал вопрос. Суть в следующем — на строки таблицы повешена определённая функция

<tr onclick=.... и т.д>
<td><a href=...>...</a></td>
<td>...</td>
...
</tr>

понятно, что функция срабатывает при клике в любой области строки, а вот как сделать чтобы, например, при щелчке в ячейке, где размещена ссылка, функция не срабатывала?

cyber 13.07.2012 21:28

при клике по ссылке или при клике по ячайке внутри которой ссылка?

Rig 13.07.2012 22:00

При клике на ячейке в которой ссылка (включая и ссылку, конечно).

lord2kim 13.07.2012 22:28

как вариант, добавьте в начало функции(-й), повешенной(-ых) на строки таблицы, что-то типа такого
function click_tr(e) {
   if (typeof(e.target.href) != "undefined") {
        return true;
   }
   //остальной код функции
}

oneguy 13.07.2012 22:28

Нужно повесить ещё обработчик на ячейку, содержащую ссылку, и в нём вызвать event.stopPropagation();

lord2kim 13.07.2012 22:31

Цитата:

Сообщение от oneguy (Сообщение 188605)
Нужно повесить ещё обработчик на ячейку, содержащую ссылку, и в нём вызвать event.stopPropagation();

и event.cancelBubble=true для IE

cyber 13.07.2012 22:31

вот так
<!DOCTYPE HTML>
<html>
  <head> 
  
    <style>
      td{
        width:50px;
        height:50px;
        border:1px solid black;
      }
    
    </style>
  </head>
  <body>
   
    <table id='tb'>
      <tr><td>1</td></tr>
    <tr><td>2</td></tr>
      <tr><td><a href='#'> 3</a></td></tr>
      <tr><td>4</td></tr>
    </table>
    <script>

      document.getElementById('tb').onclick = function (e){
       
         var target = e&&e.target || event.srcElement;
      
        if(target.tagName == 'TD'){
        
          search(target)
        
        } else if(target.tagName == 'A')alert('link');
        return false;
      }
        function search(elem){
         
           var tags = elem.getElementsByTagName('a');
          if(tags.length)return;
          alert('ссылок нет');
        }

    </script>

  </body>
</html>

oneguy 13.07.2012 22:39

Цитата:

Сообщение от lord2kim
event.cancelBubble=true для IE

Точнее, для IE<9. В IE 9 stopPropagation работает нормально.

Rig 13.07.2012 22:41

Ого, сколько вариантов! Сейчас буду все пробовать, спасибо всем за помощь. Отпишусь обязательно!

bes 13.07.2012 23:22

<style>
  td {
    border: solid 1px;
    cursor: pointer;
    padding: 1em;
  }
</style>
<table id="table">
  <tr>
    <td>нет ссылки</td>
    <td><a href="#">ссылка</a></td>
    <td>нет ссылки</td>
  </tr>
  <tr>
    <td>нет ссылки</td>
    <td><a href="#">ссылка</a></td>
    <td>нет ссылки</td>
  </tr>
<table>

<script>
window.onload = function () {
  var table = document.getElementById('table');

  table.onclick = function (e) {
    e = e || event;
    var target = e.target || e.srcElement;
    if (target.parentNode.tagName == 'TR') {
      if (target.innerHTML.search('href') == -1) {
        alert('здесь ссылки нет')
      } else {
        alert('ячейка со ссылкой')
      }
    } else if (target.tagName == 'A') {
      alert('ссылка')
    }
  }

}
</script>


Часовой пояс GMT +3, время: 13:32.