Building Persistent Sticky Notes with Local Storage

Building Persistent Sticky Notes with Local Storage

Tutorial Details
  • Topic: JavaScript, HTML5 APIs
  • Difficulty: Intermediate
  • Estimated Completion Time: 45 minutes

Final Product What You'll Be Creating

This entry is part 12 of 14 in the HTML5 and You Session
« PreviousNext »

HTML5 local storage is like cookies on steroids; it’s incredibly simple to use and yet still so powerful. In this tutorial, I’ll show you how to create “sticky notes” functionality, that allows your users to take persistent notes while browsing your site.


Step 1: The HTML

Because of the dynamic nature of this project, there isn’t really much to code in the way of regular old semantic markup. We’ll just simulate a web page by putting together some filler content:

	<!DOCTYPE html>
	<html>
	<head>
		<meta charset='utf-8' />
		<title>HTML 5 complete</title>
		<link rel="stylesheet" href="default.css" />
		<link rel="stylesheet" href="stickies/stickies.css" />
		<!--[if IE]>
		<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
		<![endif]-->
	</head>
	<body>
		<article>
			<header>
				<h1> Sample Article Title</h1>
			</header>
			<p>Lorem ipsum dolor. . . </p>
			<!-- a few lorem-ipsum paragraphs later . . . -->
			<footer>
				<p>Copyright 2010 Andrew Burgess</p>
			</footer>
		</article>

		<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
		<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.min.js"></script>
		<script src="json2.js"></script>
		<script src="stickies/stickies.js"></script>
		<script>
		</script>
	</body>
	</html>

There are a few important things to notice here: we’re including two CSS files: the first one is the simple styling for the page, which we’ve called default.css. Then, we’ve got a special CSS files for styles relating to our sticky notes; it’s called stickies.css, and as you can see, it lives in the “stickies” folder. At the bottom, we’re including four scripts:

  • jQuery, from Google’s CDN
  • JQuery UI, from Google’s CDN
  • JSON2, from Douglas Crockford
  • Our own stickies.js, which lives in the “stickies” directory

Then, we’ve got an empty script tag that we’ll use to start the engine a bit later.

And that’s it for HTML!


Step 2: The CSS

The contents of default.css is incredibly simple:

	body {
		margin:0;
		padding:0;
		background:#ccc;
		font:14px/1.5 "Helvetica Neue", Helvetica, Arial, san-serif;
	}
	article, footer, header { display: block; }
	article {
		width:880px;
		background:#fff;
		margin:auto;
		padding:40px;
	}
	article header {
		color:#474747;
		border-bottom:1px solid #474747
	}
	article footer {
		font-size:90%;
		color:#ccc;
	}

That’s it; now, there’s the CSS from stickies.css to look after … but we don’t have that markup yet. So let’s start some JavaScript, and when that’s done, we’ll look at the CSS for the sticky notes.


Step 3: The JavaScript

Here’s the skeleton for our JavaScript application:

	var STICKIES = (function () {
		var initStickies = function () {},
			openStickies = function () {},
			createSticky = function (data) {},
			deleteSticky = function (id) {},
			saveSticky   = function () {},
			markUnsaved  = function () {};
			
		return {
			open   : openStickies,
			init   : initStickies
		};
	}());

We’ve got a few interesting techniques going on here. First is the self-involking function: it might look like we’re assigning a function to the variable STICKIES, but if you look closely at the end of the function, you’ll see that we’re running it right away. As a hint—to remind us that this isn’t a normal function—we’re wrapping the entire function in parentheses. So, STICKIES isn’t a function, it’s the returned value from that function, which is an object, in this case.

That brings us to the next technique: closure. Notice that of the six functions we create, only two of them are exposed to the user (really, only one is necessary for the usage we’re planning; if we wanted to build support for creating notes into your website, we could expose the createSticky and deleteSticky). Even though the self-involking function finishes executing before we even use the methods, we’ll be able to use the other functions that we’ve defined.

