2014-10-23 2 views
1

Я пытаюсь создать небольшой скрипт с использованием jQuery, и я столкнулся с roadblock. Мой сценарий о превращении каждом щелкнул объекты таблицы в определенном стиле в CSS, используя класс .trHighlight в моем сценарии, как показано ниже:

$(document).ready(function() {   
    $('tr').bind('click', function() { 
    $(this).addClass('trHighlight'); 
    }); 
}); 

Я сейчас пытаюсь вернуться в стиле нормального при нажатии снова на каждой строке таблицы (каждый tr-объект). Я попробовал следующий сценарий:

$(document).ready(function() {   
    $('tr').bind('click', function() { 
    $(this).addClass('trHighlight'); 
    }); 
    $('tr .trHighlight').bind('click', function() { 
    $(this).removeClass('trHighlight'); 
    }); 
}); 

Конкретная структура не слишком помогает. У вас есть идея? Другой вопрос: есть ли у вас описание всех свойств, которые могут быть адресованы через this.x, например this.id, возможно, я попытаюсь найти способ, используя свойство класса «this».

Благодаря

+0

Изменение класса элемента не изменяет, какие обработчики событий привязаны к нему. –

+0

Причина, по которой ваш второй обработчик кликов не работает, состоит в том, что: 1) в селекторе было место (как объяснено ниже) и 2) вы добавляли '.trHighlight'class после привязки обработчика кликов. Использование ['on'] (http://api.jquery.com/on/) сделает эту работу, хотя решение matthias_h - это путь. $ (this) .removeClass ('trHighlight');}); ' – Nathan

ответ

7

Вы можете просто использовать toggleClass():

$(document).ready(function() { 
    $('tr').bind('click', function() { 
    $(this).toggleClass('trHighlight'); 
    }); 
}); 

и могли бы рассмотреть, чтобы изменить bind() к on(). Оба будут работать, за плюсы и минусы обоих в качестве ссылки: jquery .bind() vs. .on().
Вы можете использовать .on(), если он имеется с .bind() устарел. Но, как заметка на полях - bind() функция переписан для on() - http://james.padolsey.com/jquery/#v=2.0.3&fn=$.fn.bind (актуализированной информации, извлеченной из этого ответа:. jquery .bind() vs. .on()

+0

И наконец работает! Большое вам спасибо, поскольку вы понимаете, что я являюсь абсолютным новичком в jQuery! –

+1

помните, что [.on()] (http://api.jquery.com/on/) следует использовать вместо .bind() – DarkAjax

+0

Либо это, либо если вы действительно хотите использовать отдельные обработчики кликов, используйте класс по умолчанию: '$ ('tr.default'). click (function() {$ (this) .removeClass (" default "). addClass ('trHighlight');});'. (И наоборот, чтобы вернуться к нормальному состоянию) – myfunkyside

3

@matthias_h его ответ путь Однако, для полноты изложения я просто хочу, чтобы сообщить вам, что у вас которое было проблемой: $('tr .trHighlight') выбирает элемент (независимо от того, какой) с классом trHighlight, который является потомком строки таблицы. То, что вы хотели, хотя и является строкой таблицы, то имеет сам класс, а не один из его потомков. Выбор определенного семантического элемента, который имеет класс, можно сделать, подключив класс и элемент, например: $('tr.trHighlight'). Однако ваш последний скрипт будет выглядеть следующим образом: - Ответ matthias_h - это то, что вы должны использовать в этом случае.

$(document).ready(function() { 
    $('tr').bind('click', function() { 
     $(this).addClass('trHighlight'); 
    }); 
    $('tr.trHighlight').bind('click', function() { 
     $(this).removeClass('trHighlight'); 
    }); 
}); 
2

У вас есть некоторое непонимание того, как работает JavaScript. Важно знать, что JavaScript запускается один раз. После запуска он только прослушивает (и запускает функцию при запросе).

Так вы текущее событие связывания на обоих $('tr') и $('tr . trHighlight') (кстати, там не должно быть пространство между меткой и имя класса), но класс trHighlight добавляется только при нажатии на tr. Этого не происходит, когда JavaScript запускается, поэтому к элементу, который удаляет класс, не будет подключен прослушиватель событий.

Именно поэтому существует система делегирования событий. Basicaly, вы присоединяете событие к родительскому статическому элементу, и он урок к нему и сравнивает цель события с его предком. Если сравнение соответствует селектору, событие успешно выполнит код.

Я говорю здесь о методе .on с селектором в качестве аргумента. Этот код будет работать:

$(document).ready(function() {   
    $('table').on('click', 'tr:not(.trHighlight)', function() { 
     $(this).addClass('trHighlight'); 
    }); 
    $('table').on('click', 'tr.trHighlight', function() { 
     $(this).removeClass('trHighlight'); 
    }); 
}); 

Но это не рекомендуется в вашей ситуации.Вы меняете только класс, и у jQuery есть функция для этого: .toggleClass.

Это означает, что вы можете связать одно событие с tr независимо от того, имеет ли он класс или нет. .toggleClass будет оценивать вас, если необходимо удалить или добавить класс. Это так же просто, как:

$(document).ready(function() {   
    $('tr').on('click', function() { 
     $(this).toggleClass('trHighlight'); 
    }); 
}); 
+0

@ AtoM_84 Это будет сложнее, чем я, хотя ... Эта концепция не так проста, и я тоже не являюсь родным английским динамиком! –

+0

Итак, позвольте мне перефразировать некоторые ваши высказывания, чтобы быть уверенным, что я правильно понял (извините, я не являюсь носителем английского языка): 1) вы имеете в виду, что JS может основываться только на существующих объектах (и их связанных атрибуты) в DOM сразу после загрузки документа, потому что это когда он фактически выполняется? Я прав? 2) Именно поэтому мой сценарий не работает успешно: функция, вызывающая метод removeClass, основана на селекторе, для которого навигатор (или что-либо) не обнаружил никакого соответствующего объекта при выполнении сценария (при условии, что код был правильно написано ...) –

+0

3) Наконец, вы говорите мне, что я должен лучше ссылаться на статические объекты для моего сценария (чтобы сценарий был интерпретирован и не считался полезным, поскольку не использовал адекватные селекторы) и использовал эффект «потомка» "jQuery, чтобы преуспеть в выполнении действий из них. Это правда? –

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