Como armazenar dados arbitrários para algumas marcas HTML

Estou a fazer uma página que tem alguma interacção fornecida pelo javascript. Apenas como exemplo: links que enviam um pedido AJAX para obter o conteúdo dos artigos e, em seguida, exibir esses dados em um div. Obviamente neste exemplo, eu preciso de cada link para armazenar um bit extra de informação: o id do artigo. A forma como tenho lidado com isto, no caso de ter sido para colocar essa informação no link href, isto é:

<a class="article" href="#5">

Eu então uso jQuery para encontrar os elementos do artigo A. e anexar o evento apropriado manipulador. (Não fique muito obcecado com a usabilidade ou semântica aqui, é apenas um exemplo)

de qualquer forma, este método funciona, mas ele cheira um pouco, e não é extensível de todo (o que acontece se a função click tem mais do que um parâmetro? e se alguns desses parâmetros forem opcionais?)

a resposta imediatamente óbvia era usar atributos no elemento. É para isso que servem, certo? (Meio).

<a articleid="5" href="link/for/non-js-users.html">

na minha recente pergunta perguntado se este método era válido, e acontece que a falta de definir o meu próprio DTD (eu não), então não, não é válido ou confiável. Uma resposta comum foi colocar os dados no atributo class (embora isso possa ter sido por causa do meu exemplo mal escolhido), mas para mim, isso cheira ainda mais. Sim, é tecnicamente válido, mas não é uma boa solução.

outro método que eu tinha usado no passado era gerar alguns JS e inseri - los na página numa etiqueta <script>, criando uma estrutura que se associaria ao objecto.

var myData = {
    link0 : {
        articleId : 5,
        target : '#showMessage'
        // etc...
    },
    link1 : {
        articleId : 13
    }
};

<a href="..." id="link0">
Mas isto pode ser uma grande dor de cabeça para manter e é geralmente muito desarrumado.

então, para chegar à pergunta, Como é que se armazenam pedaços arbitrários de informação para etiquetas HTML?

Author: Community, 2009-01-11

20 answers

Que versão de HTML está a usar?

No HTML 5, é totalmente válido ter atributos personalizados precedidos de dados - , por exemplo

<div data-internalid="1337"></div>

Em XHTML, isto não é realmente válido. Se você estiver no modo XHTML 1.1, o navegador provavelmente irá reclamar sobre ele, mas no modo 1.0, a maioria dos navegadores irá simplesmente ignorá-lo silenciosamente.

Se fosse a ti, seguiria a abordagem baseada no guião. Você pode fazê-lo gerado automaticamente no lado do servidor para que não seja uma dor no de volta para manter.
 339
Author: Tamas Czinege, 2017-06-30 15:42:26

Se já está a usar o jQuery, então deve usar o método "dados", que é o método recomendado para armazenar dados arbitrários num elemento dom com o jQuery.

Para guardar algo:

$('#myElId').data('nameYourData', { foo: 'bar' });

Para obter dados:

var myData = $('#myElId').data('nameYourData');

Isso é tudo o que há para ele, mas dê uma olhada na documentação jQuery Para mais informações/exemplos.

 131
