2012-02-13 3 views
-1

У меня была некоторая помощь и некоторые рекомендации по удалению имени класса.Изменение имени класса с помощью ссылки на родителя с jQuery

Previous answer

Они работали в скрипку, но мое приложение просто немного по-другому. У меня есть следующие:

<span id="refType_1" class="refType indent_02">Link Header</span> 

Мой Javascript выглядит следующим образом:

if (action == "Edit") { 
    var parent = linkObj.closest("tr"); 
    parent.find(".refType").html($("#Type :selected").text()); // 1 
    parent.find(".refType").className.replace(/indent_\d+($|\s)/, "xxx"); 
    parent.find(".refType").trim(this.className.replace(/(^|\s)indent_\d+($|\s)/, " ")); 

Я попробовал последние два способа замены имени класса с «», но оба дают мне ошибку. Например, последний метод дает следующее:

SCRIPT438: Object doesn't support property or method 'trim' 

Я думаю, что я на 99%, чтобы заставить его работать, но был бы признателен за советы. Я пробовал несколько разных способов до сих пор, и он все еще не работает.

Обратите внимание, что строка с комментарием // 1 работает. Я могу изменить содержимое пролета по мере необходимости. Что не работает это:

parent.find(".refType").className.replace(/indent_\d+($|\s)/, "xxx"); or 
parent.find(".refType").trim(this.className.replace(/(^|\s)indent_\d+($|\s)/, " ")); 

Это мои две разные попытки получить текст indent_xx быть удален из диапазона.

+1

Я думаю, что вам понадобится добавить еще несколько HTML ... как вызывается этот javascript? откуда ? – ManseUK

+0

Не могли бы вы разместить весь HTML-код, который является релевантным. В вашем jQuery есть ссылки на элементы, которые не показаны. –

+0

Вы не можете использовать 'className' или' trim' для объекта jQuery. используйте [0], чтобы получить фактический объект DOM, или используйте 'addClass' и' removeClass' – yoavmatchulsky

ответ

1

Правильный код из предыдущего ответа не был правильно реализован.

Вы не можете сделать что-либо из них, потому что .className это свойство объекта DOM, а не объекта JQuery, и вы даже не назначая результат .replace() ни к чему:

parent.find(".refType").className.replace(/indent_\d+($|\s)/, "xxx"); 
parent.find(".refType").trim(this.className.replace(/(^|\s)indent_\d+($|\s)/, " ")); 

Если Вы следуете шаблон дизайна из предыдущего ответа, вы бы использовать это:

parent.find(".refType").each(function() { 
    this.className = $.trim(this.className.replace(/(^|\s)indent_\d+($|\s)/, " ")); 
}); 

Если вы знаете, что нет других классов на те объекты, которые вы хотите сохранить, кроме .refType, вы можете сделать это еще проще:

parent.find(".refType").attr("class", "refType"); 

Это просто устанавливает полное имя класса как «refType», исключая любые другие классы, которые могли быть там.

Вы можете также сделать JQuery плагин, который Вы поместили бы где-то в коде инициализации:

$.fn.removeIndentClasses = function() { 
    this.each(function() { 
     this.className = $.trim(this.className.replace(/(^|\s)indent_\d+($|\s)/, " ")); 
    }); 
    return this; 
} 

Затем, ваш код будет просто так:

parent.find(".refType").removeIndentClasses(); 
+0

Извините, мне кажется, я должен был дать полную информацию в последнем вопросе, но я попытался урезать свой вопрос только тем, с чем я столкнулся. В моем коде у меня есть «var parent = linkObj.closest (« tr »), parent.find и т. Д., И он работает хорошо. Теперь я попытался добавить ваш ответ к этому, но имею проблему. Я использую это для удаления indent_xx из элемента, который имеет класс refType в строке моей сетки. В родительском элементе будет только один из этих элементов. – Jessica

+0

Спасибо. Есть ли способ, которым я мог бы это упростить. Дело в том, что будет только один экземпляр indent_xx в имени класса. Могу ли я сделать это без необходимости каждого? – Jessica

+0

@Jessica - я добавил более простой вариант, если вы знаете, что на объекте нет других имен классов, которые вы хотите сохранить, кроме «refType». Способ сделать это без .each() будет включать в себя изменение кода в плагин, и каждый из них будет выполнен внутри плагина. – jfriend00

1

Основная проблема заключается в что вы пытаетесь получить доступ к свойствам, которые не определены для объектов jQuery. В случае className он доступен для элементов DOM, а в случае trim он доступен для строк (если браузер поддерживает его).

Я предполагаю, что вы хотите, чтобы код применялся ко всем .refType элементам.Если это так:

parent.find(".refType").each(function() { 
    this.className = $.trim(this.className.replace(/(^|\s)indent_\d+($|\s)/, " ")); 
}).html($("#Type :selected").text()); 

Это должно заменить три строки, начинающиеся с parent.find. Внутри цикла eachthis относится к элементу DOM, а не к объекту jQuery, поэтому он будет иметь свойство className.

Вам нужно фактически установить значение className (this.className = newClassName), а не просто его изменять.

Также обратите внимание, что я использовал функцию jQuery $.trim, потому что старые браузеры не поддерживают встроенную функцию trim.

Редактировать (см комментарии)

Я думаю, что от Вашего комментария, что вы имеете в виду, что есть только один .refType элемент и, следовательно, вы не хотите использовать each петлю. Вы можете получить доступ к основным элементам DOM из объекта JQuery, используя либо метод get или массив индекса:

parent.find(".refType")[0].className = newClassName; 
+0

Я уже использую var parent = linkObj.closest ("tr"); чтобы перейти к строке в моей сетке. Каждая строка имеет только один элемент .refType. – Jessica

1

Вашего синтаксис для отделки неправильно - это функция хранится в пространстве имен JQuery, а не метод JQuery. Кроме того, замена не является мутационной функцией (т. Е. Создает новую строку, а не заменяет исходную). И, наконец, className является свойством, определенным на узлах DOM, но не для оберток jQuery для узлов DOM, поэтому вам нужно получить фактический узел DOM, получив первый, хранящийся в коллекции jQuery.

parent.find(".refType")[0].className = parent.find(".refType")[0].className.replace(/(^|\s)indent_\d+($|\s)/, " "); 

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

var target = parent.find(".refType"), 
    newClass = $.trim(target[0].className.replace(/(^|\s)indent_\d+($|\s)/, " ")); 
    target[0].className = newClass; 
Смежные вопросы