Замените вызовы функций во внешнем файле JavaScript из WebView Android - PullRequest
0 голосов
/ 03 апреля 2012

Android-приложение, над которым я работаю, опирается на веб-страницу для большей части своей функциональности. Когда пользователь щелкает ссылку, которая обычно вызывает window.open, я бы хотел, чтобы она вместо этого вызывала пользовательскую функцию. Таким образом, приложение перестает открывать окно браузера, что разрушает иллюзию использования приложения. У меня уже есть JavaScriptInterface, настроенный для замены всех экземпляров window.open, найденных на странице. У меня сейчас проблема с внешним файлом javascript. Функция очень похожа на эту

function LoadItem(url,title)
{
    window.open("/items.html?item=" + url + "&title=" + EncodeString(title), "song: " + title);
}

Я бы хотел исправить это так:

function LoadItem(url,title)
{
    window.LinkFixer.openInNewTab("/items.html?item=" + url + "&title=" + EncodeString(title), "song: " + title);
}

Это код, который у меня пока есть, что должен сделать это для меня.

public String processPage(String html)//called once the page has been loaded
{
    html = html.replace("window.open","window.LinkFixer.openInNewTab").replace("OpenSong","window.LinkFixer.openSong");
    String[] lines = html.split("\n");
    html = "";
    for(int i=0;i<lines.length;i++)
    {
        if(lines[i].contains("<script")&&lines[i].contains("src="))
        {
            lines[i] = getJs(lines[i]);
        }
        html += lines[i];
    }
    return html;
}

private String getJs(String line)//gets the javascript, fixes it so it's safe for the app, then returns it as inline rather than embeded
    {
        String jsFileName = line.replace("\"","'").replace("<script type='text/javascript' ","").replace("src=","").replace(">","").replace("'","").trim();
        //public static String makeGetRequest(String url,boolean oneLine)
        System.out.println(jsFileName);
        String targetUrl = "/BrowserControl/"+jsFileName;
        System.out.println(targetUrl);
        String jsFile = ShowWebInterface.makeGetRequest(targetUrl,false);
        Log.d("OrigFile"+jsFileName,jsFile);
        jsFile = jsFile.replace("window.open","window.LinkFixer.openInNewTab").replace("OpenSong","window.LinkFixer.openSong").replace("function window.LinkFixer.openSong(url, title)","window.LinkFixer.openSong");
        Log.d("NewFile"+jsFileName,jsFile);
        return "<script type=\"text/javascript\">\n"+jsFile;
    }

Для первого клика все работает. Для чего-либо после этого он загружает страницу в окне браузера вне контроля моего приложения. Страница, с которой у меня возникают проблемы, использует ajax, поэтому я вполне уверен, что это вызывает какие-то проблемы. Я думаю, что браузер по-прежнему будет вызывать метод onProgressChanged, но я могу ошибаться.

browser.setWebChromeClient(new WebChromeClient()
    {
        public void onProgressChanged(WebView webView, int newProgress)
        {
            super.onProgressChanged(webView,newProgress);
            if(newProgress >= 100)
            {
                System.out.println("Done loading");
                browser.loadUrl("javascript:document.getElementsByTagName(\"html\")[0].innerHTML = window.LinkFixer.processPage((document.getElementsByTagName(\"html\")[0].innerHTML))");
            }
        }
    });

Есть ли что-то, что я пропускаю? Какой-нибудь способ угнать функцию обратного вызова ajax? Или, может быть, что-то еще, что я упустил.

1 Ответ

2 голосов
/ 04 апреля 2012

Я полагаю, вы должны использовать shouldOverrideUrlLoading(...)

Как сделать ссылки открытыми в веб-просмотре или открывать браузер по умолчанию в зависимости от имени домена? , похоже, является хорошим примером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...