JavaScript参数未通过处理程序传递

时间:2015-01-04 22:13:09

标签: javascript android channel-api

我在Android的WebView中使用Google云端频道,但在以类似方式使用任何套接字时也可能出现同样的问题。

问题:处理程序不传递参数,可能是因为函数在不同的范围内调用。

这是我的代码:

<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函数被正确调用,但参数未定义&#39;,可能是因为它在不同的范围内。

这个问题可能与这些或其他类似问题重复,我尝试应用那里提供的食谱,但没有成功。

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 =(function(message){return onMessage})(message)

在许多变体中,但无法使其发挥作用。

我承认我通常不会开发JavaScript而且我不完全理解JavaScript在这里做了什么,但在我看来,这个参数需要以某种方式提取函数。

请有人放光。

-

为简洁起见,我删除了部分代码。

1 个答案:

答案 0 :(得分:0)

问题不是JavaScript问题,正如我所假设的那样。假设任何套接字类型都会出现同样的问题也是错误的。

问题与Google Cloud Channels如何在onMessage()中移交邮件有关。

正如我从代码中看到的那样,谷歌在这里发布了他们的Tic Tac Toe示例http://code.google.com/p/channel-tac-toe/source/browse/trunk/index.html,第175ff行,他们将字符串作为事件移交给变量&#34; data&#34;,但是被调用论证&#34; m&#34; (如在消息中)。

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

它完美无缺。