您当前的位置:首页 > 互联网教程

如何实现 javascript “同步”调用 app 代码

发布时间:2025-05-20 12:20:15    发布人:远客网络

如何实现 javascript “同步”调用 app 代码

一、如何实现 javascript “同步”调用 app 代码

1、在 App混合开发中,app层向 js层提供接口有两种方式,一种是同步接口,一种一异步接口(不清楚什么是同步的请看这里的讨论)。为了保证 web流畅,大部分时候,我们应该使用异步接口,但是某些情况下,我们可能更需要同步接口。同步接口的好处在于,首先 js可以通过返回值得到执行结果;其次,在混合式开发中,app层导出的某些 api按照语义就应该是同步的,否则会很奇怪——一个可能在 for循环中使用的,执行非常快的接口,比如读写某个配置项,设计成异步会很奇怪。

2、那么如何向 js层导出同步接口呢?

3、我们知道,在 Android框架中,通过 WebView.addJavascriptInterface()这个函数,可以将 java接口导出到 js层,并且这样导出的接口是同步接口。但是在 iOS的 Cocoa框架中,想导出同步接口却不容易,究其原因,是因为 UIWebView和 WKWebView没有 addJavascriptInterface这样的功能。同时,Android这个功能爆出过安全漏洞,那么,我们有没有别的方式实现同步调用呢?我们以 iOS UIWebView为例提供一种实现,WKWebView和 Android也可以参考。

4、为了找到问题的关键,我们看一下 iOS中实现 js调用 app的通行方法:

5、首先,自定义 UIWebViewDelegate,在函数 shouldStartLoadWithRequest:navigationType:中拦截请求。

6、-(BOOL) webView:(UIWebView* _Nonnull)webView

7、shouldStartLoadWithRequest:(NSURLRequest* _Nonnull)request

