Webview не может загрузить javascript в onPageFinished

Я хочу, чтобы мой веб-просмотр вставлял вид javascript после загрузки страницы. Однако добавленный мной javascript так и не был выполнен :( что я могу с этим сделать?

mWebView = findViewById(R.id.webview);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished (WebView view, String url) {
            super.onPageFinished(view, url);
            Log.d("WebClient", "onPageFinished");
            view.loadUrl("javascript:(function(){"+
                    "aTagElements=document.getElementsByTagName('a');" +
                    "randromElement=aTagElements[Math.floor(Math.random() * aTagElements.length)];"+
                    "clickEvent=document.createEvent('HTMLEvents');"+
                    "clickEvent.initEvent('click',true,true);"+
                    "randromElement.dispatchEvent(clickEvent);" +
                    "alert('event dispatched.');"+ //<---not called
                    "})()");
        }
});

Даже если я закомментирую все скрипты, кроме строки alert, все равно ничего не произойдет.

Где находится URL-адрес веб-страницы, которую вы хотите загрузить

Manoj Perumarath 18.02.2019 06:11

@ManojPerumarath, какой бы ни был URL, мой код не работает.

Simon Leung 18.02.2019 06:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
219
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Попробуйте приведенное ниже решение, возможно, оно сработает для вас.

WebSettings webSettings = webView.getSettings();
webSettings.setDefaultTextEncodingName("utf-8");
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setLoadWithOverviewMode(true);

Вам придется использовать это на стороне приложения

mWebView .addJavascriptInterface(new WebAppInterface(this), "Android");

и придется реализовать метод на стороне php, где на самом деле этот метод будет запускаться

public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}

на PHP Side реализовать вот так

<input type = "button" value = "Say hello" onClick = "showAndroidToast('Hello Android!')" />

<script type = "text/javascript">
    function showAndroidToast(toast) {
        Android.showToast(toast);
    }
</script>

Для полной справки вы можете пройти по эта ссылка

Всякий раз, когда вы нажимаете кнопку webView, вы получаете сообщение

Мой код предназначен для создания поведения «щелчок» в загруженном HTML, этот пример может мне не подойти. Спасибо за ваши усилия.

Simon Leung 18.02.2019 06:43

@SimonLeung, stackoverflow.com/questions/32163517/…

ॐ Rakesh Kumar 18.02.2019 06:57

@Simon Leung, в чем проблема сейчас?

ॐ Rakesh Kumar 18.02.2019 07:13

Вставка javascript после загрузки страницы. AssessmentJavascript дает мне обратный вызов, но javascript не запускается.

Simon Leung 18.02.2019 07:18
Ответ принят как подходящий

Попробуйте использовать evaluvateJavascript, loadUrl будет работать только в старой версии.

webview.evaluateJavascript("(function() { "javascript:(function(){"+
                "aTagElements=document.getElementsByTagName('a');" +
                "randromElement=aTagElements[Math.floor(Math.random() * aTagElements.length)];"+
                "clickEvent=document.createEvent('HTMLEvents');"+
                "clickEvent.initEvent('click',true,true);"+
                "randromElement.dispatchEvent(clickEvent);" +
                "alert('event dispatched.');";

Оценить Javascript

он принимает 2 параметра, а второй - обратный вызов значения. Я помещаю журнал в обратный вызов, и он показывает журнал, но javascript (даже предупреждающий) не выполняется.

Simon Leung 18.02.2019 06:50

вы пробовали это только с помощью оповещения?

Manoj Perumarath 18.02.2019 07:27

Я попробовал простой HTML-код, сделанный самостоятельно, и теперь он работает! Я хватаю 2 вещи, которые вводят меня в заблуждение. 1) пользователи не могут видеть сгенерированные события щелчка 2) функция оповещения работает в моем простом html, возможно, оповещение было заблокировано другими веб-сайтами, которые, как я думал, скрипт не работает.

Simon Leung 18.02.2019 08:21

Вы смешиваете взгляды. Так изменить

super.onPageFinished(view, url);

К

super.onPageFinished(mWebView, url);

Другие вопросы по теме