Definir atributo sem valor


194

Como definir um atributo de dados sem adicionar um valor no jQuery? Eu quero isso:

<body data-body>

Eu tentei:

$('body').attr('data-body'); // this is a getter, not working
$('body').attr('data-body', null); // not adding anything

Tudo o resto parece adicionar os segundos argumentos como uma string. É possível apenas definir um atributo sem valor?


3
Por que você precisa data-bodyvs. data-body=""?
Pílulas de explosão

Pelo menos se você quiser usar o XHTML, não deve fazer isso, pois a minimização de atributos não é permitida.
Matthias

9
Eu não uso XHTML, eu uso HTML5
David Hellsing

2
@ user1689607 porque estou salvando o HTML gerado como uma string e preciso fazer uma pesquisa inversa mais tarde.
11308 David Hellsing #:

4
@ExplosionPills Um exemplo é o requiredatributo para validação de formulário HTML5. Tenho certeza de que existem muitos outros casos de uso válidos.
Zero3

Respostas:


250

A attr()função também é uma função setter. Você pode simplesmente passar uma string vazia.

$('body').attr('data-body','');

Uma string vazia simplesmente criará o atributo sem valor.

<body data-body>

Referência - http://api.jquery.com/attr/#attr-attributeName-value

attr (attributeName, value)


24
+1, mas o OP sabe que é um levantador. O fato de passar uma string vazia funciona, mas nullnão é algo surpreendente.
31412 Jon

2
Javasctipt tem alguns comportamentos estranhos . Saber onde essas estranhezas acontecem eliminará o elemento surpresa: P
Lix

25
Nota: Isso não funciona com o jQuery 1.7.2 (eu sei que não é a versão mais recente), mas o uso $(el).prop('data-body', true)funcionou para mim, onde $(el).attr('data-body', '')acabou configurando data-body = "data-body" para mim.
Patrick O'Doherty 17/05

6
@ PatrickO'Doherty $(el).prop('data-body', true)não funciona para mim. attr()funciona, mas também adiciona uma cadeia vazia como valor do atributo que quero adicionar.
Webdevotion

1
@ Andrew Eu acredito que você está procurando as funções removeAttr / prop . Depende do atributo que você está tentando remover.
Lix

47

Talvez tente:

var body = document.getElementsByTagName('body')[0];
body.setAttribute("data-body","");

2
Só esta solução funcionou para mimvar btn = $(this).get(0); btn.setAttribute("disabled","");
gkiko

1
Depois de mexer com .attr e .prop, como sugerido em todas as outras soluções e comentários aqui, finalmente descobri que voltar (ou pelo menos "a meio caminho") para o JS nativo fez o truque, como sugerido no comente acima ... Felicidades por isso!
TheCuBeMan

22

A resposta aceita não cria mais um atributo somente nome (a partir de setembro de 2017).

Você deve usar o método JQuery prop () para criar atributos somente de nome.

$(body).prop('data-body', true)

Na verdade, parece que estou adicionando "value = 'true'" à minha opção de seleção, em vez de apenas "value". Ugh.
RonLugge 27/02

Fiquei me perguntando como a resposta aceita não continha esta solução! é a maneira mais limpa de usar o jquery.
denns

Infelizmente, não funciona nas opções suspensas selecionadas, no Chrome #
MC9000

7

Você pode fazer isso sem o jQuery!

Exemplo:

document.querySelector('button').setAttribute('disabled', '');
<button>My disabled button!</button>

Para definir o valor de um atributo booleano, como desativado, você pode especificar qualquer valor. Uma sequência vazia ou o nome do atributo são valores recomendados. O que importa é que, se o atributo estiver presente, independentemente do seu valor real, ele será considerado verdadeiro. A ausência do atributo significa que seu valor é falso. Ao definir o valor do atributo desativado como a sequência vazia (""), definimos desativado como true, o que resulta na desativação do botão.

No MDN Element.setAttribute ()


1
O jQuery é muito ruim a esse respeito. O melhor é fazer javascript, para que você não fique louco toda vez que o jquery ou o navegador mudar. Isso vale para todas essas estruturas de clientes com erros.
MC9000

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.