我要注入的JavaScript
文件到我的网站。我的网站是一个简单的 HTML
是在服务器上的页面。我注入了 CSS
文件。 (与Manish的帮助)
所以我可以管理我的简单 HTML
站点 CSS
现在。但我想用 JavaScript来管理它
太。我的 jscript.js
文件在资产
文件夹中。我想有我的网站上的JavaScript
的完全访问权限。 (请记住,这是我的地盘)。请写出正确的codeS我。 Thankx。
下面是我的 MainActivity.java
文件:
包com.example.z5070.myapplication;进口android.support.v7.app.ActionBarActivity;进口android.os.Bundle;进口android.util.Base64;进口android.view.Menu;进口android.view.MenuItem;进口android.webkit.WebSettings;进口android.webkit.WebView;进口android.webkit.WebViewClient;进口的java.io.InputStream;公共类MainActivity扩展ActionBarActivity { web视图的WebView; @覆盖 保护无效的onCreate(捆绑savedInstanceState){ super.onCreate(savedInstanceState); 的setContentView(R.layout.activity_main); web视图=新的WebView(本); 的setContentView(web视图); webView.getSettings()setJavaScriptEnabled(真)。 webView.setWebViewClient(新WebViewClient(){ @覆盖 公共无效onPageFinished(的WebView视图,字符串URL){ injectCSS(); super.onPageFinished(查看,网址); } }); webView.loadUrl(http://www.example.com/); } 私人无效injectCSS(){ 尝试{ 为InputStream的InputStream = getAssets()开(style.css文件)。 字节[]缓冲区=新的字节[inputStream.available()]; inputStream.read(缓冲液); inputStream.close(); 字符串连接codeD = Base64.en codeToString(缓冲,Base64.NO_WRAP); webView.loadUrl(JavaScript的:(函数(){+ VAR父= document.getElementsByTagName(头)项目(0); + VAR风格=使用document.createElement('风格'); + style.type ='文/ CSS'; + style.innerHTML = window.atob('+ EN codeD +'); + parent.appendChild(样式)+ })()); }赶上(例外五){ e.printStackTrace(); } } @覆盖 公共布尔onCreateOptionsMenu(菜单菜单){ 。getMenuInflater()膨胀(R.menu.menu_main,菜单); 返回true; } @覆盖 公共布尔onOptionsItemSelected(菜单项项){ INT ID = item.getItemId(); 如果(ID == R.id.action_settings){ 返回true; } 返回super.onOptionsItemSelected(项目); } }
解决方案
添加到注入的JavaScript文件的新方法。
私人无效injectJS(){ 尝试{ 为InputStream的InputStream = getAssets()开(jscript.js); 字节[]缓冲区=新的字节[inputStream.available()]; inputStream.read(缓冲液); inputStream.close(); 字符串连接codeD = Base64.en codeToString(缓冲,Base64.NO_WRAP); webView.loadUrl(JavaScript的:(函数(){+ VAR父= document.getElementsByTagName(头)项目(0); + VAR脚本=使用document.createElement('脚本'); + script.type =文/ JavaScript的; + script.innerHTML = window.atob('+ EN codeD +'); + parent.appendChild(脚本)+ })()); }赶上(例外五){ e.printStackTrace(); } }
通话两种方法:injectCSS()和injectJS()网页加载完成后,
webView.setWebViewClient(新WebViewClient(){ @覆盖 公共无效onPageFinished(的WebView视图,字符串URL){ injectCSS(); injectJS(); super.onPageFinished(查看,网址); } });
我希望这能解决这个问题。
警惕注射js文件会表现中定义如何的onload事件。
I want to inject javascript
file to my site. My site is a simple html
page that is on server. I have injected css
file. (with Manish's help)
So I can manage my simple html
site with CSS
now. But I want to manage it with javascript
too. My jscript.js
file is in asset
folder. I want to have full access of javascript
on my site. (Remember that, it is MY site) . please write the correct codes for me. Thankx.
Here is my MainActivity.java
file:
package com.example.z5070.myapplication;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Base64;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import java.io.InputStream;
public class MainActivity extends ActionBarActivity {
WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = new WebView(this);
setContentView(webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
injectCSS();
super.onPageFinished(view, url);
}
});
webView.loadUrl("http://www.example.com/");
}
private void injectCSS() {
try {
InputStream inputStream = getAssets().open("style.css");
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
inputStream.close();
String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
webView.loadUrl("javascript:(function() {" +
"var parent = document.getElementsByTagName('head').item(0);" +
"var style = document.createElement('style');" +
"style.type = 'text/css';" +
"style.innerHTML = window.atob('" + encoded + "');" +
"parent.appendChild(style)" +
"})()");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
解决方案
Add a new method to inject javascript file.
private void injectJS() {
try {
InputStream inputStream = getAssets().open("jscript.js");
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
inputStream.close();
String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
webView.loadUrl("javascript:(function() {" +
"var parent = document.getElementsByTagName('head').item(0);" +
"var script = document.createElement('script');" +
"script.type = 'text/javascript';" +
"script.innerHTML = window.atob('" + encoded + "');" +
"parent.appendChild(script)" +
"})()");
} catch (Exception e) {
e.printStackTrace();
}
}
Call both methods: injectCSS() and injectJS() after page finishes loading.
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
injectCSS();
injectJS();
super.onPageFinished(view, url);
}
});
I hope this solves the problem.
Be wary of how onload events defined inside inject js file would behave.