On Feb 22, 8:19 am, Mark McDonnell <[email protected]> wrote:
> Hi there,
>
> I need help understanding the Adapter design pattern so I can help
> standardise the API usage on a library I'm working on.
>
> Let me clarify that I mention the Adapter design pattern but if there is
> another way to do what I want to do then please feel free to mention those
> alternatives!
>
> What I'm trying to achieve is if the browser uses the attachEvent method then
> to adapt the API so the user only has to write out a standard
> addEventListener method but really this passes onto the attachEvent function.
>
> Yes you could write an API like myapp.addEvent = function(){ /* code
> branching here */ } but I'm not looking for that. I'm looking for something
> that might not even be possible :)
Aren't "addEvent" functions an implementation of the adapter design
pattern? Perhaps a "forking adapter pattern"?
> The problem I have found is that I have no way to completely integrate a
> missing method such as the addEventListener method. So for example if I do
> window.addEventListener = function(){ /* call attachEvent and pass through
> arguments */ } then that would only work for when the user writes
> window.addEventListener and not something like
> document.getElementById('test').addEventListener('click', function(e){
> console.log(e); }, false);
>
> So how would you try and accommodate every possible element.addEventListener
> variant?
addEventListener is part of interface EventTarget[1] and is
implemented by all Nodes (in W3C DOM compliant UAs). If all your
target host environments implement prototype inheritance and make a
suitable prototype publicly available, you could add a method to that
prototype. In Firefox, there is Element.prototype, so:
if (Element && Element.prototype) {
if (typeof Element.prototype.addEventListener != 'function') {
...
}
}
But that is a bad strategy for a number of reasons, such as:
1. Attempting to access any non-function property of
Element.prototype in Firefox throws an illegal operation error.
2. IE doesn't expose any kind of prototype inheritance that can be
used this way
>
> BTW I appreciate that this may not even be possible, I just wanted to mess
> around with it a bit and see what fun stuff I could play with.
Have a look at Prototype.js, it messes with host objects and their
prototypes (where it can). That is a major reason why few who know
scripting well recommended its use. I believe the maintainers are
changing it for version 2.0 so that it no longer augments host
objects. It took them a long time to accept that modifying
Object.prototype was a bad idea, Array.prototype is still augmented.
> I was thinking I could try looping through the window object adding the
> method but that could potentially take 'ages'.
You mean loop over every element in the DOM. Yes, it would take a
while and besides, you only want the method on the elements that you
wish to call it from.
>
> I also appreciate that there is a right and wrong way to do things and that a
> lot of people will say 'thats wrong' but I'm more interested in whether it's
> possible to do rather than arguments about extending host objects is bad, etc
> etc which I'm aware of already.
See above. In Firefox and similar browsers you can do:
Element.prototype.foo = function() {
alert('foo!!');
}
window.onload = function() {
document.getElementById('someId').foo();
}
1. <URL: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget
>
--
Rob
--
To view archived discussions from the original JSMentors Mailman list:
http://www.mail-archive.com/[email protected]/
To search via a non-Google archive, visit here:
http://www.mail-archive.com/[email protected]/
To unsubscribe from this group, send email to
[email protected]