Sunday, October 12, 2008

Simple JQuery UID Plugin

UID's can be tricky to make, but here's a simple one for discussion.

I'm posting this to see if anyone can make it a little safer to prevent collisions and/or improve the algorithm. Any thoughts? The prefix allow you to create uids you can select with a prefix on. The random string will give you a fairly large but not unmanageable string. We'll also return the JQuery instance so we can continue our chain.

$.fn.uid = function(prefix) {
if (!prefix) {
prefix = "uid";
var generate = function() {
var dt = new Date().getMilliseconds();
var num = Math.random();
var rnd = Math.round(num*100000);
return prefix+dt+rnd;
return this.each(function() { = generate();
return $;

$().ready(function() {

Oui? Non?


cwillu said...

* teppi|work has quit (Read error: 113 (No route to host))
[cwillu_remote] ajpiano, he could just increment a counter instead of the whole 'date and random' thing
[cwillu_remote] they're gonna be regenerated on each page load anyway
[ajpiano] i think his idea is to come up with a number that no one on the entire internet has ever heard of
[cwillu_remote] ajpiano, he's reinventing uuid's, badly?
[ajpiano] post a comment
[cwillu_remote] done.


Pau Sánchez said...

I agree the previous coment, incrementing a variable would be easier.

Here you have an example code:

var _next_uid = 0;
$.fn.uid = function(prefix) {
return this.each(function() { = (prefix || 'uid') + (_next_uid++);
return $;

As you can see the new extension is much more simple.

For testing you could try this:

$(document).ready (function () {
for (i = 0; i < 100; i++) {
$("<" + "div>new div<" + "/" + "div>").uid ().appendTo ('body');

Sorry for splitting the "div" tag, but I had trouble publishing html tags (it is not allowed).

Alan L said...

I agree with the date + random method though, since that function does not need to consider any variable scopes - what if you need to run the UID function in more than one scope? The incremental method would cause collisions.