Отмена события действующего на строку таблицы при клике на определенной ячейке?
Прошу прощения если не очень грамотно сформулировал вопрос. Суть в следующем — на строки таблицы повешена определённая функция
<tr onclick=.... и т.д> <td><a href=...>...</a></td> <td>...</td> ... </tr> понятно, что функция срабатывает при клике в любой области строки, а вот как сделать чтобы, например, при щелчке в ячейке, где размещена ссылка, функция не срабатывала? |
при клике по ссылке или при клике по ячайке внутри которой ссылка?
|
При клике на ячейке в которой ссылка (включая и ссылку, конечно).
|
как вариант, добавьте в начало функции(-й), повешенной(-ых) на строки таблицы, что-то типа такого
function click_tr(e) {
if (typeof(e.target.href) != "undefined") {
return true;
}
//остальной код функции
}
|
Нужно повесить ещё обработчик на ячейку, содержащую ссылку, и в нём вызвать event.stopPropagation();
|
Цитата:
|
вот так
<!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>
|
Цитата:
|
Ого, сколько вариантов! Сейчас буду все пробовать, спасибо всем за помощь. Отпишусь обязательно!
|
<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>
|
В моем случае, удобнее всего оказалось вот это:
<tr onclick=.... и т.д> <td onclick="event.stopPropagation?event.stopPropagation():event.cancelBubble=true"> Кстати, пробовал cancelBubble в разных браузерах IE 8, Firefox 13.0.1, Chromium везде срабатывало, т.е. получается что если не бояться монстров пожирающих за плохой стиль програмирования, то можно было бы обойтись и без stopPropagation. P/S: про оба эти свойства раньше не слышал, очень благодарен всем указавшим на них! |
Кстати у cyber наверное самое универсальное решение для определения наличия ссылки в родительском контейнере: element.getElementsByTagName('a').length вернёт 0, если ссылок нет
PS: Цитата:
|
Цитата:
вот так правильно if(element.getElementsByTagName('a')[0]) |
Цитата:
Проверку наверное лучше сделать на равенство 0 (или undefined в последнем случае), так как иначе каждый раз будут осуществляться лишние проверки на неравенство пустой строке, null и undefined (не принципиально, конечно, но всё же). PS: А срабатывает потому, что length коллекции всегда существует: если ссылок нет, то length равно 0 (если ссылки есть, то length > 0, поэтому проверка на неравенство 0 сработает, поэтому сработает return, а если ссылок нет, то проверка на неравенство 0 не сработает, следовательно, не сработает return, поэтому выполнится alert, так что этот способ рабочий, хотя может быть и несколько морочный для понимания). |
Цитата:
кстати да оно правильно работает if(tags.length)return; |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
это типо тс будет вешать в ручную обработчик на каждую ячейку где есть ссылка? (у меня конечно была такая мысль но она мне показалась сильно бредовой)
|
Цитата:
|
//no comments
http://govnokod.ru/ :) |
| Часовой пояс GMT +3, время: 14:11. |