Okay, let’s move on to the content of these function.


initStickies

We’ll start by looking at the initStickies function:

	var initStickies = function initStickies() {
		$("<div />", { 
			text : "+", 
			"class" : "add-sticky",
			click : function () { createSticky(); }
		}).prependTo(document.body);
		initStickies = null;
	},

This is pretty simple. We’ll be using jQuery to create elements quite a bit, and we’re using some special syntax in v. 1.4: that’s passing an object literal with the specs for the element as a second parameter to the jQuery function. Here, we’re creating a button to create a new note. That mean we need a new div; we’re setting the text to ”+” and giving it a class “add-sticky”; then, we’re setting a click handler to call the createSticky method (it’s important to call createSticky from inside a function, and not have the click handler call directly to createSticky; this is because createSticky can take a single parameter, and we don’t want that to be the event object). Finally, we’re prepending this div to the body. We end by setting initStickies to null; yes, we’re essentially getting rid of the function that we’re running. This assures us that this function will only be run once; we don’t want the user of our API to inadvertantly add multiple “add note” buttons to page.

openStickies

Let’s move on to the next method, openStickies:

	openStickies = function openStickies() {
		initStickies && initStickies();
		for (var i = 0; i < localStorage.length; i++) {
			createSticky(JSON.parse(localStorage.getItem(localStorage.key(i))));
		}
	},

We start by running initStickies … but what’s with the fancy syntax? Well, you’re probably familiar with && operator: the boolean AND operator. You’d usually use it to check multiple conditions in an if-statement. Here’s what it actually does: it evaluates the first expression, and if that comes out true, it will go on to evaluate the second expression. In this case, if initStickies has not been set to null yet, we’ll run the function. This avoids the error that would come from trying to run a null variable as a function.

Next, we’re looping over each item in localStorage. Here’s what we do in that for-loop (from inside to outside):

  • localStorage.key() is a great function that returns the key name of localStorage value; it takes a number as a paramter. It’s a great way to loop over each item in localStorage.
  • Once we have the key for a stored item, we can pass it to localStorage.getItem() to get its value.
  • Then, we pass that value to JSON.parse(); this comes from Crockford’s library. Because we’re storing a few values for each note, we’re using JSON.stringify() on the other end to turn an object into a JSON string, which we store. Here, we’re converting it from a string back into an object.
  • Finally, we pass that object to createSticky(), which turns it back into a sticky note.

createSticky

Now, let’s look at that createSticky method.

	createSticky = function createSticky(data) {
		data = data || { id : +new Date(), top : "40px", left : "40px", text : "Note Here" }
		
		return $("<div />", { 
			"class" : "sticky",
			'id' : data.id
			 })
			.prepend($("<div />", { "class" : "sticky-header"} )
				.append($("<span />", { 
					"class" : "status-sticky", 
					click : saveSticky 
				}))
				.append($("<span />", { 
					"class" : "close-sticky", 
					text : "trash", 
					click : function () { deleteSticky($(this).parents(".sticky").attr("id")); }
				}))
			)
			.append($("<div />", { 
				html : data.text, 
				contentEditable : true, 
				"class" : "sticky-content", 
				keypress : markUnsaved
			}))
		.draggable({ 
			handle : "div.sticky-header", 
			stack : ".sticky",
			start : markUnsaved,
			stop  : saveSticky	
		 })
		.css({
			position: "absolute",
			"top" : data.top,
			"left": data.left
		})
		.focusout(saveSticky)
		.appendTo(document.body);
	},

Yes, it’s long, but it’s not going to be too hard. First, notice that this function takes a data object; as we just saw in openStickies, we’re passing the stored data to this function. However, if we aren’t passing in any data (i.e., we’re creating a brand new note), we’ll create the default note object. Since all notes have to be created at one point, all notes will start with this configuration. Notice that for the note id, we’re using +new Date(); that prepended unary plus operator converts the date we get from new date to a number, so this statement results in a number representing the number of milliseconds since January 1, 1970. Obviously, this number will be continually changing, so it’s a great way to uniquely identify each note.

