How to add a callback for setAttribute?
Question by Steffi
Is it possible to add a callback on setAttribute on Prototype ?
For this example, I would like to show an alert("done !") when setAttribute() is finished.
img.setAttribute("src", "http://blabla.com/c.jpg");
Answer by alex
You could, but I wouldn’t recommend it.
(function() {
var elementSetAttribute = Element.prototype.setAttribute;
Element.prototype.setAttribute = function() {
whateverFunctionYouWant.call(this);
return elementSetAttribute.apply(this, arguments);
}
})();
This will call whateverFunctionYouWant() when you do something such as document.links[0].setAttribute('href', '/').
You seem to want this to call a callback when you change the src attribute of img elements and the new resource has loaded…
(function() {
var HTMLImageElementSetAttribute = HTMLImageElement.prototype.setAttribute;
HTMLImageElement.prototype.setAttribute = function(attribute, value) {
var image;
if (attribute == 'src') {
image = new Image;
image.addEventListener('load', loaded, false);
image.src = value;
}
return HTMLImageElementSetAttribute.apply(this, arguments);
}
})();
You could overload setAttribute() here with a third parameter, which would be the callback.
In my opinion and experience, I’d create a different function instead for doing this. Modifying prototypes is one thing, but overloading native DOM methods to do extra things sounds like inviting trouble, especially once a developer unfamiliar with what you’ve done looks at the code.
It goes without saying that if you want the latter example to work < IE9, use the attachEvent() fallback for adding the event listener.
Answer by Starx
May be not the golden solution but
img.setAttribute("src", "http://blabla.com/c.jpg");
img.onload = imageCallback;
function imageCallback() { ... }
If you are interested in jQuery, there is plugin called waitforimages that might help.