2015-01-04 6 views
-1

Я использую Google Cloud Channels в веб-браузере Android, но такая же проблема, вероятно, возникает и при использовании любого сокета аналогичным образом.JavaScript Аргумент не передан через обработчик

Проблема: аргумент не передается обработчиком, возможно потому, что функции вызываются в другой области.

Вот мой код:

<html> 
    <head> 
     <script src='{{ channelurl }}jsapi'></script> 
    </head> 
    <body> 
     <script type="text/javascript"> 

      onMessage = function(message) { 

      }; 

      var token = '{{ token }}'; 
      var channel = new goog.appengine.Channel(token); 

      var handler = { 
       'onmessage': onMessage, 
      }; 

      var socket = channel.open(handler); 

      socket.onmessage = onMessage; 

     </script> 
    </body> 
</html> 

OnMessage имеет один аргумент (строка) и моя функция OnMessage правильно называется, но аргумент «не определен», вероятно, потому, что он находится в другой области.

Этот вопрос может быть дубликатом этих или других подобных вопросов, и я попытался применить рецепты, данные там, но не удался.

How do I pass arguments to an event handler? How to pass event as argument to an inline event handler in JavaScript?

Я на самом деле применяется код здесь

http://2cor214.blogspot.com/2010/08/passing-arguments-to-event-handler-in.html

и пытался играть с такими вещами, как это:

socket.onmessage = (функция (сообщение) { return onMessage}) (сообщение)

во многих va но не мог заставить его работать.

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

Может ли кто-нибудь пролить свет, пожалуйста.

-

Я удалил части моего кода для краткости.

ответ

0

Проблема не была проблемой JavaScript, как я и предполагал. Предположение о том, что одна и та же проблема возникнет с любым типом сокета, также неверно.

Проблема связана с тем, как Google Cloud Channels передает сообщение в onMessage().

Как я мог видеть из кода, опубликованного Google для примера Tic Tac Toe здесь http://code.google.com/p/channel-tac-toe/source/browse/trunk/index.html, строка 175ff, они передают строку как событие с переменной «данные», но называются аргументом «m» (как в сообщение).

onOpened = function() { 
    sendMessage('/opened'); 
    }; 

    onMessage = function(m) { 
    newState = JSON.parse(m.data); 
    state.board = newState.board || state.board; 
    state.userX = newState.userX || state.userX; 
    state.userO = newState.userO || state.userO; 
    state.moveX = newState.moveX; 
    state.winner = newState.winner || ""; 
    state.winningBoard = newState.winningBoard || ""; 
    updateGame(); 
    } 

    openChannel = function() { 
    var token = '{{ token }}'; 
    var channel = new goog.appengine.Channel(token); 
    var handler = { 
     'onopen': onOpened, 
     'onmessage': onMessage, 
     'onerror': function() {}, 
     'onclose': function() {} 
    }; 

    var socket = channel.open(handler); 
    socket.onopen = onOpened; 
    socket.onmessage = onMessage; 
    } 

Вид запутанным и документированы здесь https://cloud.google.com/appengine/docs/java/channel/?csw=1 и здесь https://cloud.google.com/appengine/docs/java/channel/javascript, но когда я изменил сообщение подпись

 onMessage = function(message) { 
      ChannelListener.onMessage(message.data); // message 
     }; 

он работал прекрасно.

Смежные вопросы