2011-08-31 6 views
9

나는 안드로이드 소스 인 Phonegap을보고 있는데 notification.alert() 메서드가 기본 JavaScript alert() 함수에 위임한다는 것을 확인하려고합니다. "경고"와 같은 나에게 보이는Phonegap and prompt()

Notification.prototype.alert = function(message, completeCallback, title, buttonLabel) { 
    var _title = (title || "Alert"); 
    var _buttonLabel = (buttonLabel || "OK"); 
    PhoneGap.exec(completeCallback, null, "Notification", "alert", [message,_title,_buttonLabel]); 
}; 

exec()에서 호출 할 함수의 이름으로 해석되지만, exec()을하고있다 : 그들의 코드는 않습니다

PhoneGap.exec = function(success, fail, service, action, args) { 
    try { 
     var callbackId = service + PhoneGap.callbackId++; 
     if (success || fail) { 
      PhoneGap.callbacks[callbackId] = {success:success, fail:fail}; 
     } 

     //using: ["Notification", "alert", callbackId, true] 
     var r = prompt(PhoneGap.stringify(args), 
         "gap:"+PhoneGap.stringify([service, action, callbackId, true])); 

     //... 
    } catch (e2) { 
     console.log("Error: "+e2); 
    } 
}; 

을 지금 PhoneGap.stringify() 단지에 해결 JSON.stringify()이므로 Phonegap 코드는 두 개의 JSON 객체/배열이있는 prompt() 함수를 호출하여 notification.alert() API 메소드를 실행합니다. 내 가정은 prompt()native JavaScript prompt() function (이 함수를 재정의하는 JavaScript 코드에서 아무 것도 찾지 못했습니다)입니다. 그렇다면이 코드는 어떻게 작동합니까?

그들은뿐만 아니라, 다양한 장소에서 prompt()의 유사한 사용합니다 (양식 gap.*:.*의 두 번째 매개 변수를 포함하여 구체적으로) 그들이 prompt()를 호출하는 방법에 대한 특별한 뭔가가

PhoneGap.JSCallbackPort = prompt("getPort", "gap_callbackServer:"); 

있는가 사용자 정의 동작을 활성화합니까? 아니면 어떻게 든 JavaScript 코드 외부의 prompt() 함수의 기본 동작을 재정의 했습니까?

다른 버전은 API 호출을 실행하기 위해 약간 다른 메커니즘을 사용하는 것처럼 보이기 때문에 이는 Android 버전의 Phonegap에만 적용됩니다.

+0

프롬프트는 문자열을 반환합니다. 뭐가 잘못 되었 니? – xdazz

+1

잘못된 점은'prompt()'의 표준 버전이 사용자에게 대화 상자를 표시한다는 것입니다. 그러나 그것은 여기서 일어나는 것이 아닙니다. 이'prompt()'호출의 결과로 대화 상자가 표시되지 않고 대신 Phonegap API의 다른 부분이 호출됩니다. 본질적으로, 그들은 그들의 주요 API 진입 점으로'prompt()'를 사용하고 있으며 어떻게/왜 알고 싶습니다. – aroth

답변

7

prompt() 함수가 재정의되었습니다.

DroidGap.java에서 찾을 수 있습니다.

@Override 
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { 
...... 
} 
+0

그래, PhoneGap은 실제로 Android에서 자바 스크립트를 자바 브리지로 만들기 위해 프롬프트를 사용합니다. –

+1

흥미 롭습니다. 그래서 Phonegap은 실제 JavaScript 프롬프트 대화 상자가 표시되기 전에'prompt()'메서드가 호출 될 때마다 통보되는 webview에 정의 된 콜백/리스너를 가지고 있습니다. 그리고 콜백 메소드에서 그들은 기본적으로 인코딩 된 작업에 대한'prompt()'매개 변수를 확인하고, 발견되면 그것을 실행하고, 그렇지 않으면 false를 리턴 한 다음 결과를'JsPromptResult'를 통해 JavaScript로 다시 전달합니까? 그리고 onJsPrompt() 만 결과 객체를 통해 문자열을 반환 할 수 있기 때문에 onJsAlert() 또는 onJsConfirm()을 사용할 수 없다고 가정합니다. 영리한. 그리고 순회. – aroth

+1

@aroth 네, 그렇게 생각합니다. – xdazz

4

Android 2.3의 자바 스크립트에서 자바 브리지로의 작업이 중단되었습니다. 영리한 PhoneGap 기고가는 프롬프트에서 피기 백킹이 해결 방법이라는 것을 발견했습니다.

여기는 Android issue입니다.