【问题标题】:JavaScript Argument not passed across handlerJavaScript 参数未通过处理程序传递
【发布时间】:2015-01-04 22:13:09
【问题描述】:

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

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

这是我的代码:

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

在许多变体中,但无法使其工作。

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

请大家指点一下。

--

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

【问题讨论】:

    标签: javascript android channel-api


    【解决方案1】:

    如我所料,问题不是 JavaScript 问题。任何套接字类型都会发生相同问题的假设也是不正确的。

    问题与 Google Cloud Channels 如何在 onMessage() 中传递消息有关。

    正如我从谷歌发布的井字游戏示例代码中看到的那样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
            };
    

    效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      相关资源
      最近更新 更多