Попытка реализовать jPlayer с помощью jQuery Mobile - проигрыватель останавливается при запуске диалога

Я пытаюсь создать страницу для мобильных устройств с помощью jQuery Mobile, на главной странице которой есть jPlayer, а другой контент загружается либо на вкладках, либо на другой странице, либо в диалоговом окне, так что звук в jPlayer продолжает воспроизводиться.

Я не уверен, как реализовать вкладки с помощью jQuery Mobile, но я попытался адаптировать двухстраничный пример из демонстраций, а также одну страницу с диалоговым окном, которое содержит дополнительный контент, и с использованием обоих методов воспроизведение в jPlayer останавливается.

Я не уверен, почему это происходит. На стандартной веб-странице, которую я разработал с помощью jPlayer и лайтбоксов, лайтбоксы не влияют на воспроизведение в jPlayer, поэтому я надеялся, что с jQuery Mobile будет то же самое.

Чтобы протестировать на iPhone, вам нужно будет нажать на дорожку, чтобы воспроизвести звук.

Я был бы признателен за любую помощь в получении этой работы,

Спасибо,

Ник

Вы можете увидеть текущую страницу здесь. Код между тегами body:

<body> 

<div class="jp-audio">
<div class="jp-type-playlist">
    <div id="jquery_jplayer_1" class="jp-jplayer"></div>
    <div id="jp_interface_1" class="jp-interface">
        <div class="jp-video-play"></div>
        <ul class="jp-controls">
            <li><a href="#" class="jp-play" tabindex="1">play</a></li>
            <li><a href="#" class="jp-pause" tabindex="1">pause</a></li>
            <li><a href="#" class="jp-stop" tabindex="1">stop</a></li>
            <li><a href="#" class="jp-mute" tabindex="1">mute</a></li>
            <li><a href="#" class="jp-unmute" tabindex="1">unmute</a></li>
            <li><a href="#" class="jp-previous" tabindex="1">previous</a></li>
            <li><a href="#" class="jp-next" tabindex="1">next</a></li>
        </ul>
        <div class="jp-progress">
            <div class="jp-seek-bar">
                <div class="jp-play-bar"></div>
            </div>
        </div>
        <div class="jp-volume-bar">
            <div class="jp-volume-bar-value"></div>
        </div>
        <div class="jp-current-time"></div>
        <div class="jp-duration"></div>
    </div>
    <div id="wrapper">
    <div id="scroller">
    <div id="jp_playlist_1" class="jp-playlist">
        <ul>
            <!-- The method Playlist.displayPlaylist() uses this unordered list -->
            <li></li>
        </ul>
    </div>
    </div>
    </div>

    <script type="text/javascript">
    var myScroll = new iScroll('wrapper');
    </script>
</div>

<!-- Start of first page -->
<div data-role="page" id="playlist" data-position="fixed">

    <div data-role="header">
        <h1>Playlist</h1>
    </div><!-- /header -->

    <div data-role="content">
            <a href="#comments">comments</a></p>
            <a href="#comments" data-rel="dialog" data-transition="pop">open dialog</a></p>         

    </div><!-- /content -->

    <div data-role="footer" data-position="fixed">
        <h4>Page Footer</h4>
    </div><!-- /header -->
</div><!-- /page -->


<!-- Start of second page -->
<div data-role="page" id="comments">



    <div data-role="content">   
                <p><a href="#playlist">Back to playlist</a></p>

    <div id="disqus_thread">
    </div>

      <script type="text/javascript">
          /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
          var disqus_shortname = 'monthlymixup'; // required: replace example with your forum shortname

          // The following are highly recommended additional parameters. Remove the slashes in front to use.
          var disqus_identifier = 'test';
          var disqus_title = 'the marvelous monthly mix up';
          // var disqus_url = 'http://example.com/permalink-to-page.html';

          /* * * DON'T EDIT BELOW THIS LINE * * */
          (function() {
              var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
              dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
              (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
          })();
      </script>
      <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>           

                </div><!-- /content -->


</div><!-- /page -->
</body>

here is the script I currently have for showing and hiding pages:

<script type="text/javascript"> $("div:jqmData(role='page')").live('pagebeforeshow',function(){ if($(this).hasClass('haveaplayer')) { $(.jp-audio).show(); }else{ $(.jp-audio).hide(); } }) </script>

и html:

<div data-role="page" id="playlist" class="haveaplayer">


person Nick    schedule 28.04.2011    source источник
comment
Теперь я включил код в свой исходный пост выше   -  person Nick    schedule 28.04.2011


Ответы (1)


Без кода это просто совет, но похоже, что jPlayer не хочет быть скрытым.

Простой ответ — добавить элемент div из div data-role="page" (просто внутри тела) и поместить туда jPlayer. Для правильного отображения потребуется дополнительный CSS (или он не будет скрыт под заголовком JQM :)), но тогда jPlayer должен работать хорошо.

[редактировать]

Вы можете попытаться переместить jPlayer между страницами с помощью:

$("div:jqmData(role='page')").live('pageshow',function(){
  //test if the page should have the player and then:
  $(jPlayerWrapperSelector).appendTo($(this));
})

