On Thu, 08 Oct 2009 13:14:37 +0200, Gervase Markham <[email protected]> wrote:
On a <video> element (I haven't tried <audio>), if you change the src=
attribute to a new file, you have to call .load() before .play(),
otherwise it replays the old file. This lost me half an hour of
debugging, and recently another person posted in the Mozilla newsgroups
having exactly the same problem.
I am told by an informed source (Boris Zbarsky) that the spec for
<video> requires this behaviour. Having spent ten minutes reading the
highly comprehensive specification, I could not find the location where
it says this. However, I believe him :-)
"If a src attribute of a media element that is in a Document and whose
networkState has the value NETWORK_EMPTY is set or changed, the user agent
must invoke the media element's resource selection algorithm."
If you have already played a video, networkState is not NETWORK_EMPTY, so
the resource selection algorithm is not invoked (and thus play() will play
the already-loaded video).
Question: why? This is counter-intuitive. Under what circumstances would
you want to set the src= attribute of a <video> tag to a file which you
did not want the loading process to begin immediately? Can we eliminate
the requirement, e.g. by having play() implicitly call load() if it
hasn't been called?
Maybe we could remove the networkState check when the src attribute is set
or changed. Should the "in a Document" check be removed, too? That is, do
you want to be able to do
var a = new Audio('foo');
a.play();
a.onended = function() { a.src = 'bar'; a.onended = null; }
?
(You wouldn't need to invoke play() again, because the media isn't paused
when it has ended.)
What do you think should happen when using <source> elements?
--
Simon Pieters
Opera Software