注入javascript文件到我的网站在android的web视图 [英] Inject javascript file to my site with webview in android

查看:102
本文介绍了注入javascript文件到我的网站在android的web视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要注入的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.

这篇关于注入javascript文件到我的网站在android的web视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