Webview Android, chargement de fichier javascript dans le dossier des actifs
J'ai vu cette question a été posée à un grand nombre de fois, mais ne peut toujours pas réussi à obtenir mon code de travail.
Je veux que mon webview pour charger une URL (dire www.google.com puis appliquer un peu de javascript stockées dans assets/jstest.js
qui contient les éléments suivants:
function test(){
document.bgColor="#00FF00"; //turns to green the background color
}
Et voici où j'essaie de charger le JS:
@Override
public void onPageFinished(WebView view, String url){
view.loadUrl("javascript:(function() { "
+ " document.bgColor='#FF0000';" //turns to red the background color
+ " var script=document.createElement('script'); "
+ " script.setAttribute('type','text/javascript'); "
+ " script.setAttribute('src', 'file:///android_asset/jstest.js'); "
+ " script.onload = function(){ "
+ " test(); "
+ " }; "
+ " document.getElementsByTagName('head')[0].appendChild(script); "
+ "})()");
}
Je sais que le javascript ici fonctionne parce que la couleur d'arrière-plan tourne au rouge, mais pour quelque raison il ne se charge pas jstest.js
. Je pense que le problème pourrait être dans le chemin d'accès au fichier (j'en suis certain, une ligne de code javascript est correct), mais il semble correct pour moi. Et le fichier est dans le dossier de droite.
Ce qui me manque?
MODIFIER:
Depuis WebResourceResponse
classe est uniquement disponible avec l'API de Niveau 11, voici ce que j'ai compris à la fin.
public void onPageFinished(WebView view, String url){
String jscontent = "";
try{
InputStream is = am.open("jstest.js"); //am = Activity.getAssets()
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while (( line = br.readLine()) != null) {
jscontent += line;
}
is.close();
}
catch(Exception e){}
view.loadUrl("javascript:(" + jscontent + ")()");
}
avec le jstest.js
contenant simplement:
function() {
document.bgColor="#00FF00";
}
source d'informationauteur Jacob
Vous devez vous connecter pour publier un commentaire.
J'ai essayé la même chose, le chargement d'un bookmarklet (le code javascript dans votre loadUrl ()) dans un tiers de la page. Mon bookmarklet dépend aussi d'autres actifs (les fichiers javascript et css) qui ne serait pas de charge avec un file:///android_asset URL.
C'est parce que le contexte de sécurité de la page n'est toujours que de, par exemple, http://www.google.comet qui n'est pas autorisé à accéder au fichier: Url. Vous devriez être capable de voir les erreurs, si vous avez d'approvisionnement/remplacer un WebChromeClient.onConsoleMessage().
J'ai fini avec une bidouille où j'ai changé le bookmarklet de l'actif de référence à un faux schéma d'URL, comme:
et ajouté un WebViewClient.shouldInterceptRequest() remplacer ce qui ressemble pour ceux et charges de l'actif à l'aide d'assetmanager.open().
Une chose que je n'aime pas à propos de ce quelque chose, c'est que l'actif: régime est ouvert à toute tierce partie HTML/Javascript sur toutes les pages de mon point de vue des charges, leur donner accès à mon application actifs.
Une alternative, que je n'ai pas essayer, ce serait d'intégrer les sous-actif dans le bookmarklet à l'aide de données: Url, mais qui peut obtenir difficile.
Je préfèrerais si il y avait un moyen de manipuler le contexte de sécurité de juste la JS bookmarklet je suis en cours de chargement dans loadUrl(), mais je ne peux pas trouver quelque chose comme ça.
Voici un extrait:
Je pense que le iceam crème webview client de cordoue ne la très chose que vous voulez faire.
Ce serait bien si cela a été documenté quelque part, mais, d'aussi loin que je peux voir, il n'est pas.
Prendre un coup d'oeil à cordoue android github:
https://github.com/apache/incubator-cordova-android/blob/master/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java