解决js的confirm转换为iOS UIAlertView的title问题

使用cordova做跨平台开发的时候,碰到了js调用confirm转换成iOS的UIAlertView的title显示成xxxx.html的问题。

我想到的第一种办法就是监听UIApplication的windows,然后手动修改当前alert的title。以前做过类似的监听系统通知,修改样式的。不过这样跟JS交互起来效率就低了好多。

另一种思路就是如果能够找到confirm转化成alert的方法不是更好?这样就可以重载该方法替换成任意的样式了。

在stackoverflow上还真找到了,哇哈哈。

@interface UIWebView (JavaScriptAlert)

- (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString
*)message initiatedByFrame:(id)frame;

- (BOOL)webView:(UIWebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString
*)message initiatedByFrame:(id)frame;

- (NSString *) webView:(UIWebView *)view runJavaScriptTextInputPanelWithPrompt:(NSString
*)prompt defaultText:(NSString *)text initiatedByFrame:(id)frame;

@end

之后我又在csdn上搜了下找到了别人的实现,最终确定是在这个

- (BOOL)webView:(UIWebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString
*)message initiatedByFrame:(id)frame {

里边修改alert的样式,研究了下,这个方法需要返回当前选中的alert的index,这就意味着必须在点击alert之前必须挂起当前线程。这就用到运行循环 runloop了。

网上找到的方法基本都过时了,我稍微修改了下:

#import "UIWebView+JavaScriptAlert.h"

@implementation UIWebView (JavaScriptAlert)

static
BOOL status = NO;

static BOOL isEnd =
NO;

- (void)webView:(UIWebView *)sender runJavaScriptAlertPanelWithMessage:(NSString
*)message initiatedByFrame:(id)frame {

UIAlertView* customAlert = [[UIAlertView
alloc] initWithTitle:nil

message:message

delegate:nil

cancelButtonTitle:@"确定"

otherButtonTitles:nil];

[customAlert
show];

}

- (NSString *) webView:(UIWebView *)view runJavaScriptTextInputPanelWithPrompt:(NSString
*)prompt defaultText:(NSString *)text initiatedByFrame:(id)frame {

return @"";

}

- (BOOL)webView:(UIWebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString
*)message initiatedByFrame:(id)frame {

UIAlertView *confirmDiag = [[UIAlertView
alloc] initWithTitle:nil

message:message

delegate:self

cancelButtonTitle:@"取消"

otherButtonTitles:@"确定",
nil];

[confirmDiag
show];

CGFloat version = [[[UIDevice
currentDevice] systemVersion]
floatValue];

if (version >= 7.) {

while (isEnd ==
NO) {

[[NSRunLoop
mainRunLoop] runUntilDate:[NSDate
dateWithTimeIntervalSinceNow:0.01f]];

}

}else

{

while (isEnd ==
NO && confirmDiag.superview !=
nil) {

[[NSRunLoop
mainRunLoop] runUntilDate:[NSDate
dateWithTimeIntervalSinceNow:0.01f]];

}

}

isEnd = NO;

return status;

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

status = buttonIndex;

isEnd = YES;

}

@end

版本兼容那块没测试,因为我只做iOS7、8,没有设备测试。因为是使用分类重载的方法,所以把这个分类直接拖到工程里,不需要添加任何代码就能实现想要的效果了。

时间: 2024-11-06 18:07:43

解决js的confirm转换为iOS UIAlertView的title问题的相关文章

[转]js中confirm实现执行操作前弹出确认框的方法

原文地址:http://www.jb51.net/article/56986.htm 本文实例讲述了js中confirm实现执行操作前弹出确认框的方法.分享给大家供大家参考.具体实现方法如下: 现在在删除或其它操作前弹出确定提示,我们有很多方法,最基本的就是利用js自带的函数confirm来操作了 最简单的用法如下: 鼠标事件使用confirm 复制代码 代码如下: <a href="#" onclick= "if(confirm( '是否确定! ')==false)r

.NET解决JS引用 全局污染等问题

在需要引用的ASPX页面上加上这句话 <!--#include file="/js/inc.html"--> 创建一个HTML页面,结构如下 <script src="/js/ArrayList.js"></script> <script src="/js/main.js"></script> 通过include引用HTML页面,HTML页面来引用JS文件来控制JS文件的引用. 定义JS

使用live delegate on来解决js对后加载的html失效的问题

今天要写一个前端的东西.每多学一点知识,就可以少写几行代码.几十行代码.几个文件量的代码--这是真的.一直对前端的研究都是停留在遇到问题百度谷歌答案的做法.今天遇到这样一个问题:已经写好的js代码,对ajax加载的html失效了. 用好几组关键字都没有找到答案,最后这组帮我找到了解答的办法: javascript not work on ajax content 很幸运,我来到了:http://stackoverflow.com/questions/10161938/jquery-functio

js中confirm揭示三个按钮“是”“否”“取消”

js中confirm提示三个按钮"是""否""取消" 重载DOM中confirm window.confirm = function(str) {   str=str.replace(/\'/g, "'&chr(39)&'").replace(/\r\n|\n|\r/g, "'&VBCrLf&'");   execScript("n = msgbox('"

解决js(ajax)提交后端的“ _xsrf&#39; argument missing from POST” 的错误

首先先简述一下CSRF: CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意思,也就是在用户会话下对某个CGI做一些GET/POST的事情——这些事情用户未必知道和愿意做,你可以把它想做HTTP会话劫持. 网站是通过cookie来识别用户的,当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问 这个网站会带上这个cookie.如果这期间浏览器被人控制着请求了这个网站的url

使用call、apply和bind解决js中烦人的this,事件绑定时的this和传参问题

1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我们来一起看一段代码: // 作为对象方法调用 var test = { a : 5, b : 6, sum : function () { return this.a + this.b; // 此处this = test } } alert(test.sum()); // 11 作为对象调用时thi

bower解决js的依赖管理备记

一个新的web项目开始,我们总是很自然地去下载需要用到的js类库文件,比如jQuery,去官网下载名为jquery-1.10.2.min.js文件,放到我们的项目里.当项目又需要bootstrap的时候,我们会重复刚才的工作,去bootstrap官网下载对应的类库.如果bootstrap所依赖的jQuery并不是1.10.2,而是2.0.3时,我们会再重新下载一个对应版本的jQuery替换原来的. 包管理是个复杂的问题,我们要知道谁依赖谁,还要明确哪个版本依赖哪个版本.这些对于开发人员来说,负担

使用COCOS2D-X JSB开发,在js页面中设置iOS键盘模式

XYSDK.h void setKeyboardType(int type); XYSDK.cpp voidXYSDK::setKeyboardType(int type) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) CCEGLView * pGlView = CCDirector::sharedDirector()->getOpenGLView(); if (pGlView) { if (0==type) { pGlView->setIMEKe

js中字符串转换为数值的两种方法的区别

在js中字符串转换为数值的方法有三种:转换函数,强制类型转换,隐式转换 1.转换函数 parseInt()   //将字符串转换为整型 parseFloat()  //将字符串转换为浮点型 转换函数在进行类型转换时是可以传入参数的,默认转换为10进制,转换成功后返回的是整数类型的数值. 例:1. parseInt('AB3', 16) //返回结果:2739,表示将字符串转换为16进制的数值 2.parseInt('13', 10) //返回结果:13,表示将字符串转换为10进制的数值 3.pa