Инициирование shouldStartLoadWithRequest с несколькими вызовами window.location.href
Я пытаюсь передать несколько вещей с веб-страницы внутри UIWebView обратно в приложение для iPhone с помощью метода shouldStartLoadWithRequest UIWebView.
В основном моя веб-страница вызывает window.location.href = "command://foo=bar", и я могу перехватить это в моем приложении без проблем. Теперь, если я создаю цикл и выполняю несколько вызовов window.location.href за раз, то следует, чтобы shouldStartLoadWithRequest вызывался только один раз, и получаемый вызов является последним срабатыванием window.location.href в конце цикла.
То же самое происходит с веб-представлением для Android, обрабатывается только последний файл window.location.href.
3 ответа
iFrame = document.createElement("IFRAME");
iFrame.setAttribute("src", "command://foo=bar");
document.body.appendChild(iFrame);
iFrame.parentNode.removeChild(iFrame);
iFrame = null;
Таким образом, это создает iframe, устанавливает его источник для команды, которую я пытаюсь передать приложению, затем, как только вызывается его добавление к телу shouldStartLoadWithRequest, затем мы удаляем iframe из тела и устанавливаем его в null, чтобы освободить память.
Я также проверил это на веб-обозревателе Android с помощью shouldOverrideUrlLoading, и он также работал правильно!
Я ударил эту проблему также, и вот мое решение, которое работает для меня. Все мои функции JavaScript используют эту функцию __js2oc(msg) для передачи данных и событий в Objective-C через shouldStartLoadWithRequest: PS замените "command:" на ваш триггер "appname:", который вы используете.
/* iPhone JS2Objective-C bridge interface */
var __js2oc_wait = 300; // min delay between calls in milliseconds
var __prev_t = 0;
function __js2oc(m) {
// It's a VERY NARROW Bridge so traffic must be throttled
var __now = new Date();
var __curr_t = __now.getTime();
var __diff_t = __curr_t - __prev_t;
if (__diff_t > __js2oc_wait) {
__prev_t = __curr_t;
window.location.href = "command:" + m;
} else {
__prev_t = __curr_t + __js2oc_wait - __diff_t;
setTimeout( function() {
window.location.href = "command:" + m;
}, (__js2oc_wait - __diff_t));
}
}
Нет, изменение URL-адреса iframe не вызовет shouldOverrideUrlLoading, по крайней мере, в Android 2.2.