"错误:已存在指定ID的引用"如何隐藏/修复此警报?

时间:2014-03-14 18:47:31

标签: javascript android cordova

我正在开发一个音乐应用程序,如果我要进入可以播放声音的页面,请离开该页面,然后立即重新访问我收到此错误。 我已经搜索了问题,我似乎无法找到类似的东西。 我正在为我的应用程序使用cordova媒体播放器和LowLatencyAudio插件。 下面是指定页面上的代码和我收到的错误的图像。 任何帮助都会非常感激,因为我很好并且真的卡住了!

<div class="drum" id="bass" ontouchstart="play('bass');" ontouchend="touchEnd(event);">Bass</div>
    <div class="drum" id="highhat" ontouchstart="play('highhat');" ontouchend="touchEnd(event);">High Hat</div>
    <div class="drum" id="snare" ontouchstart="play('snare');" ontouchend="touchEnd(event);">Snare</div>
    <div class="drum" id="bongo" ontouchstart="play('bongo');" ontouchend="touchEnd(event);">Bongo</div>

<script type="text/javascript">

        var lla;

        function onBodyLoad() {     
            document.addEventListener("deviceready", onDeviceReady, false);
        }

        function onDeviceReady() {
            if( window.plugins && window.plugins.LowLatencyAudio ) {

                lla = window.plugins.LowLatencyAudio;   

                lla.preloadFX('assets/bass.mp3', 'assets/bass.mp3', function(msg){}, function(msg){ alert( 'Error: ' + msg ); });
                lla.preloadFX('assets/snare.mp3', 'assets/snare.mp3', function(msg){}, function(msg){ alert( 'Error: ' + msg ); });
                lla.preloadFX('assets/highhat.mp3', 'assets/highhat.mp3', function(msg){}, function(msg){ alert( 'Error: ' + msg ); });
                lla.preloadFX('assets/bongo.mp3', 'assets/bongo.mp3', function(msg){}, function(msg){ alert( 'Error: ' + msg ); });     
            }
        }

        function play(drum) {
            document.getElementById(drum).className = 'drum touched';
            lla.play('assets/' + drum + '.mp3');
        }

        function touchEnd(event) {
            event.target.className = 'drum';
        }

    </script>

error

Error: A reference already exists for the audio id.

2 个答案:

答案 0 :(得分:0)

看起来问题是lla.preloadFX多次为同一资产调用。在阅读了插件文档和实际的java代码之后,这个错误实际上是一个警告/通知而不是错误。我重新格式化了我的示例,以显示我将如何忽略此消息,因为它不会影响您的应用程序。

以下是一个例子:

function onDeviceReady() {
   if( window.plugins && window.plugins.LowLatencyAudio) {

       lla = window.plugins.LowLatencyAudio;

       lla.preloadFX('assets/bass.mp3', 'assets/bass.mp3', function(msg){}, function(msg){ if(msg != 'A reference already exists for the specified audio id.') { alert( 'Error: ' + msg ); } });
   }
}

使用此代码,如果出现“真实”错误,您将看到错误,否则它将忽略有关已加载资源的消息。这应该可以解决问题。

答案 1 :(得分:0)

每次启动应用程序时,

实际上是deviceready事件调用函数lla.preloadFXpreloadFx()尝试再次加载已加载的资产。因此,您只需处理后退按钮事件即可在应用程序退出时卸载资产。

function onBodyLoad() {     
                document.addEventListener("backbutton", onBackButton, false);
            }
       function onBackButton() {
    var assets=['bass','snare','highhat','bongo'];
                for (x in assets) {
                    lla.unload(assets[x], function (msg) {}, function (msg) {});
                }
                navigator.app.exitApp();
            }