这几天遇到了个棘手问题(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. 关于(x&y)+((x^y)>>1)的探究

    今天在程序员面试宝典上看到 int f(int x int y ) { return (x&y)+((x^y)>>1) } f(729,271) 结果为500 从式子中可以看出分为 ...

  2. php性能效率优化

    [size=5][color=Red]php性能效率优化[/color][/size] 最近在公司一边自学一边写PHP程序,由于公司对程序的运行效率要求很高,而自己又是个新手,一开始就注意程序的效率很 ...

  3. HTML5 例子学习 HT 图形组件

    HTML5 例子学习 HT 图形组件 HT 是啥:Everything you need to create cutting-edge 2D and 3D visualization. 这口号是当年心 ...

  4. Android手机配置gcc,实现手机编译代码

    1.下载gcc.zip 2.把gcc.zip解压存放在/data目录下(也可以是其他目录,看个人习惯) 3.配置gcc环境变量 export GCCHOME=/data/gcc (gcc存放路径) e ...

  5. 关于android:focusable属性

    http://www.cnblogs.com/Gaojiecai/archive/2013/06/18/3142783.html Android属性 android:focusableInTouchM ...

  6. HDU 4276 The Ghost Blows Light(树形)

    题意:给出一棵n个节点的树,起点1,终点n,相连的两个节点之间有距离,每个节点有个价值,给出一个时间T.问从1到达n在给定时间T内取得的最大价值? 思路:先从1走到n,如果总的时间不够走完,直接退出, ...

  7. 伪造队形(FFT)

    题目描述Tukkun带着他的合唱队去环形音乐厅参加演出.上场前,Tukkun发现了严重的问题:音乐厅的工作人员把他们的合唱队形搞错了.具体来说,Tukkun的合唱队有N个人围成一圈,身高按照顺时针顺序 ...

  8. 快速入门:触摸输入(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)

    原文 http://technet.microsoft.com/zh-cn/subscriptions/hh465387 快速入门:触摸输入(使用 C#/VB/C++ 和 XAML 的 Windows ...

  9. Android之SharedPreferences两个工具类

    相信Android的这个最简单的存储方式大家都很熟悉了,但是有一个小小技巧,也许你没有用过,今天就跟大家分享一下,我们可以把SharedPreferences封装在一个工具类中,当我们需要写数据和读数 ...

  10. 搜索Collections元素,用DateFormatSymbols 获得月份

    import java.util.Collections; import java.util.List; import java.text.DateFormatSymbols; import java ...