2015-01-04 2 views
-1

Android CloudView의 WebView에서 Google 클라우드 채널을 사용하고 있지만 비슷한 방식으로 소켓을 사용할 때도 동일한 문제가 발생할 수 있습니다.자바 스크립트 인수가 처리기를 통해 전달되지 않음

문제점 : 함수가 다른 범위에서 호출 되었기 때문에 인수가 처리기에서 전달되지 않을 수 있습니다.

여기 내 코드입니다 :

단일 인수 (문자열)가 내의 onMessage 기능이 제대로이라고하지만, 인수가 다른 범위에 아마 때문에, '정의되지 않은'됩니다의 onMessage
<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> 

.

이 질문은이 질문이나 다른 유사한 질문과 중복 될 수 있으며 거기에 제공된 조리법을 적용하려했지만 성공하지는 못했습니다.

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가 무엇을하는지 이해하지 못한다고 생각합니다. 그러나 필자는 그 인수가 어떻게 든 감춰진 함수를 추출해야한다고 생각합니다.

아무도 빛을 발산 할 수 있습니까?

-

간결함을 위해 제 코드를 삭제했습니다.

답변

0

제가 생각하기에 문제는 JavaScript 문제가 아닙니다. 모든 소켓 유형에서 동일한 문제가 발생한다는 가정도 잘못되었습니다.

문제는 Google 클라우드 채널이 onMessage()의 메시지를 어떻게 넘겨야하는지와 관련이있었습니다.

Google이 Tic Tac Toe 예 (http://code.google.com/p/channel-tac-toe/source/browse/trunk/index.html, 175ff 줄)에 게시 한 코드에서 볼 수 있듯이 변수 "data"가 포함 된 이벤트로 문자열을 넘겨 주지만 인수는 "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 
     }; 

에 메시지 서명을 변경할 때 완벽하게 잘 작동했다.

관련 문제