clickCatcher

A click on chosen links before JavaScript events have been applied to them will be put in a queue and called when all event handlers are in place. That will take 5 seconds, since there's a delay applied to a script applying the events.

Script loaded: false

Go to robertnyman.com (click on this won't be prevented)

A click on this image will be prevented, and then called when its events have been applied

Rano Raraku hillside

Code used

clickCatcher

				// By Robert Nyman, http://robertnyman.com/clickcatcher/ - This content is released under the (Link Goes Here) MIT License: http://www.opensource.org/licenses/mit-license.php
				(function () {
					function addEvent(elm, evt, func) {
						if (elm.addEventListener) {
							elm.addEventListener(evt, func, false);
						}
						else {
							elm.attachEvent(("on" + evt), func);
						}
					}

					function removeEvent(elm, evt, func) {
						if (elm.removeEventListener) {
							elm.removeEventListener(evt, func, false);
						}
						else {
							elm.detachEvent(("on" + evt), func);
						}
					}

					// fireEvent by Jehiah Czebotar, http://jehiah.cz/archive/firing-javascript-events-properly
					function fireEvent(element, event) {
						var evt;
						if (document.createEvent) {
							// dispatch for firefox + others
							evt = document.createEvent("HTMLEvents");
							evt.initEvent(event, true, true ); // event type,bubbling,cancelable
							return !element.dispatchEvent(evt);
						} else {
						// dispatch for IE
							evt = document.createEventObject();
							return element.fireEvent('on'+event,evt);
						}
					}

					clickCatcher = function () {
						var clicks = [],
							addClicks = function (evt) {
								var classCheck = /catch/,
									body = /body/i,
									target = (evt.target)? evt.target : evt.srcElement;

								while (!classCheck.test(target.className) && !body.test(target.nodeName)) {
									target = target.parentNode;
								}

								if (classCheck.test(target.className)) {
									clicks.push(target);
									if (evt.preventDefault) {
										evt.preventDefault();
									}
									evt.returnValue = false;
									return false;
								}
							},
							callClicks = function () {
								removeEvent(document, "click", addClicks);
								for (var i=0, il=clicks.length; i<il; i++) {
									fireEvent(clicks[i], "click");
								};
							},
							init = function () {
								addEvent(document, "click", addClicks);
								// Could be called here, but now called manually in script loaded later - adapt to your situation
								//addEvent(window, "load", callClicks);
							};

						return {
							init : init,
							callClicks : callClicks
						};	
					}();
					clickCatcher.init();
					return clickCatcher;
				})();
			

Page-specific script in this demo (in the clicks.js file)

				var scriptLoaded = document.getElementById("script-loaded"),
					imageLink = document.getElementById("image-link");

				// Shows when the script is loaded	
				scriptLoaded.innerHTML = "true";
				scriptLoaded.className = "loaded";

				// Assigns click event to it
				imageLink.onclick = function () {
					if (confirm("Sure you want to go to the image page?")) {
						location.href = imageLink.href;
					}
					return false;
				};

				// Call callClicks of clickCatcher
				clickCatcher.callClicks();