这几天遇到了个棘手问题(c调b),经过排错查出了问题。

一,问题描述如下:

  1.客户端需要调用father.html中一个js方法,特殊之处在于 这个father.html中有个iframe嵌套了一个son.jsp,本质就是客户端需要调用son.jsp

中的一个getUserid("userid")方法把客户端的userid传递给son.jsp,现象是客户端拼接了改js方法并且也传入了userid,调用了stringbyevaluatingjavascriptfromstring执行该js方法后,son.jsp中的该方法没反应,也就是客户端没调用到这个js。需要说明的是father.html 和son.jsp的域名是不同的。

  2,C端调用B端的js方法不是主动的,而是B端给C端发信号说:C端,可以来执行我的这个方法了,我把方法名字给你了,你拿到后拼接传入参数执行下就行了

二,排查过程:

  1,客户端的webView:shouldLoad方法中,先拿到father.html的链接,执行完后又拿到了son.jsp的链接,最后拿到了son.jsp发给客户端的信号,也就是js方法名,拿到后传入参数执行了stringbyevaluatingjavascriptfromstring,这时候son.jsp端的该方法应该有反应的,但实际上没有被执行

  2,在father.html中也发送了同样的B调C指令,并且在father.html中也定义了同样的js方法后,重新运行如下:客户端的webView:shouldLoad方法中,先拿到father.html的链接,执行完后又拿到了B发送给C端的信号,也就是js方法名,拿到后传入参数执行了stringbyevaluatingjavascriptfromstring,接着father.html中的该js方法就执行了, 再然后才拿到了son.jsp的链接,接着拿到了son.jsp发给客户端的信号,也就是js方法名,拿到后传入参数执行了stringbyevaluatingjavascriptfromstring,这时候father.html中的js方法又被执行了一次,而son.jsp中的js方法依旧没被执行

  3,不在father.html中发送同样的B调C指令,只在father.html中定义了同样的js方法后,重新运行如下:客户端的webView:shouldLoad方法中,先拿到father.html的链接,然后才拿到了son.jsp的链接,接着拿到了son.jsp发给客户端的信号,也就是js方法名,拿到后传入参数执行了stringbyevaluatingjavascriptfromstring,这时候father.html中的js方法被执行了,而son.jsp中的js方法依旧没被执行

  4,结论:客户端拿到了B端发出的指令,也传入了B端需要的参数(userid),但执行失败了,原因就是客户端只在father.html中找了该js方法,但是没有找到,所以无法执行,而它进不到son.jsp中找,因为跨域了。所以该js方法执行失败。如果在father.html中找到了该js方法就执行

三,解决方案:

  1.在father.html中定义和son.jsp指令中相同的js方法,这样C端执行时,father.html中的该js方法就会被执行到了,拿到了客户端传递过来的userid,再调用son.jsp中的该方法,传递userid进去并执行,这样son.jsp就拿到了userid,总的来说就是曲线救国,让son.jsp的js方法间接被执行了

  2.具体的father.html中的js调用son.jsp中的js方法:(1)在两者的<script/>块内定义相同的document.domain='域名',再调用

就实现了js的跨域调用。

