Robert O'Callahan wrote:
On Oct 19, 2007 11:55 AM, Geoffrey Garen <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:

     > Suppose a script creates a <video> element, adds it to the document,
     > starts it playing, then removes the element from the document and
     > drops all references to it. When should the element stop playing?

     > -- when the element leaves the document?

    Probably. Since you can't see the video any more, it would be really
    weird to hear audio from it, or waste computer resources on a mute and
    invisible video. Moreover, there's a lot of precedent for DOM elements
    not loading when they're not in the document. This is true of iframe,
    script, img, etc.


It's not true of <img>. Javascript image preloading tricks rely on it.

And as Maciej mentioned, it would be useful to be able to play audio outside the document, and to be consistent, <video>'s behaviour should match.

Image is one of very few exceptions to the rule that elements become active only when they are inserted into the document. And partially this is due to DOM0 behavior that was designed before there was an actual DOM you could insert your images into. I.e. it stems from people using the following syntax:

myimg = new Image();
myimg.src = "myimg.gif";

function showImg() {
  document.images[5].src = "myimg.gif";
}

So I don't think it's a precedent we need to follow. There is much more precedent for only making elements active once they are inserted into the document.

     > -- when all JS references to the element have been dropped (and
     > garbage collection runs)?

    No. The time at which garbage collection will reclaim an object is
    unpredictable, so relying on garbage collection for behavior is a bad
    idea.

Agreed.

If we let <video>s or <audio>s play even when out of the document I don't see how we could avoid this. Or do you mean by 'play' only move forward in their time-position, not emit sound?

What happens in opera is if you do:

myAudio = new Audio("foo.wav");
myAudio.onload = function () {
  this.play();
  myAudio = null;
}

When will the audio stop playing?

My current opinion is that <audio> and <video> elements should behave like <img> and load/play whether or not they're in a document, but they should only emit sound if they're in a document with a presentation and are not in a display:none subtree. Then to play a sound you'd have to insert the element into your document somewhere with size 0x0 (which should be the default for <audio>).

But it's a rather tangled issue.

It would make sense to me if we started loads as soon as the <audio>/<video> was created. I'm much less convinced that elements out the the DOM should emit sound. Though the API anne describes of using pure JS objects does make a lot of sense.

/ Jonas

Reply via email to