Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите разобраться! Связка JS+Google API (Youtube) (https://javascript.ru/forum/misc/28001-pomogite-razobratsya-svyazka-js-google-api-youtube.html)

swa 02.05.2012 18:58

Помогите разобраться! Связка JS+Google API (Youtube)
 
На странице встроен flash (hromeles player без панели управления; управление через JS).
Все работает кроме определения длительности подгружаемого ролика.
По документации player должен отдавать свой статус и длительность ролика. При вызове статуса и параметра длительности через alert, все срабатывает. А вот если alert убрать, то присваивание параметра длительности ролика переменной JS не происходит.

Причем статус проигрывания, паузы, окончания проигрывания player возвращает.

Уже голову сломал! :-E

Код передачи параметра длительности:
if (player.getPlayerState()==5 || player.getPlayerState()==1) {
//		alert('player.getPlayerState()='+player.getPlayerState());
		alert('$("#duration").val('+player.getDuration()+')');
		var time = player.getDuration();
		$("#duration").val(time);
	};


Стоит закоментировать 3-ью строку, как присвоение перестает работать. После alert все отлично присваивается...
От безысходности ввел совершенно ненужную переменную time - без толку :)

Спасибо за подсказку!

zebra 02.05.2012 19:58

Скорей всего player.getDuration() асинхронная функция.

swa 02.05.2012 20:05

Что это меняет принципиально? - alert возвращает значение getDuration()
А присваивания нет. Убрать alert - все равно нет присваивания.

zebra 02.05.2012 20:24

Выведите alert(time). Может вообще нету #duration

swa 02.05.2012 23:11

Вы знаете, что самое любопытное - даже просто после пустого alert присваивание срабатывает! Именно нужное правильное значение!

Но если до alert делать присваивание, то возвращает 0 (ноль).

zebra 03.05.2012 00:25

Читайте доку, там описан почему 0 вернуло

swa 03.05.2012 01:05

Буду очень признателен за совет! У меня уже глаз замылился...

zebra 03.05.2012 01:20

Возвращает длительность в секундах видео, воспроизводимого в текущий момент. Обратите внимание на то, что getDuration() возвратит 0, если метаданные видео еще не загружены, что обычно случается в самом начале воспроизведения видео.

swa 03.05.2012 09:25

Это само-собой разумеется!
Однако вызов alert(player.getDuration()) - отдает длительность!

И в JS-коде есть проверка на полностью загруженное и начавшееся воспроизводиться видео:
if (player.getPlayerState()==5 || player.getPlayerState()==1)

Где: player.getPlayerState()
5 - это событие полностью загруженного ролика, 1 - воспроизведение.

zebra 03.05.2012 11:20

Попробуйте изменить условие на такое
if (player.getPlayerState()==5 && player.getPlayerState()==1)

swa 03.05.2012 12:32

Одновременно оба события не могут произойти.
Вначале плеер загружает ролик, размечает его и возвращает "5", когда начинается и идет воспроизведение возвращается "1".
Также возвращаются свои state при паузе, окончании воспроизведения.

Блин! без алерта, отдает 0 (ноль), стоит поставить даже пустой (alert('')) и данные отдаются....

melky 03.05.2012 18:40

Цитата:

Сообщение от swa (Сообщение 172427)
if (player.getPlayerState()==5 || player.getPlayerState()==1) {
//		alert('player.getPlayerState()='+player.getPlayerState());
		alert('$("#duration").val('+player.getDuration()+')');
		var time = player.getDuration();
		$("#duration").val(time);
	};

https://developers.google.com/youtube/js_api_reference
Цитата:

player.getDuration():Number
Returns the duration in seconds of the currently playing video. Note that getDuration() will return 0 until the video's metadata is loaded, which normally happens just after the video starts playing.

If the currently playing video is a live event, the getDuration() function will return the elapsed time since the live video stream began. Specifically, this is the amount of time that the video has streamed without being reset or interrupted. In addition, this duration is commonly longer than the actual event time since streaming may begin before the event's start time.
вы мануалы то читали, прежде чем браться?

swa 03.05.2012 19:15

Melky, прежде чем влезать в ветвь обсуждения с советами, нужно ознакомиться с сообщениями.

melky 03.05.2012 19:46

Цитата:

Сообщение от swa (Сообщение 172571)
Melky, прежде чем влезать в ветвь обсуждения с советами, нужно ознакомиться с сообщениями.

У вас всё в порядке?Я ознакомился с ообщениями, и в нескольких сообщениях, что Вы читали документацию по диагонали:
Цитата:

Сообщение от swa (Сообщение 172457)
Но если до alert делать присваивание, то возвращает 0 (ноль).

Цитата:

Сообщение от swa (Сообщение 172520)
без алерта, отдает 0 (ноль)...

ещё раз,цитирую документацию:
Цитата:

Note that getDuration() will return 0 until the video's metadata is loaded, which normally happens just after the video starts playing.
Если Вы не понимаете, что тут написано, переведу.
Цитата:

Заметьте, что метод getDuration() будет возвращать 0 (нуль), пока не загрузятся метаданные видео. Обычно это происходит сразу после начала просмотра.
Вы поняли вашу ошибку?

PS. прежде чем указывать и возмущаться, подумайте, к чему была написана критика. Удачи Вам.

swa 03.05.2012 19:53

Melky! Вы вы видите текст? - видео уже воспроизводится!

Сделана проверка на полную(!) загрузку метаданных: getPlayerState()==5
и более того или на уже воспроизводящееся видео getPlayerState()==1

Поэтому, пожалуйста, не надо отделываться пустыми советами "читать документацию". И свою "критику", как и "советы" оставьте при себе.

melky 03.05.2012 20:10

Цитата:

Сообщение от swa (Сообщение 172582)
Сделана проверка на полную(!) загрузку метаданных: getPlayerState()==5
и более того или на уже воспроизводящееся видео getPlayerState()==1

не "и", а "или". Вы уверены, что при исполнении кода метаданные загружены? Алерт задерживает исполнение кода (но не сетевых запросов), поэтому после него всё нормально.

swa 03.05.2012 23:32

melky, я вас прошу более в мои топики не заглядывать. И упаси Боже, что-либо комментировать.

devote 08.05.2012 18:07

swa,
вам бы стоило прислушаться к советам melky, а не ерничать, человек вам дело говорит, можно сказать тычет пальцем на вашу ошибку, а вы пытаетесь изворачиваться в строну умного и знающего.

Для начала почитайте учебники, разберитесь в вопросах синхронности/асинхронности а уж затем ерничайте в тех случаях если вы точно знаете о чем говорите.


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