2012-03-30 9 views
0

Ich versuche, einen Echtzeit-Musik-Player mit Pusher + PHP + Jquery + Ajax zu machen.Drücker, Push-Aktionen zum Auslösen des Soundmanagers .play();

Wenn ein Benutzer auf die Schaltfläche #play klickt, sendet er eine Ajax-Nachricht an ein PHP-Skript, das PHP-Skript sendet die Daten an den bestimmten Kanal und sendet eine JSON-kodierte Daten an den Benutzer zurück.
Eine jquery wird die Ajax-Daten analysieren, die vom php-Skript zurückgesendet werden.
Wenn es raction ist "wahr", dann spielt es den Song, wenn "false" stoppt das Lied.

Aber ich bekam weiter Daten undefined für die actionCall Funktion P/S Ich habe myjquery Skript, Pusher Skript, Soundmanager2 Skript auf meiner HTML-Seite enthalten.

Mein Skript wie folgt:

jQuery:

function ajaxCall(ajax_url, ajax_data, successCallback) { 
    $.ajax({ 
     type: "POST", 
     url: ajax_url, 
     dataType: "json", 
     data: ajax_data, 
     time: 10, 
     success: function(msg) { 
      if (msg.success) { 
       successCallback(msg); 
      } else { 
       alert(msg.errormsg); 
      } 
     }, 
     error: function(msg) {} 
    }); 
} 


function actionCall(data) { 
    if (data.raction == 'true') { 
     MP3.play(); 
    } 
    else { 
     MP3.stop(); 
    } 
} 

$(document).ready(function() { 

    pusher = new Pusher('i have added my app key'); 
    Pusher.channel_auth_endpoint = 'pusher_auth.php'; 
    nettuts_channel = pusher.subscribe('presence-music'); 

    pusher.connection.bind('connected', function() { 
     nettuts_channel.bind('new_action', function(data) { 
      actionCall(data); 
     }); 
    }); 


    soundManager.url = 'swf'; 
    soundManager.flashVersion = 8; 
    var MP3; 
    var currentSong = 0; 
    soundManager.onready(function() { 

     MP3 = soundManager.createSound({ 
      id: 'sound' + currentSong, 
      url: "mp3/song.mp3" 
     }); 

    }); 


    $('#play').click(function() { 
     ajaxCall('player.php', { 
      'action': 'true' 
     }, function(msg) { 
      player.php 
      actionCall(msg.data); 
     }); 
    }); 

    $("#stop").click(function() { 
     ajaxCall('player.php', { 
      'action': 'false' 
     }, function(msg) { 
      player.php 
      actionCall(msg.data); 
     }); 
    }); 


});​ 

PHP:

<?php 

session_start(); 

include_once 'Pusher.php'; 

$pusher = new Pusher(
    'i have added my app key', //APP KEY 
    'i have added my app secret', //APP SECRET 
    'added my app id' //APP ID 
); 

$action = $_POST['action']; 

$pusher->trigger(
    'presence-music', //the channel 
    'new_action', //the event 
    array('raction' => $action) //the data to send 
); 


echo json_encode(array(
    'raction' => $action, 
    'success' => true 
)); 
exit(); 
?> 

Das PHP-Skript funktioniert, Rückkehr:

{"raction":"true","success":true} 

Das Problem ist, dieser Fehler (im jquer y):

data is undefined 
if(data.raction == 'true'){ 
+0

Für den Anfang sollten Sie wahrscheinlich in einer sofort selbst ausgeführte Funktion alle Ihre js hinzufügen, damit Sie den globalen Bereich mit Funktionen nicht verschmutzen . '(Funktion ($) {/ * Ihre js geht hier * /} (jQuery));' – sg3s

Antwort

0

Sie vorbei eine nicht definierte Variable auf Ihren actionCall.

Die msg Variable, die an den Erfolgsrückruf Ihrer AJAX-Anfrage übergeben wurde, ist die, die der Server Ihnen gesendet hat. Dies ist eindeutig documented here. Da dataType auf 'json' gesetzt ist, hat jQuery das Ergebnis für Sie analysiert und das Objekt an die Callback-Funktion übergeben.

Also für alle beabsichtigt und Zwecke, wenn ein Ajax-Request seinen Erfolg Callback wie folgt aussieht erfolgreich ist:

function(msg = {"raction":"true","success":true}) { 
    if (msg.success) { 
     successCallback(msg); 
    } else { 
     alert(msg.errormsg); 
    } 
} 

(nicht eigentlich Javascript funktioniert, nur zu Erläuterungszwecken)

Dann passieren Sie die msg Variable auf den Rückruf in dem Click-Ereignis definiert, die wie folgt aussehen würde:

function(msg = {"raction":"true","success":true}) { 
    player.php /* This looks weird btw, I don't know what this is supposed to do but I'll ignore it since this doesn't look to be the problem. */ 
    actionCall(msg.data); 
} 

(nicht wirklich arbeiten javas cript, nur zu Erläuterungszwecken)

Dann rufen Sie die actionCall Funktion versucht msg.data zu passieren, aber wie Sie wahrscheinlich schon data ableiten kann, ist nicht wirklich in der msg Objekt definiert.

Versuchen Sie statt msg als Ganzes statt, es sollte funktionieren.

So der Rückruf für den Ajax-Aufruf definiert würde wie folgt aussehen:

function(msg) { 
    player.php 
    actionCall(msg); 
} 
0

tun

actionCall(msg); 

statt

actionCall(msg.data); 

, da es die msg Objekt ist, das Ihr Ergebnis enthalten

Verwandte Themen