The rest of the function is a long string of chained jQuery methods. Before we go through this, notice that we’re returning the result. If we exposed this method to developers using our mirco-API, it would return a reference to the sticky note div element.

So, here’s what’s going on:

  • First, we create the div that is the shell of the sticky note. Using that helpful jQuery 1.4 syntax, we give it a class of “sticky” and the id from the data object.

  • Then, we prepend a div to that one; this div gets a class “sticky-header”. div.sticky-header then gets two spans appended to it. The first, span.sticky-status, gets a click handler that calls the saveSticky function. However, that’s actually a hidden feature: this span will display the status of the sticky: saved or unsaved. There will be a few ways the sticky saves its data to localStorage; it’s possible that the user will think that clicking ‘unsaved’ will save the note, so we’ll provide them with that functionality. The second span, span.close-sticky, will be the delete button: when the user clicks it, we’ll remove the sticky from localStorage, via the deleteSticky method. We pass that method the note id.

  • Next, we’re appending another div to the main div.sticky; notice that we set the html property to data.text; when we save the note’s text, we’re using jQuery’s html() method, because using text() gets rid of line-breaks. We also set contentEditable:true on this div, because it’s the content of the note. As such, it also gets the class sticky-content. Finally, when a key is pressed on this div (meaning the user is changing the content), we want to mark it as unsaved, so we’ll call that function (which we’ll make soon).

  • Now, we’re using the jQuery UI draggable feature to make our sticky note moveable. In our parameter object, we’re using the handle property to make our notes only movable from the header bar. The stack property is a selector for the draggable elements to want to “stack”; by setting this, the currently dragged note will always come to the top. Finally, when we start dragging the note, we want to mark it as “unsaved” (because we have to save its coordinates, too), and when we stop dragging, we’ll save that sticky.

  • Next, we’re setting some styles for our div.sticky; we position it absolutely, and then set its top and left values to the ones in the data object. This way, the note will keep its position as well as its content when we refresh the page.

  • Finally, we’ll set an event handler for when we focusout of the sticky (essentially, click outside it after clicking inside it): we want to save the sticky. Lastly, we’ll append it to the body. For reference, here’s the html structure that we should have generated:

<div class="sticky ui-draggable" id="1281194825332" style="position: absolute; top: 40px; left: 40px;">
	<div class="sticky-header">
			<span class="sticky-status"></span>
			<span class="close-sticky">trash</span>
	</div>
	<div contenteditable="true" class="sticky-content">
		Note Here
	</div>
</div>

And that’s our createSticky function.

deleteSticky

Now we have the deleteSticky function; it’s really simple:

	deleteSticky = function deleteSticky(id) {
		localStorage.removeItem("sticky-" + id);
		$("#" + id).fadeOut(200, function () { $(this).remove(); });
	},

As you recall, the deleteSticky function takes the id of a note as its parameter. localStorage.removeItem() is the method of the hour: we pass it the key to a locally-stored value to remove that key-value pair (Notice that when we store the note data, we’re prepending “sticky-” to the id). Then, we find the element with the given id, fade it our, and remove it. Note deleted!

saveSticky

Second-to-last might be the most important method today: saveSticky: this is the glue that makes it all work.

	saveSticky = function saveSticky() {
		var that = $(this),  sticky = (that.hasClass("sticky-status") || that.hasClass("sticky-content")) ? that.parents('div.sticky'): that,
		obj = {
			id  : sticky.attr("id"),
			top : sticky.css("top"),
			left: sticky.css("left"),
			text: sticky.children(".sticky-content").html()				
		}
		localStorage.setItem("sticky-" + obj.id, JSON.stringify(obj));	
		sticky.find(".sticky-status").text("saved");
	},

