zoukankan      html  css  js  c++  java
  • iOS开发 WKWebView下js的alert(),confirm(),prompt()方法无法正常执行

    1、原因说明

    • 由于安全机制,WKWebView默认对JavaScript下alert(),confirm(),prompt())做了拦截,如果要想正常使用,需要实现WKWebView的三个代理方法.

    2、解决办法

    • 2.1 解决alert方法

    - (void)webView:(WKWebView *)webView 
    runJavaScriptAlertPanelWithMessage:(NSString *)message 
    initiatedByFrame:(WKFrameInfo *)frame 
    completionHandler:(void (^)(void))completionHandler {
    
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
    
        [alertController addAction:([UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    
            completionHandler();
    
        }])];
    
        [self presentViewController:alertController animated:YES completion:nil];
    
    }
    
    • 2.2 解决confirm

    - (void)webView:(WKWebView *)webView 
    runJavaScriptConfirmPanelWithMessage:(NSString *)message  
    initiatedByFrame:(WKFrameInfo *)frame 
    completionHandler:(void (^)(BOOL))completionHandler {
    
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
    
        [alertController addAction:([UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
    
            completionHandler(NO);
    
        }])];
    
        [alertController addAction:([UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    
            completionHandler(YES);
    
        }])];
    
        [self presentViewController:alertController animated:YES completion:nil];
    
    }
    
    
    • 2.3 解决prompt

    - (void)webView:(WKWebView *)webView 
    runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt 
    defaultText:(NSString *)defaultText 
    initiatedByFrame:(WKFrameInfo *)frame 
    completionHandler:(void (^)(NSString * _Nullable))completionHandler {
    
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:prompt message:@"" preferredStyle:UIAlertControllerStyleAlert];
    
        [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
    
            textField.text = defaultText;
    
        }];
    
        [alertController addAction:([UIAlertAction actionWithTitle:@"完成" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
    
            completionHandler(alertController.textFields[0].text?:@"");
    
        }])];
    
        [self presentViewController:alertController animated:YES completion:nil];
    }
    
  • 相关阅读:
    变量与常量
    .面向过程和面向对象的区别
    .JDK,JRE,JVM三者关系
    DEV C++, 利用链表实现目录内所有文件列表显示
    swith的用法和注意事项?
    Java排序(一)实现类的排序
    C++数据结构——树(基础知识篇)
    杀进程
    监控 monitor java 代码
    putty 直接连 快捷键方式
  • 原文地址:https://www.cnblogs.com/CH520/p/11968408.html
Copyright © 2011-2022 走看看