Я просматривал источники Phonegap для Android и пытался проверить, что их метод notification.alert()
просто делегирует нативную функцию JavaScript alert()
.Их код выглядит следующим образом:
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]);
};
То, что для меня выглядит как «alert», будет интерпретировано как имя функции, которую нужно вызвать в 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 выполняет метод API notification.alert()
, вызывая функцию prompt()
с двумя объектами / массивами JSON.Я предполагаю, что prompt()
- это собственная функция подсказки JavaScript () (я не нашел в их коде JavaScript ничего, что могло бы переопределить эту функцию).Если это так, то как работает этот код?
Они также используют prompt()
в других местах:
PhoneGap.JSCallbackPort = prompt("getPort", "gap_callbackServer:");
Есть ли что-то особенное в том, как они звонят prompt()
(в частности, включив секундупараметр вида gap.*:.*
), который позволяет настраивать поведение?Или они каким-то образом переопределяют поведение по умолчанию функции prompt()
где-то вне их кода JavaScript?
Обратите внимание, что это относится конкретно к версии Phonegap для Android, так как другие версии, похоже, используют немного другие механизмы для выполнениявызовы API.