最近做一个项目,混合了NativeCode 和 HTML,为了便于JS 调用App的一些方法,统一封装一个Js方法,记录如下

Android 端首先要再WebView中允许JS的调用

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
myWebView.addJavascriptInterface(new WebAppInterface(this), "JsAndroid");

IOS端使用的是一个开源库 EasyJsWebView,在IOS端引用即可

JS代码:

function callApp(method) {
var args = [].slice.call(arguments).splice(1);
var s = "";
if (/android/i.test(navigator.userAgent)) {//安卓
s = window["JsAndroid"][method].apply(window.JsAndroid, args);
}
if (/ipad|iphone|mac/i.test(navigator.userAgent)) {//ios
s = window["JsIOS"][method].apply(this, args);
}
return s;
} //与IOS交互的方法
window.EasyJS = {
__callbacks: {}, invokeCallback: function (cbId, removeAfterExecute) {
var args = Array.prototype.slice.call(arguments).splice(2); for (var i = 0, l = args.length; i < l; i++) {
args[i] = decodeURIComponent(args[i]);
} var cb = EasyJS.__callbacks[cbId];
if (removeAfterExecute) {
EasyJS.__callbacks[cbId] = undefined;
}
return cb.apply(null, args);
}, call: function (obj, functionName, args) {
var formattedArgs = [];
for (var i = 0, l = args.length; i < l; i++) {
if (typeof args[i] == "function") {
formattedArgs.push("f");
var cbId = "__cb" + (+new Date);
EasyJS.__callbacks[cbId] = args[i];
formattedArgs.push(cbId);
} else {
formattedArgs.push("s");
formattedArgs.push(encodeURIComponent(args[i]));
}
} var argStr = (formattedArgs.length > 0 ? ":" + encodeURIComponent(formattedArgs.join(":")) : ""); var iframe = document.createElement("IFRAME");
iframe.setAttribute("src", "easy-js:" + obj + ":" + encodeURIComponent(functionName) + argStr);
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null; var ret = EasyJS.retValue;
EasyJS.retValue = undefined; if (ret) {
return decodeURIComponent(ret);
}
}, inject: function (obj, methods) {
alert(obj);
window[obj] = {};
var jsObj = window[obj];
for (var i = 0, l = methods.length; i < l; i++) {
(function () {
var method = methods[i];
var jsMethod = method.replace(new RegExp(":", "g"), "");
jsObj[jsMethod] = function () {
alert("qq");
return EasyJS.call(obj, method, Array.prototype.slice.call(arguments));
};
})();
}
}
};

  

说明一下,一开始调用Android也是采用window["JsAndroid"][method].apply(this,args),这样的话,就完全一致了。但是在调试的时候发现这种方式无法正常调用,google后发现是由于this的的影响域导致的,需要指明查找域。 参考

记录一下!

在webView 中使用JS 调用 Android / IOS的函数 Function的更多相关文章

  1. WebView中JS调用Android Method 遇到的坑整理

    WebView是android中常用的一个组件,其作用是展示网页,并让网页和android app进行一些业务逻辑上的交互. 其坑无数,相信用过的都知道,一个一个来解决吧. 1.怎么互调: <! ...

  2. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  3. 在Android的webview中定做js的alert,confirm和prompt对话框的方法

    在Android的webview中定制js的alert,confirm和prompt对话框的方法 http://618119.com/archives/2010/12/20/199.html 1.首先 ...

  4. PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码

    PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码 看看新闻网>看引擎>开源产品 0人收藏此文章, 发表于8小时前(2013-09-06 00:39) ...

  5. [翻译]Nativescript 中 Web 视图与 Android/IOS 的双向通信

    English document From http://shripalsoni.com/blog/nativescript-webview-native-bi-directional-communi ...

  6. [转]JS调用Android里面的方法,Android调用JS里面的方法

    FROM : http://blog.csdn.net/hj563308597/article/details/45197709 Android WebView 在公司Android的开发过程中遇到一 ...

  7. js调用android本地java代码

    js调用android本地java代码 当在Android上使用WebView控件开发一个Web应用时,可以创建一个通过Javascript调用Android端java代码的接口.也就是可以通过Jav ...

  8. c#调用js,以及js调用C#里的函数, c#自己生成js代码,实现对web的控制

    using mshtml;using System;using System.Collections.Generic;using System.Linq;using System.Security.P ...

  9. iOS的WebView中使用javascript调用原生的api

    1. 首先在javascript中加入相关代码 $('.content .saveCode').on('touchstart', function () {//touchstart if (temp ...

随机推荐

  1. loadrunner11的移动端性能测试之结果分析

    测试步骤之结果分析器(Analysis) 进入Analysis 当场景停止运行后,可从Controller中进入.点击[Results]—[Analysis Results]见下图: 若想打开一个已保 ...

  2. (转)SpringBoot非官方教程 | 第十二篇:springboot集成apidoc

    首先声明下,apidoc是基于注释来生成文档的,它不基于任何框架,而且支持大多数编程语言,为了springboot系列的完整性,所以标了个题. 一.apidoc简介 apidoc通过在你代码的注释来生 ...

  3. python16_day39【算法】

    复习: 1.递归 调用自身 结束条件 一.冒泡算法 def bubble_sort(numbs): for i in range(len(numbs)-1): # 这个循环负责设置冒泡排序进行的次数. ...

  4. 字典树 trie

    Trie树        Trie树,就是字母树.Trie树是多叉树,每个节点为一个字母.其根节点为象征节点(就是说没有含义,但是存在这个节点),从根节点开始建立,每个节点至多为26个子节点(不要我说 ...

  5. Codeforces Round #532 (Div. 2) Solution

    A. Roman and Browser 签到. #include <bits/stdc++.h> using namespace std; ]; int get(int b) { ]; ...

  6. Python虚拟环境的安装

    1.升级python包管理工具pip pip install --upgrade pip 备注:当你想升级一个包的时候“pip install --upgrade”包名 2.python虚拟环境的安装 ...

  7. p4c-bm安装

    Generates the JSON configuration for the behavioral-model (bmv2).它是用来形成 行为模型BMV2 的 JSON配置 的. Importa ...

  8. 使用ntpdate工具校正linux服务器时间

    当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间. 安装:yum install ntpdate ntpdate简单用法: # ntpdate ip # ntpdate 210 ...

  9. UVa 1635 无关的元素(唯一分解定理+二项式定理)

    https://vjudge.net/problem/UVA-1635 题意: 给定n个数a1,a2,...an,依次求出相邻两数之和,将得到一个新数列.重复上述操作,最后结果将变成一个数.问这个数除 ...

  10. socket可读可写就绪条件

    参考 <UNIX 网络编程卷1>中的<第6章 I/O复用> 一. 满足下列四个条件中的任何一个时,一个套接字准备好读. 该套接字接收缓冲区中的数据字节数大于等于套接字接收缓存区 ...