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"}
}
});