The first line is a bit of resolution: there are three different elements we can call this function from. First, we’ll “jQuerify” this into that; then, if the element has either the “sticky-status” or “sticky-content” classes, we’ll get the parent div.sticky; if it doesn’t have either of those classes, then it’s div.sticky itself, so we’ll just use that.

Then, we need to get the values we want to store. As you can see, we’re getting the id, offset from the top and left, and the html of the child .sticky-content; remember, we’re using html() instead of text() because we want to keep the line breaks. Then, we use localStorage.setItem to store the data. Remember, it takes two parameters: the key and the value to store. Since localStorage only stores strings, we use JSON.stringify() to convert the object to a string.

Lastly, change the sticky status to “saved.”

markUnsaved

We’ve got one last function, which is just a helper function:

	markUnsaved = function markUnsaved() {
		var that = $(this), sticky = that.hasClass("sticky-content") ? that.parents("div.sticky") : that;
		sticky.find(".sticky-status").text("unsaved");
	}

Again, we have to start by resolving the reference to div.sticky; once we do, we can simply find the status span and set the text to “unsaved.”

Believe it or not, that’s all the JavaScript.


Step 4: The CSS, Revisited

Now that we know what our sticky note markup is, we can style it. It’s pretty simple; but look it over, and I’ll make a few comments at the end:

	:focus {
		outline:0;
	}
	.add-sticky {
		cursor: default;
		position:absolute;
		top:1px;
		left:1px;
		font-size:200%;
		background:#000;
		color:#fff;
		border:2px solid #fff;
		border-radius:40px;
		-webkit-border-radius:40px;
		-moz-border-radius:40px;
		text-align:center;
		line-height:25px;
		width:30px;
		height:30px;
	}
	.add-sticky:hover {
		background: #474747;
	}
	.sticky {
		width:300px;
		background:#fdfdbe;
		box-shadow:3px 3px 10px rgba(0,0,0,0.45);
		-webkit-box-shadow:3px 3px 10px rgba(0,0,0,0.45);
		-moz-box-shadow:3px 3px 10px rgba(0,0,0,0.45);
	}
	.sticky-content {
		min-height:150px;
		border-left:3px double rgba(238, 150, 122, .75);
		margin-left:30px;
		padding:5px;
	}
	.sticky-header {
		padding:5px;
		background:#f3f3f3;
		border-bottom:2px solid #fefefe;
		box-shadow:0 3px 5px rgba(0,0,0,0.25);
		-webkit-box-shadow:0 3px 5px rgba(0,0,0,0.25);
		-moz-box-shadow:0 3px 5px rgba(0,0,0,0.25);
	}
	.sticky-status {
		color:#ccc;
		padding:5px;
	}
	.close-sticky {
		background:#474747;
		float:right;
		cursor:default;
		color:#ececec;
		padding:1px 5px;
		border-radius:20px;
		-webkit-border-radius:20px;
		-moz-border-radius:20px;
	}

There are a few points of interest here:

  • Some browsers put an outline around elements with contenteditable=true when you’re editing the content. We don’t want that, so we’re getting rid of it with our :focus declaration.
  • The “Add Sticky” button is positioned in the upper-left corner; it looks vaguely similar to the “Add Dashboard Widget” in Mac OS X.
  • We’re using the border-radius and box-shadow CSS3 properties (and their appropriate vendor-prefix incarnations).
  • We’re also using rgba() for our shadow colours. It takes four parameters: the red, greed, and blue colours, and the alpha (transparency) value.

Other than that, it’s just your standard CSS. Here’s what a styled note should look like:

Note

Step 5: Starting The Stickies

Now that we’ve made our API, it’s time to get it started; we can do that from the extra empty script tag in our index.html file:

	STICKIES.open();

Conclusion: The Final Product

Well, we’re done! Here’s the final product in action:

