Existe alguma maneira de executar o seguinte:
var data = $("#dataTable").data('timer');
var diffs = [];
for(var i = 0; i + 1 < data.length; i++) {
diffs[i] = data[i + 1] - data[i];
}
alert(diffs.join(', '));
Somente se houver um atributo chamado timer de dados no elemento com um ID de #dataTable?
javascript
jquery
Angela
fonte
fonte
data-
atributo, mas haverá dados armazenados no jQuery e vice-versa.Respostas:
NOTA: isso retornará apenas
true
se o atributo de dados não for uma string vazia ou um valor "falsey", por exemplo,0
oufalse
.Se você deseja verificar a existência do atributo de dados, mesmo que vazio, faça o seguinte:
fonte
if ($("#dataTable[data-timer]").length) { ... }
.if ( $("#dataTable").is("[data-timer]") ) { ... }
. Também é mais útil se você já tiver uma referência à tabela em outro objeto jQuery.fonte
if (typeof $('#dataTable').data('timer') !== 'undefined') ...
.typeof
verificação$('#dataTable').data('timer', Date.now())
. Parece que o OP deseja verificar se o atributo de dados real está lá. A solução da @ niiru (ou a que você oferece em um comentário a essa solução) é melhor, neste caso.undefined
consistente. Nós sabemos por quetypeof
é usado para verificar se háundefined
, em alguns casos, mas eu encontrá-lo confuso para vê-lo sendo verificado comtypeof
em um lugar e sem em outro. Além disso, não é como usartypeof
adiciona um monte mais complicado código. Pode ser mais explícito, talvez no máximo redundante, mas dificilmente complicado demais. Entendo o seu ponto, porém, mas diria que não usá-lo seria uma simplificação excessiva. ;]No interesse de fornecer uma resposta diferente das acima; você pode verificá-lo
Object.hasOwnProperty(...)
assim:Como alternativa, se você tiver vários elementos de dados que deseja iterar, poderá variar o
.data()
objeto e iterá -lo da seguinte maneira:Não dizendo que esta solução é melhor do que qualquer uma das outras aqui, mas pelo menos é outra abordagem ...
fonte
data-foo-bar
, em seguida, o cheque deve ser.data().hasOwnProperty("fooBar")
, não.data().hasOwnProperty("foo-bar")
Ou combine com um pouco de baunilha JS
fonte
data()
vez deattr()
, ele não encontrará o atributo :(Você pode usar o método hasData do jQuery.
http://api.jquery.com/jQuery.hasData/
Isso só verificará a existência de quaisquer objetos de dados (ou eventos) no seu elemento, não será possível confirmar se ele possui especificamente um objeto "timer".
fonte
Se você deseja distinguir entre valores vazios e valores ausentes, é possível usar o jQuery para verificar dessa maneira.
Então, a partir da pergunta original, você faria isso.
fonte
Você pode criar um plugin jQuery extremamente simples para consultar um elemento para isso:
Então você pode simplesmente usar
$("#dataTable").hasData('timer')
Pegadinhas:
false
apenas se o valor não existir (éundefined
); Se ele é definido comofalse
/null
elehasData()
ainda vai voltartrue
.$.hasData()
que apenas verifica se algum dado no elemento está definido.fonte
Descobri que isso funciona melhor com elementos de dados definidos dinamicamente:
fonte
Todas as respostas aqui usam a biblioteca jQuery.
Mas o javascript de baunilha é muito direto.
Se você quiser executar um script somente se o elemento com um
id
de#dataTable
também tem umdata-timer
atributo, em seguida, as etapas são as seguintes:fonte
Esta é a solução mais fácil na minha opinião é selecionar todo o elemento que possui determinado atributo de dados:
Aqui está a captura de tela de como funciona.
fonte
Resposta errada - veja EDITAR no final
Deixe-me aproveitar a resposta de Alex.
Para impedir a criação de um objeto de dados, se ele não existir, seria melhor:
Então, onde
$this
não há objeto de dados criado,$.hasData
retornafalse
e ele não será executado$this.data(key)
.EDIT: função
$.hasData(element)
funciona apenas se os dados foram definidos usando$.data(element, key, value)
, nãoelement.data(key, value)
. Por isso, minha resposta não está correta.fonte
Eu precisava de um booleano simples para trabalhar. Como não é definido como não está presente e não é falso, eu uso o
!!
para converter em booleano:Uma solução alternativa seria usar o filtro:
fonte
fonte
.data('timer')
for indefinido, você obterá um TypeError: $ (...). Data (...) é indefinido ao verificardata.length
. Essa é provavelmente a base da pergunta do OP, ou seja, garantir que alguém possa verificar com segurança emdata.length
outro lugar. Além disso, você não seria capaz de dizer com certeza sedata
é uma string, uma matriz ou um objeto, do qual o último pode ou não conterlength
como uma propriedade definida.Você pode verificar pela seleção de atributo css com
fonte
E sobre:
fonte