8、navigationType:(UIWebViewNavigationType)navigationType{

9、if([request.HTTPMethod compare:@"GET" options:NSCaseInsensitiveSearch]!= NSOrderedSame){

10、if([url.scheme isEqualToString:@'YourCustomProtocol']){

11、return [self onMyRequest:request];

12、这种做法实质上就是将函数调用命令转化为 url,通过请求的方式通知 app层,其中 onMyRequest:是自定义的 request响应函数。为了发送请求,js层要建立一个隐藏的 iframe元素,每次发送请求时修改 iframe元素的 src属性,app即可拦截到相应请求。

13、*@method js_sendMessageToNativeAsync

14、*@memberof JSToNativeIOSPolyfill

15、*@param str{String}消息字符串,由 HybridMessage转换而来

16、JSToNativeIOSPolyfill.prototype.js_sendMessageToNativeAsync= function(str){

17、this.ifr_.src='YourCustomProtocol://__message_send__?msg='+ encodeURIComponent(str);}

18、当 app执行完 js调用的功能,执行结果无法直接返回,为了返回结果,普遍采用回调函数方式——js层记录一个 callback,app通过 UIWebView的 stringByEvaluatingJavaScriptFromString函数调用这个 callback(类似 jsonp的机制)。

19、注意,这样封装的接口,天然是异步接口。因为 js_sendMessageToNativeAsync这个函数会立即返回,不会等到执行结果发回来。

20、所以,我们要想办法把 js代码“阻塞”住。

21、请回忆一下,js中是用什么方法能把 UI线程代码“阻塞”住,同时又不跑满 CPU?

22、var url=';;

23、var method='GET';<br>var req= new XMLHttpRequest();<br>

24、req.open(method, url, async);<br>req.send(null);

25、“同步”ajax(其实没这个词,ajax内涵异步的意思)可以!在 baidu的响应没返回之前,这段代码会一直阻塞。一般来说同步请求是不允许使用的,有导致 UI卡顿的风险。但是在这里因为我们并不会真的去远端请求内容,所以不妨一用。

26、至此实现方式已经比较清楚了,梳理一下思路:

27、使用同步 XMLHttpRequest配合特殊构造的 URL通知 app层。

28、app层拦截请求执行功能,将结果作为 Response返回。

29、XMLHttpRequest.send()返回,通过 status和 responseText得到结果。

30、那么,如何拦截请求呢?大家知道,UIWebViewDelegate是不会拦截 XMLHttpRequest请求的,但是 iOS至少给了我们两个位置拦截这类请求——NSURLCache和 NSURLProtocol。

31、一、NSURLCache是 iOS中用来实现自定义缓存的类,当你创建了自定义的 NSURLCache子类对象,并将其设置为全局缓存管理器,所有的请求都会先到这里检查有无缓存(如果你没禁掉缓存的话)。我们可以借助这个性质拦截到接口调用请求,执行并返回数据。

32、-(NSCachedURLResponse*) cachedResponseForRequest:(NSURLRequest*)request{

33、if([request.HTTPMethod compare:@"GET" options:NSCaseInsensitiveSearch]!= NSOrderedSame){

34、return [super cachedResponseForRequest:request];

35、return [super cachedResponseForRequest:request];

36、LOGF(@"url=%@, path=%@, query=%@", url, path, query);

37、if([path isEqualToString:@"__env_get__"]){

38、return [self getEnvValueByURL:url];//*

39、} else if([path isEqualToString:@"__env_set__"]){

40、return [self setEnvValueByURL:url];

41、return [super cachedResponseForRequest:request];

42、注意注释有*号的一行,即是执行 app接口,返回结果。这里的结果是一个 NSCachedResponse对象,就不赘述了。

二、javascript和数据库的同步

1、JS不可能与数据库同步的,同步的话,你可以刷新一下页面就可以了!JS更新数据库的原理就是AJAX的。其中对于XmlHttpRequest的OPEN方法却有一个参数值得注意:

2、xmlhttprequest("GET",URLs,true);这里面用到了三个参数,分别是:method也就是提交方法,可以是GET,POST或HEAD,当然URLs是要提交的地址,关键是第三个,可以看出它是一个布尔值的,它在有些书说讲就是所谓的“同步”与异步的问题了。如果是true则会继续执行以后的语句,也就是异步执行,如果是false则等一个触发动作,这个动作是来源于服务器的sevlet的,也就是如果没有服务器返回信息,则不会向下执行。这里在很多的书上被称为同步。

3、但事实上虽然可以这样理解,但未必是其真正的意思。但这个参数很明显是符合了你的要求。说分是同步,其实就是它等待了服务的一个动作,也就是所谓的onreadystatechange这样的一个事件而已,但服务器会返回你真正要的数据吗?未必吧?所以我们一般是使用处理含数进行处理,如果返回正确信息时才做相应的处理。所以这里着重于readystate的值,要判断其是否为4,如果为4则,再使用该对象进行再次数据交互就不会出现了。

4、同样,我们可以自定义一个与服务器交互的控件,可用JAVASCRIPT完成,可以使用single模式嘛!这时只要对xmlHttpRequest的合理利用不会出现问题的!一个简单的办法就是当readystate=4时,我们可以给一个预先设置的全局变量进行赋值为true,在循环前可以判断这个值的,当然,一开始使用xmlHttpRequest时就将这个值赋为false。这种情况与你所说的还有一点区别就是这个值可以决定下级循环是否执行,而非等待执行。可以利用JS做一个等待的程序,但这样不是一个好办法,它对客哀悼机的系统开销大了点!

三、javascript在ios无法运行(js代码运行不了)

为什么JS在苹果浏览器里不支持,请高手帮忙指点下!谢谢!

1、很正常,不同浏览器都有不同的兼容性,有的浏览器脚本解释不好。像很多专门为IE设计的网页,其他浏览器都会显示不正常。

1、很正常,不同浏览器都有不同的兼容性,有的浏览器脚本解释不好。像很多专门为IE设计的网页,其他浏览器都会显示不正常。

2、这是因为网站是有javascript代码的,用以制作网页特效等功能,给用户带来优质的体验。现在网站普遍使用javascript来改进设计、验证表单、检测浏览器、创建cookies,以及更多的应用。

3、一眼能看到的问题就是这行:focpic.style.visibility=hiddenfocpic你在哪定义的?没定义吧,这种不定义直接用的只在ie下有效。

4、浏览器不能直接运行js文件的。js文件必须由htm文件引用,才会由浏览器执行。

苹果现在系统不然直接访问js了,因为不安全的因素,苹果排斥了。

Safari浏览器为了保护用户隐私和安全,不允许以此方式使用JavaScript,以免脚本可能会读取用户的敏感信息。另外,Safari浏览器也严格限制第三方脚本在其中运行,以确保用户体验不受影响。

如果JavaScript不可用,通常意味着您的浏览器或网络连接无法访问JavaScript引擎或库。

没有授予脚本运行权限。首先,在苹果手机设置中找到快捷指令,点击进入。其次,在快捷指令中点击进入高级。最后,在高级中找到允许浏览器运行脚本,点击打开后面按钮即可。

有些网页正常显示是需要js支持的,比如动态获取内容,以及一些小游戏等等。但木马病毒也经常通过js实现传播,浏览器只是给你警告。

请多刷新几次或者把浏览器关掉再打开。打开IE属性把临时文件历史记录cookies都删掉。javascript:viod(0)表示执行javascript方法,该方法返回void(0)即不会返回任何结果。也就是说不会执行任何javascript功能。

可以尝试重启。该命令语句意思是未响应。javascript:void(0)中的void是JavaScript中的一个操作符,这个操作符指定要计算一个表达式但是不返回值。void(0)表示在JavaScript上没有任何效果。

js日期格式化时区不一样导致nan解决方案如下:解决JS格式化时间格式错误在苹果手机IOS系统上为NaN格式化时间是我们比较常规的操作,从后台拿到的时间格式可能并不符合原型或者UI的显示要求。

就像其基于的MacOSX操作系统一样,它也是以Darwin为基础的。原本这个系统名为iPhoneOS,直到2010年6月7日WWDC大会上宣布改名为iOS。iOS的系统架构分为四个层次:核心操作系统层,核心服务层,媒体层,可轻触层。

这个问题时因为你是用的浏览器版本低和兼容性能不好才造成的这个情况。不用担心,你需要更新一个版本最高的浏览器,或者下载一个新的手机QQ浏览器也是可以的哦。

适用于iOS的Safari浏览器中的JavaScript启用(iphone,ipod,ipad)命中Settings图标。向下滚动,直到您看到Safari点击它调出选项页。JavaScript选项,打开你做了iOS上的Safari中启用JavaScript。

safari的开发者工具应该也有移动端视图模式?我只用过chrome,chrome是有移动端模式调试的。

苹果手机如何运行js脚本运行

你必须先启用设置,才能从快捷指令运行JavaScript。请参阅iPhone或iPad上“快捷指令”中的高级隐私和安全性设置。

你必须先启用设置,才能从快捷指令运行JavaScript。请参阅iPhone或iPad上“快捷指令”中的高级隐私和安全性设置。

alook浏览器。.js是一种脚本语言,通常在浏览器中执行,iPhone手机alook浏览器支持.js,脚本语言,是一种动态类型、弱类型、基于原型的语言,最早是在HTML网页上使用,用来给HTML网页增加动态功能。

找一个iphone手机的PC同步操作工具,在QTP上选择同步工具的应用程序文件(.exe)开始录制后,每一次在PC上对iphone手机的操作都会记录成脚本代码,建议你去看看QTP的基本使用指南,很好上手的。

安装Appsync,APPsync是iPad、iPad、iPodtouch越狱后最常安装的补丁,安装后可以绕过系统验证,随意安装、运行破解的ipa软件。具体安装方法:打开Cydia,在下面的菜单栏选择“软件源”。

打开手机自带的浏览器,点击下方的三点图标,点击设置。点击安全与隐私,将【安全浏览】右侧的开关关闭即可解除网站访问限制。网站就是一种人机沟通交流的工具。它由3大部分组成,即网站的三要素,域名、空间、源文件。

如果灰色图标还在则重启一下iPad或iPhone。方法二:在iPhone或iPad正的“设置”,进入STORE设置界面,注销当前账号,然后关掉iPad重新开机就可以了。

网络在浏览的时候出现拒绝请求停止加班,这个时候就先不要强制打开先关闭,关闭之后再一次把链接复制到其他的浏览器。

有时候则是路由器或网卡的问题,无法与ISP的DNS服务连接,这种情况的话,可把路由器关一会再开,或者重新设置路由器。还有一种可能,是本地DNS缓存出现了问题。