views:

214

answers:

8

I'm trying to put together a way of marking up various components in HTML that get parsed by a jQuery script and created when the page loads.

For example, at the moment I can put the following in to my page..

<a href="link.html" class="Theme-Button Theme-Button-Style-win2007 Theme-Button-iconLeft Theme-Button-AlignmentCenter Theme-Button-fullWidth">This is a button</a>

When the jQuery script finds it it'll inject the html necessary to create a button with an icon on it and all the necessary events etc.

However, this is messy and requires a lot of long class names. I'd much rather do something like this...

<a href="#" class="Theme-Button" data="{style: 'win2007', icon: 'left', align:'center', fullWidth: true}"></a>

It's not that much shorter but neater in my opinion and requires less parsing. Trouble is, I've done a little bit of research into "expandos" and I'm fairly sure some browsers won't like it and it won't validate.

Anybody got any better suggestions?

+1  A: 

A common solution is to use the rel attribute to store this type of information.

Shawn Steward
Doesn't that completely misuse `rel`?!
T.J. Crowder
A: 

One could also use classes for this sort of thing.

<a href="#" class="Theme-Button Style-win2007 Icon-left Align-Center FullWidth"></a>

You will have to pre define a lot of classes, but it doesn't feel too much different than handling each key value pair that you have to create.

Matthew Vines
+1  A: 

I asked a similar question a few months back and good a few good answers. Also check out the links in bobince's comment.

Pekka
+6  A: 

Go ahead and use an attribute for this, but use a data- prefix on it -- that's the HTML5 way to do it:

<a href="#" class="Theme-Button" data-theme="{style: 'win2007', icon: 'left', align:'center', fullWidth: true}"></a>

It works today (although the W3 validator may complain as its HTML5 support isn't quite ready for prime-time).

T.J. Crowder
How does this work with, ahem, Internet Explorer?
Felix
@Felix: Just fine. It works fine with just about any browser, the only real issue with defining your own attributes was that it caused validation errors (if you were validating), it wasn't specified anywhere (and so in theory, UAs could have ignored them and not made them available to the JS layer or to CSS, although apparently none did), and of course there's the risk of colliding with newly-defined attributes. The great thing about the HTML5 formalization of this is that it address those issues at a stroke. But you don't have to wait, works fine now, even on IE6.
T.J. Crowder
+1  A: 

Use jquery's ".data" property. This is very handy and many people don't know about it.

See this link for more information.

Patrick Karcher
Thanks Patrick.If you look at my username on here and the name on that article you'll see that I wrote it :)Unfortunately, I need people to be able to mark up this stuff in HTML to be parsed by jQuery later so it has to be somewhere in the HTML element, not in a script.
jonhobbs
Awesome! heh heh.
Patrick Karcher
+1  A: 

Look at the jQuery .data() function.

micahwittman
**And be sure to always use boldface**
T.J. Crowder
I used H3, the bold styling was SO's choice :)
micahwittman
A: 

The Prototype library supports:

element.store("key","value")

and

element.retrieve("key","value").

Simple. Nice. Effective.

Diodeus
A: 

Use xhtml with custom elements mixed in from another DTD. or use html5 with custom data- attributes

just somebody