javascript - 在android中使用webview将javascript文件注入(inject)我的网站

标签 javascript android webview webkit

我想将 javascript 文件注入(inject)我的站点。我的站点是服务器上的一个简单的 html 页面。我注入(inject)了 css 文件。 (with Manish's help)

因此我现在可以使用 CSS 管理我的简单 html 网站。但我也想用 javascript 来管理它。我的 jscript.js 文件位于 asset 文件夹中。我想在我的网站上拥有对 javascript 的完全访问权限。 (记住,这是我的网站)。请为我写出正确的代码。谢谢。

这是我的 MainActivity.java 文件:

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


        }

最佳答案

添加一个新的方法来注入(inject)javascript文件。

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

在页面加载完成后调用这两种方法:injectCSS() 和 injectJS()。

webView.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageFinished(WebView view, String url) {
                injectCSS();
                injectJS();
                super.onPageFinished(view, url);
            }
        });

我希望这能解决问题。

注意注入(inject) js 文件中定义的 onload 事件的行为方式。

关于javascript - 在android中使用webview将javascript文件注入(inject)我的网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30036907/

相关文章:

只有 getter 的 JavaScript ES6 类

javascript - 通过 $.each() 获取每个元素的属性

javascript - nodemon 和 nodeclipse 不会在文件更改时自动重新启动

在 webview 中单击输入时不显示 Android 键盘

android - 自定义 Android WebView 以在内部打开除 YouTube 链接之外的所有链接

javascript - 如何处理动态复选框集上的数据绑定(bind)

Android 在 SurfaceView 周围应用边框

iphone - 一般最大网页大小? iPhone?安卓?

java - 从 Activity 中删除 RecyclerView 适配器项

android - 删除缓存文件 - WebView Android 4.4+