我在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在这里做了什么,但在我看来,这个参数需要以某种方式提取函数。
请有人放光。
-
为简洁起见,我删除了部分代码。
答案 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
};
它完美无缺。