2011-11-08 2 views
4

Dans une application intranet, j'ai des éléments HTML avec des balises personnalisées. Il existe plusieurs types de variables, data-mem en est un exemple. Dans le balisage, il ressemble à ceci:Attribut Parse json

<a href="something.html" data-mem='{varname: "value", varname2: "value"}'>Bla Bla</a> 

Ce que je veux faire est d'obtenir l'attribut JSON et utiliser les paires nom/valeur dans un appel de méthode JS. Note: les noms et les valeurs sont inconnus et dynamiques et j'utilise jquery.

RegEvent('varname','values','varname2','value'); 

Ce que je l'ai fait jusqu'à maintenant est obtenir la liste de toutes les balises contenant un attribut de données mem:

var objs = $('a[data-mem]'); 

Je suis un peu perdu maintenant. Je ne sais pas vraiment comment continuer. Des suggestions?

Merci!

Répondre

3

la partie d'extraction de votre problème a été bien répondu par quelques p personne Il semble que vous essayez également d'obtenir une conversion arbitraire de {a:1, b: 2} à RegEvent('a', 1, 'b', 2). Pour ce faire, il vous suffit de parcourir les arguments du JSON stocké et de construire un tableau d'arguments. Une fois terminé, vous pouvez RegEvent.apply transmettre ces arguments à la fonction.

$('a[data-mem]').each(function(){ 
    var data = $(this).data('mem'), 
     args = []; 

    $.each(data, function(name, value) { 
     args.push(name); 
     args.push(value); 
    }); 

    RegEvent.apply(null, args); 
}); 
+0

+1 pour '.apply()'. Beaucoup plus propre que ma solution. J'ai vraiment besoin de finir de lire (et d'absorber) _Javascript: The Good Parts_ par Douglas Crockford ... – GregL

+0

Ne le prenez pas trop au sérieux. Certaines de ses mauvaises parties sont mes parties préférées. –

+0

J'ai changé d'avis :) Ceci est une réponse plus complète. Je vous remercie! –

5

La méthode ".data()" de jQuery le fait automatiquement.

var data = $('#yourId').data('mem'); 

Puis "data.varname" sera "valeur", etc.

modifier — donné votre code HTML, puisque vous ne l'avez pas donné une classe ou "id" à votre balise <a>, je devinez que vous pourriez faire:

var data = $('a[data-mem]').data('mem'); 

Il pourrait être préférable de trouver un bon moyen de distinguer l'élément en question. Cela dépend du reste du code bien sûr.

modifier à nouveau — également le JSON doit être valide - les noms de propriété doivent être indiqués.

+0

il me donne http://jsfiddle.net/nu3kz/1/ non définie – Rafay

+0

C'est parce que vous ne l'avez pas mis un « id » sur l'élément; Désolé, je donnais juste un exemple. Je vais éditer la réponse. – Pointy

+0

Merci pour la réponse. Le problème est que je ne sais pas toujours quel varname est @ code time, donc je ne saurais pas quels accessoires de données accéder dans ce cas. –

1

Vous pouvez utiliser eval() pour convertir la chaîne JSON en un objet JS réel.

Toutefois, à partir de my test, il semble que vous devrez vous assurer que les noms de propriété sont cités (c'est-à-dire "varname": "value" au lieu de varname: "value").

Et comme dit @Pointy, vous pouvez simplement utiliser la méthode jQuery .data() pour récupérer la chaîne.

donc votre code HTML est comme ceci:

<a href="something.html" data-mem='{"varname": "value", "varname2": "value"}'>Bla Bla</a> 

Et votre Javascript devient:

var data = eval($('a').data('mem')); 
// build up an array of properties and values 
var prop, valueArray = [], propArray = []; 
// iterate over the properties in the object 
for (prop in data) { 
    // make sure it hasn't come from the prototype chain 
    if (data.hasOwnProperty(prop)) { 
     propArray.push(prop.toString()); 
     valueArray.push(data[prop]); 
    } 
} 
// now, assuming your function always takes 4 parameters, you can just return the first two pairs of properties and values: 
RegEvent(propArray[0], valueArray[0], propArray[1], valueArray[1]); 

L'exemple ci-dessus montre comment vous pouvez utiliser les capacités de réflexion de javascript pour répondre à tous les noms de propriété.

EDIT: Code mis à jour pour montrer comment gérer les noms de propriété.

+0

Le problème est que je ne connais pas le nom ou le nombre de propriétés que je vais avoir dans la chaîne JSON, donc je ne saurais pas à quelles propriétés accéder une fois que j'ai l'objet. –

2

comme @GregL dit que vous devez citer la clé pour en faire un JSON valide et que vous pouvez passer la fonction de votre JSON et processus à l'intérieur de la fonction comme la clé et les valeurs sont dynamiques

var data = $("a").data("mem"); 
RegEvent(data); 

et à l'intérieur la fonction que vous pouvez faire une boucle à travers le JSON comme

$.each(data,function(key,value){ 
     console.log(key); 
console.log(value); 
     }); 

http://jsfiddle.net/nu3kz/3/

+0

C'est ce que je cherchais. Merci!] –