jQuery 1.3 — проблема с установкой значения атрибута

Это мой первый вопрос о стеке, так что постарайтесь быть вежливым. ;-Д

Моя проблема в том, что я реорганизую некоторый существующий код javascript и использую для этого jQuery. В нескольких местах я встречал код javascript, похожий на следующий:

// some js code working with the customAttribute value
javascriptElementObject.customAttribue = void(0);

javascriptElementObject теперь является объектом jQuery, и я пытался использовать следующий код, чтобы сделать то же самое:

// some js code working with the customAttribute value
javascriptElementObject.attr("customAttribute", void(0));

Однако, похоже, это ничего не делает. Однако следующий код работает:

javascriptElementObject.get(0).customAttribute = void(0);

Я знаю о функции jQuery removeAttr(), но до сих пор не использовал ее, потому что не знаю, эквивалентна ли она установке значения атрибута в void(0).

Итак, я думаю, это действительно означает, что у меня есть 2 вопроса:

  1. Почему не работает первая версия jQuery?
  2. .get(0).customAttribue = void(0); и .removeAttr("customAttribute); эквивалент?

Спасибо.


person Dan Rigby    schedule 14.01.2009    source источник
comment
Есть ли разница между customAttribue и customAttribute? или просто опечатка?   -  person John Sheehan    schedule 15.01.2009
comment
Это была опечатка, исправил.   -  person Dan Rigby    schedule 22.09.2009


Ответы (4)


jQuery любит перегружать свои методы так:

obj.attr( name ) //retrieves the attribute value
obj.attr( name, value ) //sets the attribute

obj.attr( name, void(0) ) == obj.attr( name, null ) == obj.attr( name ) //i.e retrieving the attribute

Вы можете попробовать следующее, если хотите установить пустой атрибут

obj.attr( name, '' )

Это также относится к другим методам jQuery.html() например

person meouw    schedule 14.01.2009
comment
Это немного поздно, но я только что заметил, что атрибуты без значений, такие как .attr(selected) в теге ‹option›, фактически возвращают значение true, если они присутствуют (но я предполагаю, что все еще undefined, если не присутствует). .attr( selected, true), похоже, имел желаемый результат добавления атрибута обратно и, в данном случае, сделал этот параметр выбранным в данный момент в раскрывающемся списке «выбрать». - person Swanny; 05.01.2011

Что вы пытаетесь достичь?

Если цель состоит в том, чтобы удалить значение в паре имя/значение, вы можете просто полностью удалить атрибут. Я не знаю никакой внутренней ценности в поддержании атрибута, который не имеет никакой ценности; в менее совместимых со стандартами браузерах это может даже вызвать проблему.

В общем, синтаксис $(селектор).attr(имя, значение) и $(селектор).removeAttr(имя) работает очень хорошо (по крайней мере, я никогда не видел, чтобы он терпел неудачу).

Если вы пытаетесь использовать void(0), чтобы предотвратить срабатывание A HREF, вам лучше использовать «return false» в качестве события click для этих тегов A.

person ScottyDont    schedule 14.01.2009
comment
Часть проблемы заключалась в том, что я рефакторил существующий код, поэтому я не мог окончательно определить цель установки значения атрибута в void(0). При последующей отладке доступ к значению атрибута после того, как для него было установлено значение void(0), дал неопределенный результат, поэтому .removeAttr() должен работать. - person Dan Rigby; 15.01.2009

Единственный способ работать с пользовательскими атрибутами через объекты jQuery:

obj.get(0).myCustomAttr = 'some value';

Это связано с тем, что метод jQuery attr() не будет работать с пользовательскими атрибутами (за исключением применения к XML-документу).

Также обратите внимание, что ответ meouw относительно функций перегрузки jQuery не совсем верен, потому что jQuery проверяет переданные ему параметры таким образом, что:

jQuery.funcname(param)

а также

jQuery.funcname(param, null)

отличаются, потому что null !== undefined. Например:

var params_test = function(a) {
    if (a === undefined) {
        return 'called with no parameters';
    } else {
        return 'called with one parameter: ' + a;
    }
};
params_test(); // results in 'called with no parameters'
params_test(null); // results in 'called with one parameter: null'
person Dimitar    schedule 09.03.2009

Хм, попробуй так:

javascriptElementObject.attr("customAttribute", void(0));
var _void = javascriptElementObject.attr("customAttribute");
alert(_void);
person Jaime Febres    schedule 14.01.2009