Author: Prestaul, 2009-01-11 04:31:31
{[[2]} apenas de outra maneira, eu pessoalmente não usaria isso, mas funciona (assegurar que o seu JSON é válido porque eval() é perigoso).
<a class="article" href="link/for/non-js-users.html">
    <span style="display: none;">{"id": 1, "title":"Something"}</span>
    Text of Link
</a>

// javascript
var article = document.getElementsByClassName("article")[0];
var data = eval(article.childNodes[0].innerHTML);
 20
Author: Luca Matteis, 2009-01-11 03:48:33

Atributos arbitrários não são válidos, mas são perfeitamente confiáveis nos navegadores modernos. Se você está configurando as propriedades através de javascript, então você não tem que se preocupar com a validação também.

Uma alternativa é definir atributos em javascript. jQuery tem um bom método de utilidade {[[4]}só para esse fim, ou você pode rolar o seu próprio.

 12
Author: Eran Galperin, 2009-01-11 02:21:40
Um hack que vai funcionar com praticamente todos os navegadores possíveis é usar aulas abertas como esta.: <a class='data\_articleid\_5' href="link/for/non-js-users.html>; Isto não é assim tão elegante para os puristas, mas é universalmente apoiado, compatível com as normas e muito fácil de manipular. Parece ser o melhor método possível. Se serialize, modificar, copie as suas marcas, ou Faça praticamente qualquer outra coisa, data ficará ligado, copiado, etc.

O único problema é que você não pode armazenar objetos não serializáveis dessa forma, e pode haver limites se você colocar algo realmente enorme lá.

Uma segunda maneira é usar atributos falsos como: <a articleid='5' href="link/for/non-js-users.html">

Isto é mais elegante, mas quebra o padrão, e não tenho 100% de certeza quanto ao apoio. Muitos navegadores suportam totalmente, eu acho que o IE6 suporta JS acesso para ele, mas não CSS selectors (o que realmente não importa aqui), talvez alguns navegadores ser completamente confuso, você precisa verificar.

fazer coisas engraçadas como serializar e deserializar seria ainda mais perigoso.

Usar ids para limpar JS o hash funciona principalmente, excepto quando se tenta copiar as etiquetas. Se tem tag <a href="..." id="link0">, Copie-o através dos métodos standard JS, e depois tente modificar data anexado a apenas uma cópia, a outra cópia será modificada.

Não é um problema se você não copiar tags, ou usar leia apenas Dados. Se você copiar tag e eles forem modificados você vai tenho de tratar disso manualmente.

 10
Author: taw, 2014-11-06 09:50:20

Usando jquery,

Para conservar: $('#element_id').data('extra_tag', 'extra_info');

Para recuperar: $('#element_id').data('extra_tag');

 7
Author: user2458978, 2015-07-20 17:21:39
Sei que estás a usar o jQuery, mas e se definires a linha do tratador de onclick? Então você poderia fazer:
 <a href='/link/for/non-js-users.htm' onclick='loadContent(5);return false;'>
     Article 5</a>
 6
Author: tvanfosson, 2009-01-11 02:15:09

Podes usar etiquetas escondidas. Não recebo erros de validação em w3.org com isto:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
  <head>
    <meta content="text/html;charset=UTF-8" http-equiv="content-type" />
    <title>Hello</title>
  </head>
  <body>
    <div>
      <a class="article" href="link/for/non-js-users.html">
        <input style="display: none" name="articleid" type="hidden" value="5" />
      </a>
    </div>
  </body>
</html>

Com jQuery obteria o ID do artigo com algo como (não testado):

$('.article input[name=articleid]').val();
Mas eu recomendaria HTML5 se for uma opção.
 6
Author: phylae, 2011-11-12 08:48:02

Porque não fazer uso dos dados significativos já existentes, em vez de adicionar dados arbitrários?

Isto é, use <a href="/articles/5/page-title" class="article-link">, e então poderá programaticamente obter todas as ligações de artigos na página (através do nome da classe) e no ID do artigo (correspondente à expressão regular /articles\/(\d+)/ contra this.href).

 4
Author: , 2009-01-11 02:28:11
 4
Author: Robin Smidsrød, 2009-08-20 13:12:00
Então, devem haver quatro opções para o fazer:
  1. Coloque os dados no atributo id.
  2. Coloque os dados no atributo arbitrário
  3. Coloque os dados no atributo class
  4. Coloque os seus dados noutra etiqueta

Http://www.shanison.com/?p=321

 3
Author: Shanison, 2010-06-06 12:45:40

Defendo a utilização do atributo" rel". O valor XHTML, o próprio atributo é raramente usado, e os dados são recuperados de forma eficiente.

 2
Author: demonkoryu, 2009-10-27 15:13:22
Este é um bom conselho. Graças a @Prestaul

Se já está a usar o jQuery, então deve usar os "dados" método que é o método recomendado para armazenar dados arbitrários em elemento dom com jQuery.

Muito verdadeiro, mas e se você quiser armazenar dados arbitrários em HTML simples? Aqui está outra alternativa...

<input type="hidden" name="whatever" value="foobar"/>

Coloque os seus dados no nome e valor atributos de um elemento de entrada escondido. Isto pode ser útil se o servidor for gerando HTML (isto é, um script PHP ou qualquer coisa), e seu código JavaScript vai usar esta informação mais tarde.

Admito que não é o mais limpo, mas é uma alternativa. É compatível com todos navegadores e é válido XHTML. Você deve Não usar atributos personalizados, nem deve realmente usar atributos com o prefixo' data -', pois pode não funcionar em todos os navegadores. E, além disso, o seu documento não passará na Validação W3C.
 2
Author: BMiner, 2011-10-11 16:47:54

Você poderia usar o prefixo de dados do seu próprio atributo feito de um elemento aleatório (<span data-randomname="Data goes here..."></span>), mas isto só é válido no HTML5. Assim, os navegadores podem reclamar sobre a validade.

Também pode usar uma etiqueta <span style="display: none;">Data goes here...</span>. Mas desta forma você não pode usar as funções do atributo, e se css e js for desligado, esta também não é realmente uma solução limpa.

Mas o que eu pessoalmente prefiro é o seguinte:

<input type="hidden" title="Your key..." value="Your value..." />

A entrada será em todos os casos escondida, os atributos são completamente válido, e não será enviado se estiver dentro de uma tag <form>, Uma vez que não tem nenhum nome, certo? Acima de tudo, os atributos são realmente fáceis de lembrar e o código parece agradável e fácil de entender. Você pode até colocar um atributo ID nele, para que você possa facilmente acessá-lo com JavaScript também, e acessar o par de valores de chave com input.title; input.value.

 2
Author: Yeti, 2012-08-24 16:54:10
Uma possibilidade pode ser:
  • Crie um novo div para manter todos os dados extensos / arbitrários
  • Fazer algo para garantir que este div é invisível (por exemplo, CSS mais um atributo de classe do div)
  • Coloque os dados EXTENDIDOS / arbitrários dentro de [X]tags HTML (por exemplo, como texto dentro de células de uma tabela, ou qualquer outra coisa que você possa gostar) dentro deste div invisível
 1
Author: ChrisW, 2009-01-11 02:56:06

Outra abordagem pode ser armazenar uma chave: par de valores como uma classe simples, usando a seguinte sintaxe:

<div id="my_div" class="foo:'bar'">...</div>

Isto é válido e pode ser facilmente obtido com selectores jQuery ou uma função personalizada.

 1
Author: Raphaël, 2011-10-27 15:37:00

Desde que o seu trabalho seja feito, serverside, porque é que precisa de informação personalizada nas marcas de html no resultado? tudo o que você precisa saber de volta no servidor é um índice em qualquer tipo de Lista de estruturas com a sua informação personalizada. Acho que estás a tentar guardar a informação no sítio errado.

Reconhecerei, por mais lamentável que seja, que em muitos casos a solução certa não é a solução certa. Nesse caso, eu sugeriria fortemente gerar algum javascript para manter a informação extra.
 0
Author: Kris, 2009-01-11 04:32:21

No meu empregador anterior, usávamos tags HTML personalizadas o tempo todo para manter informações sobre os elementos do formulário. A captura: nós sabíamos que o usuário foi forçado a usar IE.

Não funcionou bem para o FireFox na altura. Não sei se o FireFox mudou isto ou não, mas esteja ciente de que adicionar seus próprios atributos a elementos HTML pode ou não ser suportado pelo navegador do seu leitor.

Se puder controlar o navegador que o seu leitor está a usar (isto é, uma 'applet' Web interna para um corporation), então por todos os meios, tente. O que pode doer, certo?

 0
Author: Jerry, 2009-01-11 05:52:44
É assim que faço as páginas do ajax... é um método muito fácil...
    function ajax_urls() {
       var objApps= ['ads','user'];
        $("a.ajx").each(function(){
               var url = $(this).attr('href');
               for ( var i=0;i< objApps.length;i++ ) {
                   if (url.indexOf("/"+objApps[i]+"/")>-1) {
                      $(this).attr("href",url.replace("/"+objApps[i]+"/","/"+objApps[i]+"/#p="));
                   }
               }
           });
}

Como isto funciona é que basicamente olha para todos os URLs que têm a classe 'ajx' e substitui uma palavra-chave e adiciona o sinal#... se o js for desligado, as urls agirão como normalmente fazem... todos os "apps" (cada seção do site) tem sua própria palavra-chave... então tudo que eu preciso fazer é adicionar ao array js acima para adicionar mais páginas...

Por isso, por exemplo, a minha configuração actual está definida como:

 var objApps= ['ads','user'];
Então ... se eu tiver um url como:

Www.domain.com/ads/3923/bla/dada/bla

O programa js substituiria a parte / ads / para que o meu URL acabasse por ser

Www.domain.com/ads/#p=3923/bla/dada/bla

Então eu uso o plugin jquery bbq para carregar a página de acordo...

Http://benalman.com/projects/jquery-bbq-plugin/

 0
Author: jason, 2011-04-30 12:51:34

Eu encontrei o plugin de metadados para ser uma excelente solução para o problema de armazenar dados arbitrários com a tag html de uma forma que torna fácil de recuperar e usar com jQuery.

Importante: O arquivo real incluir é apenas 5 kb e não 37 kb (que é o tamanho do download completo do pacote)

Aqui está um exemplo de que ele está sendo usado para armazenar os valores que eu uso ao gerar um evento de rastreamento do google analytics (nota: dados.rótulo e dado.o valor é facultativo)

$(function () {
    $.each($(".ga-event"), function (index, value) {
        $(value).click(function () {
            var data = $(value).metadata();
            if (data.label && data.value) {
                _gaq.push(['_trackEvent', data.category, data.action, data.label, data.value]);
            } else if (data.label) {
                _gaq.push(['_trackEvent', data.category, data.action, data.label]);
            } else {
                _gaq.push(['_trackEvent', data.category, data.action]);
            }
        });
    });
});

<input class="ga-event {category:'button', action:'click', label:'test', value:99}" type="button" value="Test"/>
 0
Author: biofractal, 2011-09-09 14:31:12