- From: Cameron McCormack <cam@mcc.id.au>
- Date: Mon, 27 Jun 2011 15:06:41 +1200
- To: public-script-coord@w3.org
In Web IDL currently, if you write [Callback] on an interface and the
interface consists of a single operation, then script can implement that
interface either by using a Function object, or by providing an object
with a property whose name is the identifier of the operation.
The case people would be familiar with is from DOM Events. Both
e.addEventListener("load", function(evt) { … }, false);
and
var handler = { handleEvent: function(evt) { … } };
e.addEventListener("load", handler, false);
work. If you write [Callback=FunctionOnly], then the second style above
doesn’t work; you can only use a Function object.
Although I thought [Callback=FunctionOnly] would only be used for cases
where compatibility required the different handling from the default,
some spec authors seem to have taken a liking to it. The result is that
some specs forbid the use of the object style while others allow it. I
think we need to come to an agreement on whether we want to consistent
forbid or consistent allow this.
I made a change recently to the requestAnimationFrame spec to make it
[Callback=FunctionOnly], but it seems I’ve misread the general mood.
(Either way, it was a bad change: requestAnimationFrame is not special
enough to require behaviour different from the default.)
So I’d like to have a discussion here on whether [Callback=FunctionOnly]
should indeed be the default. I prefer to leave the spec as it is, and
to discourage specs from using it unless it is needed for compatibility
reasons.
Olli gave a good example of why you might want to allow objects-with-a-
property to be used as callback objects, which is so that you can
encapsulate some state in that object.
var handler = {
_highlighted: false,
handleEvent: function(evt) {
this._highlighted = !this._highlighted;
evt.target.style.color = this._highlighted ? "red" : "black";
}
};
e.addEventListener("click", handler, false);
(EventListener is an example of an interface that needs to be able to
accept an object with a handleEvent property regardless of the default
Web IDL chooses, since content uses it.)
Thanks,
Cameron
--
Cameron McCormack ≝ http://mcc.id.au/
Received on Monday, 27 June 2011 03:07:09 UTC