Подтвердить что ты не робот

JavaScript не работает в Android Webview?

Я пытаюсь сделать версию Android для релятивистского простого приложения iOS, которое использует веб-просмотр, некоторые кнопки, а затем использует javascript-вызовы для CMS.

Но я застрял на довольно ранней стадии разработки: веб-просмотр не работает с javascript. Я прочитал много сообщений о том, как включить JS в веб-просмотр Android, но пока не повезло.

Ниже приведен код моего кода:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.setWebChromeClient(new WebChromeClient());
    mWebView.setWebViewClient(new HelloWebViewClient()
    {
        @Override  
        public void onPageFinished(WebView view, String url)  
        {  
            //Calling an init method that tells the website, we're ready 
            mWebView.loadUrl("javascript:m2Init()");
            page1(mWebView);
        }  
    });
  mWebView.loadUrl("http://my_url/mobile/iphone//app.php");  
}

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
        mWebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

public void page11(View view)
{
    mWebView.loadUrl("javascript:m2LoadPage(1)");
}

Что я здесь делаю неправильно? URL-адрес работает отлично в моем приложении iOS и в браузере. Но не в моем приложении!

Скажите, пожалуйста, что-то очевидное...

4b9b3361

Ответ 1

ИСПРАВЛЕНО! Подстегнутая ошибкой, я обнаружил, что мне нужно установить

setDomStorageEnabled(true)

для настроек веб-просмотра.

Спасибо за вашу помощь Стефан :)

Ответ 2

Если что-то с WebView на Android не работает, я всегда стараюсь, чтобы установить эти сумасшедшие флаги, например

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDomStorageEnabled(true);
    webSettings.setLoadWithOverviewMode(true);
    webSettings.setUseWideViewPort(true);
    webSettings.setBuiltInZoomControls(true);
    webSettings.setDisplayZoomControls(false);
    webSettings.setSupportZoom(true);
    webSettings.setDefaultTextEncodingName("utf-8");

Интересно, почему они не заданы по умолчанию, кто будет ожидать веб-страницы без содержимого javascript в настоящее время, и что использование с включенным javascript, когда DOM недоступен, если не указано. Надеюсь, кто-то подал это как ошибку или улучшение/функцию-запрос уже, и обезьяны работают над ним.

а затем где-то есть гниение, например:

webView.getSettings().setPluginState(PluginState.ON);

Все это для загрузки веб-страниц внутри приложения.

В iOS все это так просто - Swift 3.0

private func openURLWithInAppBrowser(urlString:String) {
    guard let url = URL(string:urlString) else {
        return
    }
    let sfSafari = SFSafariViewController(url:url)
    present(sfSafari, animated: true, completion: nil)
}

Ответ 3

Загрузка javascript в webview

webView.getSettings().setDomStorageEnabled(true);

Ответ 4

Вы включили правильное интернет-разрешение в манифесте? В противном случае все выглядит хорошо. Случайно, вы также тестировали этот код на реальном телефоне Android? И не только на эмуляторе?

Вот хороший учебник о немного другом подходе. Вы можете попробовать это, чтобы увидеть, работает ли он для вас.

Ответ 5

Это видео (http://youtu.be/uVqp1zcMfbE) дало мне подсказку, чтобы заставить его работать. Ключ должен сохранить ваши файлы html и js в папке Android assets/. Затем вы можете легко получить к ним доступ через:

webView.loadUrl("file:///android_assets/your_page.html");

Ответ 6

Добавьте следующие строки кода в свой файл MainActivity.java

Это помогло мне включить JS

  webSetting.setJavaScriptEnabled(true);
  webView.setWebChromeClient(new WebChromeClient());
  webView.setWebViewClient(new WebViewClient());

не забудьте об этом разрешении в файле AndroidManifest.

<uses-permission Android:name="Android.permission.INTERNET" />

Ответ 7

Просто разрешите вашему WebView запускать JS, просто так:

WebView web=(WebView)findViewById(R.id.web);
web.getSettings().setJavaScriptEnabled(true);

Ответ 8

Чтобы включить всплывающие окна javascript в WebView, необходимо установить webChromeClient и переопределить методы openFileChooser.

    mWebview.setWebChromeClient(new WebChromeClient(){
        // For Android 4.1+
        @SuppressWarnings("unused")
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
            mUploadMessage = uploadMsg;

            Intent i = new Intent(Intent.ACTION_GET_CONTENT);

            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType(acceptType);

            startActivityForResult(Intent.createChooser(i, "SELECT"), 100);
        }

        // For Android 5.0+
        @SuppressLint("NewApi")
        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
            if (mUploadMessageArr != null) {
                mUploadMessageArr.onReceiveValue(null);
                mUploadMessageArr = null;
            }

            mUploadMessageArr = filePathCallback;

            Intent intent = fileChooserParams.createIntent();

            try {
                startActivityForResult(intent, 101);
            } catch (ActivityNotFoundException e) {
                mUploadMessageArr = null;

                Toast.makeText(activity,"Some error occurred.", Toast.LENGTH_LONG).show();

                return false;
            }

            return true;
        }
    });

И обработайте onActivityResult, как показано ниже:

@SuppressLint("NewApi")
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 100) {
        if (mUploadMessage == null) return;
        Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();
        mUploadMessage.onReceiveValue(result);
        mUploadMessage = null;
    }

    else if (requestCode == 101) {
        if (mUploadMessageArr == null) return;
        mUploadMessageArr.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
        mUploadMessageArr = null;
    }

}

Ответ 9

Если вы находитесь в Kotlin, вы можете использовать эти методы, чтобы заставить JavaScript работать:

webView.apply {
     loadUrl(
         "file:///android_asset/frm/my_html_landing_page_here.html"
     )

     settings.javaScriptEnabled = true
     settings.domStorageEnabled = true
 }

Также убедитесь, что вся ваша папка находится в папке Assets (включая html, javascript и другие необходимые файлы)

Приветствия.

Ответ 10

Если ничего из вышеперечисленного не помогло, попробуйте добавить задержку в слушателе WebViewClient.onPageFinished.

override fun onPageFinished(view: WebView?, url: String?) {
            Handler().postDelayed({
                //update your view with js here
                super.onPageFinished(view, url)
            }, 1000)
        }