толкать, нажимать действия, чтобы вызвать soundmanager .play (); - PullRequest
0 голосов
/ 30 марта 2012

Я пытаюсь создать музыкальный проигрыватель в реальном времени с помощью pusher + php + jquery + ajax.

Когда пользователь нажимает кнопку #play, он отправляет сообщение ajax в сценарий php, сценарий php отправляет данные на определенный канал и отправляет данные в формате json обратно пользователю.
JQuery будет анализировать данные AJAX, отправленные обратно сценарием PHP.
Если значение raction равно «true», то проигрывается песня, если «false» останавливает песню.

Но я продолжал получать неопределенные данные для функции actionCall P / S Я включил в мою html-страницу скрипт myjquery, скрипт pusher, скрипт soundmanager2.

Мой сценарий выглядит следующим образом:

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();
?>

PHP-скрипт работает, возвращая:

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

Проблема в этой ошибке (в jquery):

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

Ответы [ 2 ]

0 голосов
/ 09 апреля 2012

Вы передаете неопределенную переменную вашему actionCall.

Переменная msg, передаваемая в успешный обратный вызов вашего ajax-запроса, - это то, что сервер отправил вам.Это ясно задокументировано здесь .Поскольку для dataType установлено значение 'json', jQuery проанализирует для вас результат и передаст объект в функцию обратного вызова.

Таким образом, для всех намерений и целей, если запрос ajax успешен, его успешный обратный вызоввыглядит следующим образом:

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

(на самом деле не работает javascript, только для пояснения)

Затем вы передаете переменную msg обратному вызову, определенному в событии click, который будет выглядеть какэто:

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);
}

(на самом деле не работает javascript, только для пояснения)

Затем вы вызываете функцию actionCall, пытаясь передать msg.data, но, как вы уже, вероятно, можете сделать выводdata на самом деле не определено в объекте msg.

Попробуйте вместо этого передать msg в целом, оно должно работать.

Таким образом, обратный вызов, определенный для вызова ajax, будетвыглядеть примерно так:

function(msg) {
    player.php
    actionCall(msg);
}
0 голосов
/ 09 апреля 2012

do

actionCall(msg); 

вместо

actionCall(msg.data); 

, поскольку именно объект msg содержит ваш результат

...