validar validacion online formularios formulario enviar ejemplos desventajas con codigo antes javascript android caching webview

validacion - validar formulario javascript html5



Vista web de Android: Inyecte el archivo local de Javascript en la página web remota (4)

Hay una forma de ''forzar'' la inyección de sus archivos locales de Javascript desde activos locales (por ejemplo, assets / js / script.js), y evitar el ''No permitido cargar recursos locales: file: /// android_assets / js /script.js ... ''problema.

Es similar a lo que se describe en otro hilo (vista web de Android, cargar el archivo javascript en la carpeta de activos ), con codificación / decodificación BASE64 adicional para representar su archivo Javascript como una cadena imprimible.

Estoy usando un dispositivo virtual Android 4.4.2, nivel 19 de API.

Aquí hay algunos fragmentos de código:

[assets / js / script.js]:

''use strict''; function test() { // ... do something } // more Javascript

[MainActivity.java]:

... WebView myWebView = (WebView) findViewById(R.id.webView); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setAllowUniversalAccessFromFileURLs(true); myWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); injectScriptFile(view, "js/script.js"); // see below ... // test if the script was loaded view.loadUrl("javascript:setTimeout(test(), 500)"); } private void injectScriptFile(WebView view, String scriptFile) { InputStream input; try { input = getAssets().open(scriptFile); byte[] buffer = new byte[input.available()]; input.read(buffer); input.close(); // String-ify the script byte-array using BASE64 encoding !!! String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP); view.loadUrl("javascript:(function() {" + "var parent = document.getElementsByTagName(''head'').item(0);" + "var script = document.createElement(''script'');" + "script.type = ''text/javascript'';" + // Tell the browser to BASE64-decode the string into your script !!! "script.innerHTML = window.atob(''" + encoded + "'');" + "parent.appendChild(script)" + "})()"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); myWebView.loadUrl("http://www.example.com"); ...

Se me ha preguntado muchas veces antes, hojeé todo, todavía no tengo respuestas claras.

Pregunta simplificada: ¿Es posible inyectar un archivo local de Javascript (desde el activo o el almacenamiento) a una página web remota cargada en una vista web de Android? Sé que es posible inyectar dichos archivos en páginas web locales (HTML de activos) cargadas en una vista web.

¿Por qué necesito que esto funcione? : Para que la experiencia de navegación sea más rápida, evitando la descarga de archivos más grandes como archivos Js y CSS en todo momento. Quiero evitar el almacenamiento en caché de Web-View.


Sí, podría usar shouldInterceptRequest () para interceptar la carga de la URL remota y devolver el contenido almacenado localmente.

WebView webview = (WebView) findViewById(R.id.webview); webview.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest (final WebView view, String url) { if (url.equals("script_url_to_load_local")) { return new WebResourceResponse("text/javascript", "UTF-8", new FileInputStream("local_url"))); } else { return super.shouldInterceptRequest(view, url); } } });


Tenga cuidado al usar evaluateJavascript : si hay un error de sintaxis o una excepción en su javascript llamará a onReceiveValue con un valor nulo. La forma más común de compatibilidad con SDK 19 y versiones anteriores parece ser la siguiente: Rellenar formulario en WebView con Javascript

Además, si te desesperas terriblemente por algún tipo de funcionalidad de navegador (en mi caso, nunca sabría cómo hacer que DRM funcione bien) podrías usar un bookmarklet dentro de cromo normal, que funciona solo si escribes el nombre de marcador en el cuadro multifunción pero funciona y no inyecta javascript.

También tenga en cuenta que con el WebView predeterminado no puede usar las alertas de JavaScript para probar nada, no se muestran. También tenga en cuenta que "video" de forma predeterminada (como etiquetas html <video>) "no funciona" de manera predeterminada y que el video DRM tampoco funciona de manera predeterminada, todas son opciones de configuración: /


loadUrl solo funcionará en la versión anterior use evaluateJavascript

webview.evaluateJavascript("(function() { document.getElementsByName(''username'')[0].value=''USERNAME'';document.getElementsByName(''password'')[0].value=''PASSWORD''; "+ "return { var1: /"variable1/", var2: /"variable2/" }; })();", new ValueCallback<String>() { @Override public void onReceiveValue(String s) { Log.d("LogName", s); // Prints: {"var1":"variable1","var2":"variable2"} } });