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

Reply via email to