Как выбрать элемент кроме его дочерних элементов?

0

У меня есть простая таблица, которая выглядит так:

<table>
    <tbody>
        <tr>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
        </tr>
        <tr>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
        </tr>
        <tr>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
        </tr>
        <tr>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
        </tr>
        <tr class="error">
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
            <td>
                <input type="text">
            </td>
        </tr>
    </tbody>
</table>

Когда я нажимаю на tr мне нужно добавить к нему специальный класс, но только я нажимаю на tr, а не на input внутри него. Как это сделать?

Я попробовал что-то вроде этого:

table.find('tbody').on('click', 'tr:not(input)', function(){
        jQuery(this).toggleClass('error');
    });
Теги:

4 ответа

1
Лучший ответ

Я думаю, что лучшее, что вы можете здесь сделать, это проверить имя узла, чтобы увидеть, является ли это td или tr - или включать другие теги, если вы хотите.

$('tbody').on('click', 'tr', function (e) {
    if (e.target.nodeName.toLowerCase() === "td" || e.target.nodeName.toLowerCase() === "tr") {
        $(this).toggleClass('error');
    }
});

Если вы специально хотите, чтобы входные данные были исключены, вы могли бы исключить их:

$('tbody').on('click', 'tr', function (e) {
    if (!$(e.target).is(':input')) {
        $(this).toggleClass('error');
    }
});
2
table.find('tbody').on('click', 'tr', function(e) {
    if (e.target != this)
        return;    

    $(this).toggleClass('error');
});
  • 0
    Не фанат отрицательных условных if (e.target === this) $(this).toggleClass('error'); , я бы использовал if (e.target === this) $(this).toggleClass('error');
  • 0
    Поправьте меня, если я ошибаюсь, не остановит ли это выполнение, если вы нажмете на элементы td вложенные в элементы tr ? Или, например, если был тег div span или p который вы нажимаете ...
Показать ещё 4 комментария
1

Вы можете остановить событие от пузырьков до элемента tr, используя event.stopPropagation:

table.find("tr").on("click", function () {
    jQuery(this).toggleClass("error");
}).find("input").on("click", function (event) {
    event.stopPropagation();
});

Вот некоторая документация для ya, если вы хотите узнать больше: http://api.jquery.com/event.stopPropagation/

Здесь JSFiddle решения: http://jsfiddle.net/tM59b/1/

  • 2
    нашел лучшее решение, например, if (event.target.type != 'text')
  • 0
    Используйте if (event.target.tagName != "INPUT") для прямой проверки. Не уверен, есть ли другие элементы, которые имеют свойство type , равное text .
Показать ещё 1 комментарий
0

Добавьте на input прослушиватель кликов и return false; от него, чтобы остановить событие от распространения до tr.

Вот так:

$('tr input').click(function(e){
    return false;
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню