Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Проблема с onended для chrome (https://javascript.ru/forum/events/28446-problema-s-onended-dlya-chrome.html)

С.Тарасов 20.05.2012 11:57

Проблема с onended для chrome
 
Добрый день!

Подскажите пожалуйста как правильно написать обработку события onended для Chrome.

В моём скрипте на этой странице
есть две функции:
function speek(){
	
		var id=id_speeker;
		try{
			if (speek_off==false || speek_off1==false){
				if (sp_paus==false && sp[nfonem]=='001'){
					next_sound();
				}else{
					$(id).autoplay=true;
					$(id).src='/pifiya/sound/'+sp[nfonem]+'.wav';
					$(id).onerror= function (){err_fonem(0)}
					$(id).onended=function(){next_sound()}
				}
			}
		}catch(e){}
	}

	//-------------------------------------------------------------------------------
	function next_sound(){
		nfonem++;
		if (sp.length==nfonem){
			end_speek()
		}else{
			speek();
		}
	}


Так вот строка :
$(id).onended=function(){next_sound()}
в chrome работать не хочет, хотя в Opere и Mozzile работает.

Пробовал так:
function chrom(){audio.addEventListener('ended', function(){next_sound();}, false);}
тоже ничего.

Как это поправить для chrome и заставить его бубнить? :)

vadim5june 20.05.2012 12:42

по моему в хроме они исключили возможность запуска из скрипта-только когда пользователь нажимает на play

С.Тарасов 20.05.2012 12:50

да нет, он начинает проигрывать, как задумано, но после воспроизведения первого файла не начинает воспроизводить следующий.

vadim5june 20.05.2012 12:53

Цитата:

Сообщение от С.Тарасов (Сообщение 175548)
да нет, он начинает проигрывать, как задумано, но после воспроизведения первого файла не начинает воспроизводить следующий.

а эти треки включены внутрь
<audio></audio>
то есть первый и следующий?

С.Тарасов 20.05.2012 13:03

Нет конечно. Они подгружаются по мере необходимости.
$(id).src='/pifiya/sound/'+sp[nfonem]+'.wav';


id - это тег audio.

vadim5june 20.05.2012 13:34

Эта тема меня сейчас сильно интересует поэтому если найдете решение напишите здесь плиз
Попробуйте добавить после
next_sound();audio.play()

С.Тарасов 20.05.2012 13:40

Хорошо, если решу напишу это решение.

С.Тарасов 20.05.2012 14:19

Цитата:

Сообщение от vadim5june (Сообщение 175560)
... next_sound();audio.play()

не хочет.

Chrome воспроизводит первый файл и всё, т.е. после окончания воспроизведения не происходит событие onended, а следовательно и его обработка.

vadim5june 20.05.2012 14:31

ну я вот здесь сделал вроде работает посмотрите
http://all-html5.narod.ru/2/audio2.htm

С.Тарасов 20.05.2012 14:38

Спасибо. Попробую. Отвечу немного позже.

С.Тарасов 20.05.2012 18:50

Цитата:

Сообщение от vadim5june
ну я вот здесь сделал вроде работает посмотрите
http://all-html5.narod.ru/2/audio2.htm

Ещё раз попробовал:
1. Добавил:
function chrom(){$('sp').addEventListener('ended', function(e){next_sound()})}


2.
< body onload="chrom()" >


3. из speek() исключил onended

chrome начал реагировать, но нарушается последовательный порядок воспроизведения.

vadim5june 20.05.2012 18:55

ну я там всего 2 песни включил поэтому у меня там это сейчас не проверишь -завтра закину больше и сделаю плей лист-я уже давно хотел занятся

С.Тарасов 21.05.2012 17:22

Сделал, то что хотел. Теперь работает и в chrome.

Решение:

<script  type="text/javascript">

        //-------------------------------------------------------------------------------
        // вспомогательные функции 
        function ie(){if (navigator.appName=='Microsoft Internet Explorer'){return true}else{return false}}

        function $(id) {
	       if (ie()){var idom=document.all(id)}else{var idom=document.getElementById(id)}
	       return idom;
        }


	//-------------------------------------------------------------------------------
        //  функция обработки событий

	function chrome(){
	
		$('sp').addEventListener('ended', function(e){next_sound()});
		$('sp1').addEventListener('ended', function(e){next_sound()});

                 //ниже обязательно назначаем обработку события:
                 //          'canplaythrough' - Скрипт выполняется, когда медиа может быть проиграно до конца,
                 //          без остановок для буферизации
 
		$('sp').addEventListener('canplaythrough', function(e){this.play()});
		$('sp1').addEventListener('canplaythrough', function(e){this.play()});
		
	}

	//-------------------------------------------------------------------------------
        // Воспроизведение очередного файла, название которого находится в массиве sp[nfonem] 
        //
	function speek(){

                   .................
	
                   $(id_speeker).src='sound/'+sp[nfonem]+'.wav';
 
                   .................

	}

	//-------------------------------------------------------------------------------
        //  переход к воспроизведению следующего файла
	function next_sound(){
                  .........
		  sp.length==nfonem ? end_speek() : speek();
                  .........
	}

</script>



В HTML:

<body onload="chrome()">
................................
			<audio id="sp" type="audio/x-wav" controls autoplay>
					Тег audio не поддерживается вашим браузером. 
			</audio>
...............................
				<audio id="sp1" type="audio/x-wav" controls autoplay>
					Тег audio не поддерживается вашим браузером. 
				</audio>
..............................


Т.к. используется два плеера, то для правильно работы в Сhrome, прежде чем запустить другой, в останавливаемом необходимо выполнить: $(id).src="";
иначе опять будет неправильная работа.
Также заметил, что если открыты в один момент две вкладки с плеерами, то в Chrome тоже получается бред.

vadim5june 21.05.2012 18:41

Цитата:

Сообщение от С.Тарасов (Сообщение 175773)
Также заметил, что если открыты в один момент две вкладки с плеерами, то в Chrome тоже получается бред.

Я там добавил несколько песен и в хроме нормально играет-но кроссбраузерного варианта нет-посмотрю Ваш
попробовал в 2 вкладках-оба играют независимо друг от друга-нужно подумать как сделать чтобы 2 вкладки нельзя было открыть-хотя эту проблему можно игнорировать как экзотическую

С.Тарасов 21.05.2012 18:55

Цитата:

Сообщение от vadim5june (Сообщение 175788)
хотя эту проблему можно игнорировать как экзотическую

И я так думаю.

Тем более, что похоже это только у меня такая ерунда. Но решать её пока мне незачем. И так сойдёт :).


Часовой пояс GMT +3, время: 16:36.