Windows Media Player не работает? У JS нет доступа к "элементам управления"?

Итак... Компания, в которой я работаю, уже давно использует оболочку javascript для контроля положения воспроизводимого видео.

Исторически это было достигнуто с помощью чего-то для этого:

function loadMovie(movieIndex, moviePosition)
{
    if ( top.mediaFrame.document.MediaPlayer.URL != movieArray[movieIndex])
    {
        top.mediaFrame.document.MediaPlayer.URL = movieArray[movieIndex];
    }
    top.mediaFrame.document.MediaPlayer.controls.currentPosition = moviePosition;
    top.mediaFrame.document.MediaPlayer.controls.play();
    return false;
}

// I've tried .controls.currentPosition And .Controls.currentPosition to no avail.

Где объект MediaPlayer выглядит примерно так:

<OBJECT id="MediaPlayer" width="440" height="360" CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" type="application/x-oleobject">
    <param name="URL" value="/images/logo.png">
    <param name="rate" value="1">
    <param name="balance" value="0">
    <param name="currentPosition" value="0">
    <param name="defaultFrame" value>
    <param name="playCount" value="1">
    <param name="autoStart" value="-1">
    <param name="currentMarker" value="0">
    <param name="invokeURLs" value="-1">
    <param name="baseURL" value>
    <param name="volume" value="50">
    <param name="mute" value="0">
    <param name="uiMode" value="full">
    <param name="stretchToFit" value="0">
    <param name="windowlessVideo" value="0">
    <param name="enabled" value="-1">
    <param name="enableContextMenu" value="-1">
    <param name="fullScreen" value="0">
    <param name="SAMIStyle" value>
    <param name="SAMILang" value>
    <param name="SAMIFilename" value>
    <param name="captioningID" value>
    <param name="enableErrorDialogs" value="0">
    <param name="_cx" value="10451">
    <param name="_cy" value="10583">
    <embed TYPE="application/x-mplayer2" SRC="/images/logo.png" NAME="MediaPlayer" WIDTH="440" HEIGHT="360" autostart="1" showcontrols="1">
</object>

В частности, проблема, с которой я сталкиваюсь, заключается в том, что любая попытка установить 'currentPosition' члена 'Controls' объекта 'MediaPlayer' приводит к следующему:

Uncaught TypeError: Cannot set property 'currentPosition' of undefined

Согласно ссылке на объектную модель, это должно работать. По историческим данным, это должно сработать - пока... совсем недавно. Если у кого-то есть идея, почему это перестало бы работать "на ровном месте", как это было в КАЖДОМ БРАУЗЕРЕ, НО IE, мне было бы очень интересно узнать, что это такое.

Я знаю, что этот подход серьезно устарел, но у меня нет возможности отойти от него, поскольку компания, в которой я работаю, имеет десятки тысяч часов видео в формате WMV, хотя поддержка WMV в браузерах быстро исчезает.

Начал сотрудничество в JSFiddle (спасибо @Bart).

http://jsfiddle.net/

2 ответа

Что ошибка говорит вам, что в то время как MediaPlayer кажется определенным, MediaPlayer.Controls не является.

Действительно, согласно http://msdn.microsoft.com/en-us/library/windows/desktop/dd562656%28v=vs.85%29.aspx Player объекты имеют controls свойство типа Controls, Таким образом, вы должны написать

top.mediaFrame.document.MediaPlayer.controls.currentPosition = moviePosition;
top.mediaFrame.document.MediaPlayer.controls.play();

Я не думаю, что это медиаплеер.

Ваш JavaScript предполагает, что медиаплеер всегда загружается тегом объекта, и ссылается на него только по идентификатору тега объекта.

Если медиаплеер фактически загружен тегом embed, JavaScript не будет к нему обращаться.

Вам нужно дать явный идентификатор тегу встраивания, и если тег объекта на самом деле не содержит действительного медиаплеера, вам нужно вместо этого найти тег встраивания.

Что-то вроде:

var player = top.mediaFrame.document.getElementById('MediaPlayer);
if (! player || ! player.controls) 
{
    player = top.mediaFrame.document.getElementById('altMediaPlayer')
}

затем

<embed id = 'altMediaPlayer' TYPE="application/x-mplayer2" SRC="/images/logo.png" NAME="MediaPlayer" WIDTH="440" HEIGHT="360" autostart="1" showcontrols="1">

должен сделать это.

Другие вопросы по тегам