2009-09-09 6 views
1

Я работаю на веб-странице с большим количеством таблиц. Сценарий JQuery обрабатывает каждую строку и решает, какой стиль CSS должен быть применен к ней. Я использую этот фрагмент для применения класса к ячейке таблицыПрименение класса к элементу - JQuery

$myElem.parents('td').eq(0).attr('class', 'requiredClass'); 

Функционально, он работает как ожидалось. Однако в IE7.0 для этого требуется 16 мс. Учитывая количество строк на странице, это добавляется довольно быстро, по крайней мере, через полсекунды.

Как это сделать быстрее?

+0

является селектор должен быть «получить главный родительский за $ myElem»? Используете ли вы вложенные таблицы? –

+0

Структура таблицы что-то вроде этого:

<тд (применить стиль)><входной тип = «Флажок» />
myElem имеет ссылку на флажок, и стиль должен быть применен к его – Nick

+0

см. мой ответ для наиболее эффективного способа сделать это - http://stackoverflow.com/questions/1399893/applying-class-to-an-element-jquery/1400087#1400087 –

ответ

3

В свете Вашего комментария в вопросе, то это должно быть самым производительным

$Elem.parent('td').addClass('requiredClass'); 

Это использует parent() вместо из parents(), бывший только смотрит на на родительский, последний смотрит на всех родителей, но исключает корневой узел.

<td>, скорее всего, также является избыточным в parent(), поскольку он действует, чтобы отфильтровать те родительские узлы, которые не являются элементом <td>. Поскольку вы обрабатываете каждую строку за раз, я бы предположил, что вы можете гарантировать, что родитель в каждом случае равен <td>, и поэтому я тоже удалю этот фильтр. Таким образом, становится

$Elem.parent().addClass('requiredClass'); 

Это может быть еще быстрее, если вместо обработки каждой строки в то время, вы можете определить набор строк, которые должны иметь определенный класс применяется к <td> в вопросе, а затем выдать один селектор для добавления класса. Это может быть невозможно, это зависит от проверки, но, тем не менее, это просто мысль.

EDIT:

Вы говорите, что вам нужно удалить неизвестный класс перед добавлением нового, но не знаете, что имя класса будет в каждом конкретном случае. Вызов метода removeClass() без параметра string name будет удалять все классы. Если вы не знали, Elements может иметь несколько классов, каждый из которых разделен пробелом, например <td class="class1 class">.Команда addClass() jQuery гарантирует, что каждое добавленное новое имя класса будет отделено от любого другого пробелом. Таким образом, селектор может выглядеть как

$Elem.parent().removeClass().addClass('requiredClass'); 
0

Попробуйте использовать метод addClass.

$("#ID").addClass("newclass"); 

И используйте removeClass, если вы хотите его удалить.

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

0

попробовать

$myElem.parents('td').eq(0).addClass('requiredClass'); 
+0

Элемент уже имеет css класс, который неизвестен до выполнения этого оператора. Итак, теоретически я должен сначала сделать removeClass, а затем addClass. Тем не менее, я не знаю названия класса, чтобы сделать removeClass – Nick

+0

Это чище, но будет еще медленнее. – bobince

+0

@unknown - вызов removeClass() без параметра classname удалит все классы :) –

0

Использование addClass() method, он добавляет указанный класс (ы) к каждому из набора совпавших элементов.

$Elem.parent('td').addClass('requiredClass'); 
+0

Элемент уже имеет класс css, который неизвестен до выполнения этого оператора. Итак, теоретически я должен сначала сделать removeClass, а затем addClass. Тем не менее, я не знаю имя класса, чтобы сделать removeClass – Nick

+0

Его не обязательно нужно удалить первый класс. Вы можете иметь более одного класса, определенного для элемента. 'asdf' будет выглядеть как ** как ** 'external_link', так и' highlight'. – voyager

0

Я думаю, что ваша проблема связана с вызовом функции eq. Кажется, вам нужен только первый td, поэтому ниже это гораздо более подходящий селектор. Я также использую функцию addClass установить имя класса, в отличие от использования attr

$myElem.parent('td:first').removeClass().addClass('requiredClass'); 
+0

Элемент уже имеет класс css, который неизвестен до выполнения этого оператора. Итак, теоретически я должен сначала сделать removeClass, а затем addClass. Тем не менее, я не знаю имя класса, чтобы сделать removeClass – Nick

+0

И когда я использую $ myElem.parents ('td: first'). Attr ('class', 'requiredclass'); Я не вижу улучшения в производительности. – Nick

+0

Не обязательно удалить первый класс. Вы можете иметь более одного класса, определенного для элемента. 'asdf' будет выглядеть как 'external_link' и' highlight'. – voyager

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