注入javascript文件到我的网站在android的web视图我的、视图、文件、网站

2023-09-06 07:06:40 作者:混世丶小宅男

我要注入的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();        }    } 
这几款开源Web分析软件你也许需要

通话两种方法: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.