客户端调用web中js方法(C调B)跨域问题的更多相关文章

  1. Java Web中实现设置多个域名跨域访问

    添加以下设置可允许所有域名跨域访问: response.setHeader("Access-Control-Allow-Origin","*"); 但在实际应用 ...

  2. 纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据

    最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概 ...

  3. 【ASP.NET Web API教程】3.2 通过.NET客户端调用Web API(C#)

    原文:[ASP.NET Web API教程]3.2 通过.NET客户端调用Web API(C#) 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的 ...

  4. 通过.NET客户端调用Web API(C#)

    3.2 Calling a Web API From a .NET Client (C#) 3.2 通过.NET客户端调用Web API(C#) 本文引自:http://www.asp.net/web ...

  5. C#后台程序与HTML页面中JS方法互调(功能类似于Ajax中的DWR)

    此方法适用于 C#中嵌入WebBrowser(浏览器) 通过浏览器中加载的页面与C#的后台代码进行交互. 一.C#程序 1.在C#窗体中添加WebBrowser(浏览器),将页面的URL添加到浏览器中 ...

  6. C#后台程序与HTML页面中JS方法互调

    此方法适用于 C#中嵌入WebBrowser(浏览器) 通过浏览器中加载的页面与C#的后台代码进行交互. 一.C#程序 1.在C#窗体中添加WebBrowser(浏览器),将页面的URL添加到浏览器中 ...

  7. Unity SLua 如何调用Unity中C#方法

    1.原理 就是通常在Lua框架中所说的,开放一个C#的web接口,或者叫做在Slua框架中注册函数. 2.作用 在Lua中调用C#中的方法,这个是在做热更新中很常用的一种方法,无论是slua,还是lu ...

  8. 安卓端调用h5界面js方法和ios端调用h5界面js方法

      备注:本人为h5开发人员,不懂安卓和ios,这是开发小伙伴对接联调的主代码. 1.iOS端调用h5界面js方法:     2.安卓端调用h5界面js方法: @Override    protect ...

  9. 使用RPC 调用NameNode中的方法

    用户在Client 端是很难对 NameNode中的信息进行直接访问的, 所以 ,在Hadoop系统中为 Client端 提供了一系列的方法调用,这些方法调用是通过RPC 方法来实现的, 根据RPC ...

随机推荐

  1. iOS 8以上的设置的跳转

    iOS8以上的系统应用可以与设置进行深层的交互,用户可以根据APP的需要进行对应的权限的设置. 现在大多数的APP依旧仅仅是弹出一个包含操作指令的警示窗口,如“进入设置>隐私>位置> ...

  2. OpenGL ES 2.0 混合

    混合技术 混合技术就是将俩个片元调和,主要用于将通过各项测试准备进入帧缓冲的片元(源片元)与原有片元按照设定的比例加权计算出最终片元的颜色值. OpenGL ES 2.0中是通过设置混合因子来指定两个 ...

  3. OpenGL ES 2.0 摄像机与投影

    1.摄像机的设置 摄像机的位置坐标 摄像机的位置 摄像机up方向 Matrix.setLookAtM( mVMatrix, //存储生成矩阵元素的float[]类型数组 0, //填充起始偏移量 cx ...

  4. socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别?

    一.举个打电话的例子: 阻塞   block   是指,你拨通某人的电话,但是此人不在,于是你拿着电话等他回来,其间不能再用电话.同步大概和阻塞差不多. 非阻塞   nonblock   是指,你拨通 ...

  5. (转)用Eclipse编译你的ROS程序

    原地址: http://blog.csdn.net/sujun3304/article/details/18572017 好了,理解了系统各个组件的含义后,还是直接进入程序真刀真枪的从实践中学习吧! ...

  6. Floyd最小环

    本文转自这里 最小环:从一个点出发,经过一条简单路径回到起点成为环.图的最小环就是所有环中长度最小的. 怎样求最小环呢? 1传统的解决方法(dijkstra):        任意一个最小环环的权值, ...

  7. 快速搭建Android 开发环境-使用ADT Bundle

    一.搭建Android开发环境 近日要学Android开发基础,就着手搭建Windows下的Android开发环境. 找了一些相关的博文参考,基本上都是要分别下载和安装JDK, Eclipse, An ...

  8. linux 克隆:device eth0 does not seem to be present,delaying initialization

    问题: CentOS6以上的版本在虚拟机中进行克隆复制或者一些列copy动作后导致网络无法启动提示:device eth0 does not seem to be present,delaying i ...

  9. 一篇详细的 Mysql Explain 详解

    一.语法 explain < table_name > 例如: explain select * from t3 where id=3952602; 二.explain输出解释 +—-+— ...

  10. Is Fibo

    fib = {} f = [1, 1] fib[1] = True while f[-1] < 1e10: # 不断的计算,然后加在尾部,最后比对“in” f.append(f[-1]+f[-2 ...