попробуйте с pageshow и pagebeforeshow

Если это не сработает (перемещение узла также может сломать jPlayer), вы можете просто привязаться к событию страницы и при необходимости скрыть jPlayer.

$("div:jqmData(role='page')").live('pagebeforeshow',function(){
  //test if the page should have the player and then:
   {
   $(jPlayerWrapperSelector).show();
   }else{
   $(jPlayerWrapperSelector).hide();
   }
})

[править2]

Я предлагаю такой оператор if:

if($(this).hasClass('haveaplayer'))

Затем вам нужно добавить класс в div, в котором должен быть игрок. Нравится:

<div data-role="page" class="haveaplayer">
person naugtur    schedule 28.04.2011
comment
Спасибо, размещение кода jPlayer за пределами div data-role=page действительно работает, но тогда возникает проблема со скрытой верхней частью проигрывателя, как вы упомянули, что, похоже, я мог бы исправить с помощью CSS, но это также более важно затем проигрыватель также отображается на странице / вкладке «комментарии», чего я бы предпочел не иметь. Я включил приведенный выше код и ссылку на страницу с текущей реализацией (с кодом jPlayer вне div data-role=page). В стандартном браузере jPlayer продолжал воспроизводиться при загрузке других страниц/вкладок, но не на iPhone. - person Nick; 28.04.2011
comment
Это скорее проблема jPlayer. Я бы предложил переделать воспроизведение самостоятельно, чтобы оно было проще и более адаптировано для iphone, но вы, вероятно, не хотите ... Тогда это вопрос хорошего трюка, который я недавно придумал ;) См. Править - person naugtur; 29.04.2011
comment
Спасибо. Похоже, дополнительный код, который вы разместили, предназначен для работы с решением, в котором я поместил код jPlayer вне div data-role=page. Включенный вами скрипт скроет jPlayer на странице комментариев. Я правильно понял? Если да, то когда я добавил первый скрипт, пробуя и pageshow, и pagebeforeshow, он сломал страницу. Добавление второго скрипта не ломает страницу, но, похоже, не имеет никакого значения в том, что отображается, а что нет. Возможно, мне нужно добавить какой-то другой код, чтобы это работало, для jPlayerWrapperSelector? - person Nick; 29.04.2011
comment
Ну да... Я не хотел гадать, что вы хотите скрыть, поэтому я поставил глупое имя там, где должен быть селектор для jPlayer. Если вы хотите, чтобы я угадал, я бы сказал, что вы хотите #jquery_jplayer в качестве селектора. Кроме того: вы видели, что вам нужно заменить комментарий оператором if, который решает, должен ли на странице быть jPlayer, или вы просто скопировали псевдокод и ожидали, что он сработает? ;) - person naugtur; 29.04.2011
comment
Спасибо за ваше терпение, naugtur. Я могу быть немного глупым, когда дело доходит до javascript. Код для плейлиста jPlayer немного изменился по сравнению с моим первоначальным сообщением, и общая оболочка теперь <div class="jp-audio">, поэтому я изменил селектор на .jp-audio. Затем я добавил оператор if вместо комментария. На данный момент это if(id='playlist'), но это не работает, значит, я ошибся! - person Nick; 29.04.2011
comment
оператор if должен проверять, должен ли быть виден проигрыватель на загружаемой странице. Вы сравниваете неопределенную переменную со строкой. Это не может работать. См. edit2 - person naugtur; 29.04.2011
comment
Еще раз спасибо, Наугтур. Я попробовал ваше предложение, и оно по-прежнему не скрывает плейлист на странице комментариев. Я изменил html для плейлиста jPlayer и включил скрипт и html для скрытия плейлиста в том виде, в каком он сейчас находится внизу моего исходного поста. Я пробовал использовать как «pageshow», так и «pagebeforeshow». - person Nick; 30.04.2011
comment
неудивительно, что это не сработает, если вы сделаете $(.sth) вместо $('.sth'). Могут быть еще проблемы, я не читал - person naugtur; 01.05.2011
comment
благодаря. это работает сейчас. Переход между страницами немного неуклюжий, но он работает. Я общаюсь с разработчиком jPlayer, чтобы попытаться выяснить, в чем проблема с остановкой воспроизведения jPlayer при отображении других «страниц». извините еще раз за то, что я был довольно медленным с javascript. - person Nick; 02.05.2011
comment
Я говорил слишком рано. Сценарий работает настолько, насколько он скрывает jPlayer, когда загружается «страница комментариев», но снова jPlayer перестает воспроизводиться (должно быть, я отключил его, когда тестировал раньше!). У меня есть дополнительная информация от разработчика jPlayer, который сказал мне поместить только jPlayer DIV: <div id="jquery_jplayer_1" class="jp-jplayer"></div> вне data-role=page, между тегами body и остальной частью html, для списка воспроизведения и элементов управления, в одном из «страницы». Это прекрасно работает. В очередной раз благодарим за помощь. Это заставило меня и разработчика думать в правильном направлении! - person Nick; 02.05.2011