That’s all I’ve got for today; how do you plan to use HTML5 local storage to spice up your web projects? Let me know in the comments!

Note: Want to add some source code? Type <pre><code> before it and </code></pre> after it. Find out more
  • Avi D

    OMG!!! This is soooo way cool….

    I just hope my web-designer will be able to deploy this on an existing WordPress install….it’s just wicked cool this one. Thanks again….

  • http://www.eolians.fr/ Fabrizio

    Really great Tutorial. I enjoy it really very much. Thank you !!!

  • http://www.crearedesign.co.uk Steve Maggs

    Wow. Probably the most compelling reason to use HTML5 I’ve seen yet. Although for a js amateur like myself it isn’t strictly ‘simple’ I can see that it actually is if that makes sense. I understand it so it must be!

    The synergy of HTML, CSS, JS and php thanks to HTML5 is the most exciting thing about it, finally there seems to be a consensus on the way the web will develop. Just need browsers to catch up…

    • http://toolnames.com Dale Hurley

      LocalStorage is not a HTML 5 thing.

      • bill

        um, yeah it is.

      • neonWired

        It is but it’s not confirmed (“Implementors should be aware that this specification is not stable. Implementors who are not taking part in the discussions are likely to find the specification changing out from under them in incompatible ways. Vendors interested in implementing this specification before it eventually reaches the Candidate Recommendation stage should join the aforementioned mailing lists and take part in the discussions.” – W3C ) and might not even exist in the future so it’s pretty useless, you might as well use php sessions which will work reliably cross-platofrm and doesn’t require javascript.

  • http://aaronbentley.co.uk Aaron Bentley

    nice work on local storage, loving html 5 :)

  • Patrick

    What, if you want to write this notes for other users? A more practical usage for such a function?

    Right: In this Case HTML5 is truely useless. You still need MySQL as an ONLINE storage. I really don’t get the point why using html5 to store a simple note locally. A shopping basket would make more sense.

    But okay, technically it’s well explained.

    • http://twelvedesign.ca Twelve Design

      I would argue… it is still nice to be able to comment on some pages you visit, just for your own reference.

      The question I have though is this… does local storage stay alive indefinitely?

      • http://twelvedesign.ca Twelve Design

        No way to edit comments?

        I wanted to say that this thing would work nicely if implemented on other websites, or some special service… being able to share notes with others is a strong seller though!

      • Patrick

        That’s what i mean: It’s a bit useless a “personal note system” on a website via local storage. If someone want writing down a notice, he wouldn’t write it down with such a function. He uses MIcrosofts One Note, a simple textfile or some open source software, but not using such a function on ONE website. This note will be only avaible on that page, he must visit this page again to get this note.

        And: You can’t share that local storaged notes with others. That’s impossible. If you want such a service, than you have to use a database on a webserver. That’s for sure.

    • Katherine Nolan

      Not necessarily. Think of a site with courses, or tutorials. It’s perfectly possible you’d want to leave notes just for your own use, in fact it would be very convenient.

      Notes for other users are called comments surely? This is a different thing entirely and I can see many applications for it.

  • http://roadzer.com Jorge

    Nice tutorial. However, I think you want to say PersistEnt Sticky Notes…, not persistAnt.

  • http://designfortress.com dreame4

    And I say that it’s one of the best tutorials presents tricky and very useful JavaScript features I’ve ever seen on nettuts! Great job and I’m waiting for your another JS tutorials :)

    I think that local storage is fine if you want to give some great functions which do NOT need to create account or user doesn’t need to have access to them via net (but it doesn’t make sense in web apps, does it?). For example, function to customizing elements on page could keep settings in local storage.

    Greetings,
    Adam

  • http://oneofthesedaysblog.com Sam Dalton

    Best article on Nettuts this year. Great work! More HTML5 tuts please :)

  • http://www.thebrisbaneline.com Web Design Portfolio

    I love it technically, but don’t see a real world case to use it… nice though!

  • arnold

    cool! , Im using this as my to-do-list

  • http://www.electecmix.com/ Latavish

    Thanks a million as this does show the usage of local storage. But I think your readers will get alot more out of it by seeing Real World examples.

    • Alex

      OFF: @Latavish, your website might be having a bad day :p if you haven’t allready, might wanna check it out

      ON: Fantastic tut :) already thought of a bunch of situations where this could come in really handy.

  • http://www.pressedweb.com Cory

    I’m loving these HTML5 tutorials, and it’s amazing to see this stuff appearing in real-world situations already. Probably thanks in large part to the sudden light you guys are shedding on HTML5/CSS3.

  • http://pobozniak.pl Darek Pobożniak

    Very usefull article, I’ll use your tips in my html5 project to make a ToDo list. Thanks.

  • http://psdho.me PSDhome – Everyday free PHOTOSHOP files

    Awesome HTML5 tutorial. Thanks.

  • http://connorcrosby.me Connor Crosby

    Awesome! Thanks for sharing.

  • KanZonk

    I using Firefox 3.6.8 , How to close that ??

    • http://andrewburgess.ca Andrew Burgess
      Author

      Not sure I understand your question, but I’ll mention that even though FireFox is supposed to be able to support localStorage as of v.3.6, I couldn’t get this project to work in FF on either Windows or Mac.

      • Neno

        I use FF v.3.6 and it works great.

        P.S. Thanks for great article

      • Daniel

        It works perfectly for me in firefox 3.6.8 on windows 7

        and thanks for a great tut Andrew! very well written. the “initStickies && initStickies();” part was new to me..

      • Sahan

        Click the “Trash Button” ?

        Great Article!

    • KanZonk

      Ow sorry, it’s works…..

      I don’t know, yesterday I can’t close that sticky…

      after Restarting that’s works perfectly.

      Thanks..

  • http://www.aediscreative.com Christopher

    High quality tut. Someday I’ll be able to use HTML5 for more than just playing around. :)

  • http://www.firedartonline.com/ FireDart

    I was just wondering, could you use the Stylish Add-on for FireFox to create the same effect for each page? Then you could have sticky notes everywhere you go?

    Stylish Add-on:
    https://addons.mozilla.org/en-US/firefox/addon/2108/

    Maybe I should try it out :)

  • Popovich

    Amazing tutorial.

    I would like to see in nettuts some more Object Oriented Javascript for beginners.

    Thank you and keep them coming;)

  • http://okasoft.net Okaman

    Planning to use it in one of the projects I’m working on to store list of audio tracks users have listened to. So they can have a permanent-ish trail blaze. Thanks

  • http://www.superdwayne.co.uk Dwayne Paisley-Marshall

    Another awesome “App” from HTML5

  • http://adrusi.com/ adrian

    That’s a good example of an HTML5 app (although technically localstorage is not part of the html5 spec) however there could be some improvements. It seems a lot of developers forget about the unload event in javascript, using that it would be possible to save the stickies when ever the page is reloaded or closed, that way users don’t have to worry about saving anything.

    • http://adrusi.com/ adrian

      This is off-topic, but how did you get the buttons without borders in google chrome?!

      • http://andrewburgess.ca Andrew Burgess
        Author

        That’s a really good idea, Adrian. The quickest way to implement it would be to add this to the initStickies function:

        $(window).unload(function () {
            $("div.sticky").each(function (i, el) {
                $(el).focusout();
            });	
        });
        

        I’m just forcing each note to focus out before the page closes, which will save each one; if you anticipate a lot of notes, you could filter out the ones that are already saved. Actually, I think it would be better to refactor saveSticky so that it accepts a note id as a parameter.

        Oh, and if you’re talking about the “trash” button, it’s not really a button, just a span.

  • Zehra Nasif

    Outstanding post; thanks!

  • ramonekalsaw

    Very cool. I have a site where the focus is education and this tool will give people the opportunity to take notes … simple, yet elegant … Thanks!

  • Grammar

    Persistent, not persistant

  • http://www.radical.co.in Web Development Bangalore

    Nice article, thanks for sharing. We will try to implements your tips in our projects.

  • Dainel Vera

    Can the notes stay alive even after the browser has been close, and wen the site is revisit the notes i had left come back up to the screen ???

    And awsome tutorial it blow my mind away.

  • http://www.e11world.com e11world

    Very clever way of doing this and again, I love how simple it is!

  • Horst

    Nice toturial. But I’ve got a problem when saving the notes offline in Firefox. I save them and after refreshing the site they are away… can anyone help me?

  • http://www.etnassoft.com Etnas

    Great tutorial, thanks!
    It would be very interesting to save a note on Firefox and load it on Chrome or vice versa…

  • Nick

    Great tutorial! Some people might not find this tutorial useful but the implementation and code examples are well worth it. Thanks!

  • shivek khurana

    Doesn’t work in firefox.

    • Horst

      Yes… I thought so too but when you use the online example it works. Unfortunately it doesn’t work offline in Firefox. I mentioned this Problem 4 Posts before.

      Can anyone help?

  • http://codendesign.blogspot.com nXqd

    Thanks for this great post , I help me understand and know more about localStorage in HTML5. It’s very nice, and comprehensive post Andrew.
    nXqd

  • http://www.educsis.com Edwin

    I would like to integrate this as a service, so that people can leave notes on the site i’m creating, and then i can view it. I mean, how can i save it on a database?

  • Emre

    Great work! Thanks.

    How do I address the normal link?

    Stickies

  • http://kmi.open.ac.uk/ Damian

    If this could be turned into a browser plugin I think it would have more use, to be able to create sticky notes per site would be an awesome feature

  • http://sticky.chuprinastudios.com/ PChuprina

    Fantastic tutorial!!

    I have a question: How would i go about positioning the “.add-sticky” and the “post-it notes to be contained in a wrapper with a margin: auto positioned on the body. This can be seen at http://bit.ly/gxy2gp with the area bordered with yellow.

    Thanx

  • http://www.smartrandom.com Carlos

    Hello. I installed your script on my site. But I have this problem: Everytime I re-open the page (or page re-loads) All the stickies I have ever created re-appear. Even if I have trashed them! So I have a huge collection of them, and I have to trash them one by one, every time.
    Please help!
    Thanks.

  • warren

    Is there a way to minimise the note window?

  • http://blog.evolya.fr/ evolya

    Really great Tutorial. Thank you !!

  • Alex

    The drag and drop doesn’t work on IE9. Did anyone managed to make it work?

  • Lenore

    This is wonderful. I’ve been trying to figure out how to let my students take notes in their html-based textbook and this is a great start. There’s no reason to share. The source is on their computer/tablet. I want them to be able to study on the bus on the way to a soccer game with no internet available.

  • http://www.canada-goosesales.com canada-goosesales

    Hope to continue to share the follow-up

  • http://www.cheatfusd.com Josh

    This is a very great tutorial. Thank you! I was wondering, is there something similar to this that is persistent across the web and not just on a local site? Even if it uses a database, but iI have been looking for something like this exactly. Thanks again.

  • http://darrenjonesdesign.com Darren

    Thank you for the great tutorial. I tried this on an ipad and everything thing works great except for the dragging of the sticky notes. Can anyone help me with this? Thanks in advance!

  • http://www.jqueryrain.com Sanchit

    Thanks for this Gr8 Tutorial…

  • Aditya

    if i only want to display the sticky note when the page is loaded instead of clicking it ?
    Please help me out ..Thanks in advance!!

  • FRANKLYN AZUBUIKE

    please how do i download all about the unn website on my ipad?