2011-05-08 19 views
13

Enorme WTF che ho pensato fosse un bug nascosto nello semicomplex web app che sto creando, ma l'ho ridotto al codice più semplice possibile, ed è ancora replicabile in Firefox, Chrome e Safari, in modo imprevedibile ma più della metà del tempo.html5 riproduzione video due volte (audio raddoppiata) con JQuery .append()

http://jsfiddle.net/cDpV9/7/

var v = $("<video id='v' src='http://ia600401.us.archive.org/18/items/ForrestPlaysTaik/forresto-plays-taik-piano-360.webm' autobuffer='auto' preload autoplay controls></video>"); 
$("#player").append(v); 
  1. Aggiungere un elemento video.
  2. Il video inizia a caricare e riprodurre.
  3. L'audio del video sembra essere raddoppiato.
  4. Mettere in pausa il video visibile e una traccia audio continua.
  5. Elimina l'elemento video; l'audio fantasma continua a suonare.
  6. Elimina il fotogramma e l'audio fantasma si arresta (anche se una volta in Firefox ha continuato a giocare dopo aver chiuso la finestra, e non si è fermato fino a quando non si è chiuso Firefox).

Ecco una cattura dello schermo per mostrare forse che io non sono completamente pazzo: http://www.youtube.com/watch?v=hLYrakKagRY

Non sembra questo accada quando si effettua l'elemento con .html() invece di .append(), in modo che il mio unico indizio: http://jsfiddle.net/cDpV9/6/

$("#player").html("<video id='v' src='http://ia600401.us.archive.org/18/items/ForrestPlaysTaik/forresto-plays-taik-piano-360.webm' autobuffer='auto' preload autoplay controls></video>"); 

sono su OS X 10.6.7.


Penso di averlo. Anche solo la creazione dell'oggetto JQuery senza inserirlo nella pagina fa sì che il giocatore fantasma di giocare: http://jsfiddle.net/cDpV9/8/

var v = $("<video id='v' src='http://ia600401.us.archive.org/18/items/ForrestPlaysTaik/forresto-plays-taik-banjo-360.webm' autobuffer='auto' preload autoplay controls></video>");

Per ora posso ovviare a questo utilizzando .html(). Segnalerò the issue a JQuery.

+0

Anche io stavo affrontando lo stesso problema. Passando a '$(). Html()' da '$(). Append()' risolto. – Sorter

risposta

10

Forse jQuery memorizza nella cache il contenuto di $() prima di aggiungerlo al div del lettore? Quindi c'è un'altra istanza del tag video. Potrebbe essere un errore in jQuery. Hai provato questo senza Jquery/js?

+0

Questo sembra essere quello che sta succedendo, ma è strano che tutti i browser giochino con quelli '' '

+0

Aveva anche questo bug, anche questo lo risolveva. Grazie :) – Mikle

+0

Questo non ha funzionato per me con un elemento

1

Si potrebbe ottenere il codice html di #player e aggiungere il video la vostra auto, quindi aggiungere il totale con .html() come questo:

var v = $("#player").html() + "<video id='v' src='http://ia600401.us.archive.org/18/items/ForrestPlaysTaik/forresto-plays-taik-piano-360.webm' autobuffer='auto' preload autoplay controls></video>"; 
$("#player").html(v); 

Non è così buono come la funzione .append(), ma se il .append() non lavoro, potresti essere costretto a fare qualcosa del genere.

+0

Ciò funziona come soluzione alternativa. – forresto

6

Vorrei provare ad aggiungere l'attributo autoplay dopo aggiungere il lettore video. Questo dovrebbe quindi istanziare la funzione di riproduzione.

Quello sarebbe qualcosa di simile:

var v = $("<video id='v' src='videofile.webm' autobuffer='auto' preload controls></video>"); 
$("#player").append(v); 
v.attr('autoplay','autoplay'); 

Quando si creano elementi in JavaScript vale a dire gli elementi delle immagini, oggetti, ecc, vengono caricati immediatamente e conservato nella memoria come oggetti.Questo è il motivo per cui è possibile precaricare le immagini prima di caricare una pagina. Non è quindi un bug jQuery.

Rif: http://www.w3.org/TR/html5/video.html#attr-media-autoplay

Quando presente, l'agente utente (come descritto nel presente contesto algoritmo descritto ) inizierà automaticamente la riproduzione della risorsa media come appena può farlo senza fermarsi.

+0

Ho appena usato una variazione di questa tecnica. Nel mio caso l'elemento video desiderato (un iframe con il video come src) esisteva già nella pagina, quindi ho inserito l'attributo 'autoplay' (e aggiunto' autoplay = 1' all'attributo 'src') . – simmer

+0

'$ ('iframe # video) .attr (' src ', videourl +'? Autoplay = 1 & loop = 1 & rel = 0 & wmode = transparent '). Attr (' autoplay ',' autoplay ');' – simmer

5

Ho lo stesso problema qui. Questo sembra essere un problema con l'uso dell'attributo "autoplay" sul tuo video markup.

  • Rimuovere l'attributo autoplay
  • accoda il video DOMNode a qualsiasi nodo
  • se si vuole un comportamento autoplay, chiamare videodomnode.play() - utilizzando jQuery questo sarebbe $('video')[0].play()
0

Questo ha funzionato meglio nel mio caso:

var v = '<audio hidden name="media"><source src="text.mp3"><\/audio>'; 
$('#player').append(v); 
$("audio")[$('audio').size()-1].play(); 
0

Ho risolto il mio caricando il video dopo il dominio caricato:

$(window).bind("load", function() { 
    var v = $("<video id='bgvid' loop muted> 
       <source src='/blabla.mp4' type='video/mp4'> 
       </source> 
      </video>"); 
$(".video-container").append(v); 
v.attr('autoplay','autoplay'); 
}); 
Problemi correlati