首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS WKWebView没有显示javascript WKWebView()对话框

iOS WKWebView没有显示javascript WKWebView()对话框
EN

Stack Overflow用户
提问于 2014-11-12 23:55:31
回答 7查看 62K关注 0票数 78

让WKWebView 8中的iOS 8显示从Javascript调用的警报对话框有一些问题。在创建了一个标准的WKWebView并加载了一个HTML之后,我在页面上有了一个按钮,它用一些文本创建一个简单的警报。这在UIWebView和Google /Safari中都适用,但在WKWebView中似乎不起作用。任何帮助都是非常感谢的。

我的设置如下:

代码语言:javascript
复制
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.allowsInlineMediaPlayback = YES;
config.mediaPlaybackRequiresUserAction = false;
_wkViewWeb = [[WKWebView alloc] initWithFrame:_viewWeb.frame config];
_wkViewWeb.scrollView.scrollEnabled = NO;
NSString *fullURL = @"file://.../TestSlide.html";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];

[_wkViewWeb loadRequest:request];

html具有以下功能:

代码语言:javascript
复制
<SCRIPT Language="JavaScript">
function alertTest() {
    alert("Testing Alerts");
}
</SCRIPT>

还有一个按钮:

代码语言:javascript
复制
<b>Test Alerts: <input type="button" value="Alert Popup" onclick="alertTest()"><br></b> <br>

此设置在UIWebView和常规浏览器中工作,但在WKWebView中不工作。我是不是在配置中遗漏了什么?是否应该使用WK委托之一来控制警报/确认对话框行为?谢谢。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-11-21 17:39:10

要解决这个问题,您需要为您的web视图提供一个WKUIDelegate。代表有责任决定是否应以何种方式显示警报。您需要为警报、确认和文本输入(提示符)实现此功能。

下面是示例代码,没有对页面url或安全特性进行任何验证:

代码语言:javascript
复制
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message
                                                                             message:nil
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:[UIAlertAction actionWithTitle:@"OK"
                                                        style:UIAlertActionStyleCancel
                                                      handler:^(UIAlertAction *action) {
                                                          completionHandler();
                                                      }]];
    [self presentViewController:alertController animated:YES completion:^{}];
}

更多关于正式文件的文章

票数 91
EN

Stack Overflow用户

发布于 2016-10-29 06:00:12

Swift 3,实现了所有3个可选函数:

代码语言:javascript
复制
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo,
             completionHandler: @escaping () -> Void) {

    let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)
    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in
        completionHandler()
    }))

    present(alertController, animated: true, completion: nil)
}


func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo,
             completionHandler: @escaping (Bool) -> Void) {

    let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)

    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in
        completionHandler(true)
    }))

    alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in
        completionHandler(false)
    }))

    present(alertController, animated: true, completion: nil)
}


func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo,
             completionHandler: @escaping (String?) -> Void) {

    let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .actionSheet)

    alertController.addTextField { (textField) in
        textField.text = defaultText
    }

    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in
        if let text = alertController.textFields?.first?.text {
            completionHandler(text)
        } else {
            completionHandler(defaultText)
        }
    }))

    alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in
        completionHandler(nil)
    }))

    present(alertController, animated: true, completion: nil)
}
票数 61
EN

Stack Overflow用户

发布于 2015-11-04 20:24:53

为了稍微扩展一下,WKWebView要求您显示警报、提示和确认自己。通过成为WKUIDelegate来做到这一点

代码语言:javascript
复制
#import <WebKit/WebKit.h>
@interface MyController : UIViewController<WKUIDelegate>

然后分配委托:

代码语言:javascript
复制
web.UIDelegate = self;

然后,您需要实际实现警报、提示和确认。我创建WKWebViewPanelManager.h/m是一个简单的实现,下面是我所做的工作:

代码语言:javascript
复制
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
    [WKWebViewPanelManager presentAlertOnController:self.view.window.rootViewController title:@"Alert" message:message handler:completionHandler];
}

- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler {
    [WKWebViewPanelManager presentConfirmOnController:self.view.window.rootViewController title:@"Confirm" message:message handler:completionHandler];
}

- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler {
    [WKWebViewPanelManager presentPromptOnController:self.view.window.rootViewController title:@"Prompt" message:prompt defaultText:defaultText handler:completionHandler];
}

当然,应该由您筛选出错误的警报/确认/提示请求。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26898941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档