So as an exercise to learn more about jQuery, I decided to redo this little gem using jQuery. Have to say though only technically XHTML compliant, it worked out much better and with less code. So the idea is to have something really easy for non programmers (You know, lesser people) to be able to have a pop up comment added to some chunk of text on a web site. What I came up with before was ok but kind of annoying since it looked like this:
<a onclick="return ShowCommentForPost('1', this, 'THIS IS SO STUPID!');" href="www.byatool.com">word.</a>
Kind of annoying since I would have to explain that ‘1’ is the name and it has to be unique for every one of these, this isn’t really understood by those people, and well it just seems more complicated then it needs to be. So what if I told you it could look like this?
<a href="http://www.byatool.com" class="showItLink" xmlns:comment="hihihi">HI</a>
Gorsh, that seems even better and it works in both IE and Firefox… which might be a first for this site and anything javascript. First let’s get the css out of the way, shall we?
.showItLink { } .postComment { background-color:Gray; border-color:Black; border-style:dotted; border-width:thin; color:White; margin-right:3px; padding:3px; position:absolute; text-decoration:none; z-index:50; }
Most of the is just for looks, but like the older example I’ve called upon the power of position:absolute and z-index well that’s just pulling it in front of everything else.
Next part will be the actual code, and if you take the method from THE POSITION ABSOLUTE POST
function SetTopAndLeft(parentContainer, elementToSet) { var containerPosition; containerPosition = $(parentContainer).position(); $(elementToSet).css({ top: containerPosition.top + 10, left: containerPosition.left + 10 }); }
and add in a simple span creation method:
function CreateDiv(innerText, cssClass) { var spanToAdd; spanToAdd = document.createElement('span'); spanToAdd.className = cssClass; spanToAdd.innerHTML = innerText; return spanToAdd; }
you’re ready for the actual fun part… making sure something pops up when the link is clicked.
jQuery(document).ready //Everything inside this will load as soon as the DOM is loaded and before the page contents are loaded.* ( function() //this is the start of an anonymous method { jQuery(".showItLink").click //find all things with the .showItLink class and assign the click event to the next anonymous method ( function(event) //this is the start of an anonymous method for the click event { var containerPosition; var createdSpan; var comment; comment = jQuery(this).attr("xmlns:comment"); //Get the value from the comment attribute on the link. createdSpan = jQuery(this).children(".postComment"); //Find a possible span already attached to the link if it exists. The span is of class 'postComment' if (createdSpan.length == 0) //span doesn't exist { createdSpan= CreateDiv(comment, "postComment"); //create the span jQuery(this).append(createdSpan); //Add the span to the link jQuery(this).children(".postComment").hide(); //Make sure the new span is hidden } SetTopAndLeft(this, createdSpan); //Set the position of the span jQuery(createdDiv).toggle(); //This will hide if it's showing, show if it's hidden... kind of nice huh? event.preventDefault(); //Equivalent to false. Need this for Firefox. } ); } );
And boom you have something that works. Hooray.
Couple things of note:
.Hide – At first I though this would screw up my class for the span by removing the current class and adding display:none. Turns out it doesn’t harm the original class. Kind of nice.
.Toggle() – This is really nice. It will hide if it is showing and show if hidden. Stupid easy to use and is pretty effective. Just like .Hide, the class of the element is not harmed.
$ versus jQuery – Some people might notice that I am not using the short hand $ for my jQuery calls. Turns out that it might be safer this way. There are other javascript libraries that use the $ short hand like prototype. I ran into this with WordPress since it uses both jQuery and Prototype and blocks jQuery from using $ since it could conflict with other libraries. Weeeee!