iOS JS与OC交互

本文内容导航

  • 1、`UIWebView` JS 与 OC 交互
    • 1.1 OC 调用 JS 函数
      • 1.1.1 OC 拼接 JS 字符串调用 JS 方法
      • 1.1.2 使用 JSContext 上下文环境调用 JS 函数
    • 1.2 JS 调用 OC 函数
      • 1.2.1 OC 拦截 JS 超链接操作请求
      • 1.2.2 向 JS 中注入 OC 类
      • 1.2.3 使用 JSContext 上下文,JS函数 回调 OC 代码块
    • 1.3 异常收集
  • 2、`WKWebView` OC 与 JS 交互
    • 2.1 `WKUIDelegate` 协议
    • 2.2 OC 调用 JS 函数
    • 2.3 JS 调用 OC
      • 2.3.1 拦截 JS 超链接请求
      • 2.3.2 OC 接收 JS 发来的消息
  • 3、第三方库实现 OC 与 JS 交互
    • 3.1 `WebViewJavascriptBridge` 库使用

1、UIWebView JS 与 OC 交互

UIWebView 在 iOS12 中已经被废弃,同时WKWebView在iOS8中已经出现。所以无特殊情况的话,我们一般应该也是用不到前者了!
UIWebView 相比于 WKWebView 的使用上会简单很多。

UIWebView 初始化:

    self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds];self.webView.delegate = self;[self.view addSubview:self.webView];// 加载本地 H5 文件NSURL *url = [[NSBundle mainBundle] URLForResource:@"index.html" withExtension:nil];NSURLRequest *reqeust = [NSURLRequest requestWithURL:url];[self.webView loadRequest:reqeust];

UIWebViewDelegate 协议的几个方法:

// 拦截JS页面操作请求,JS 调用OC 方法时会用到
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
// 开始加载页面
- (void)webViewDidStartLoad:(UIWebView *)webView;
// 页面加载完毕
- (void)webViewDidFinishLoad:(UIWebView *)webView;
// 页面加载失败
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;

1.1 OC 调用 JS 函数

OC 调用 JS 函数,有两种方法:

①使用stringByEvaluatingJavaScriptFromString,拼接 JS 字符串调用。
②使用 JSContext 上下文调用 JS 函数

第一种方法使用相对简单,但复杂业务可能无法实现。

1.1.1 OC 拼接 JS 字符串调用 JS 方法

JS 代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script>function showAlert_hasReturnValue(str){alert('OC 调用JS ' + str);return '返回值给OC';}function showAlert_noReturnValue(str){alert('OC 调用JS ' + str);}</script></head>
</html>

OC 中调用 JS 函数,是将 JS 拼接成字符串,作为 stringByEvaluatingJavaScriptFromString 方法的参数实现的。

/** OC 调用 JS 无返回值 */
- (IBAction)didClickLeftItem:(id)sender {[self.webView stringByEvaluatingJavaScriptFromString:@"showAlert_noReturnValue('无返回值')"];
}
/** OC 调用 JS 有返回值 */
- (IBAction)didClickRightItem:(id)sender {// OC --> JS 有返回值NSString *resString = [self.webView stringByEvaluatingJavaScriptFromString:@"showAlert_hasReturnValue('有返回值')"];NSLog(@"%@", resString);
}

1.1.2 使用 JSContext 上下文环境调用 JS 函数

UIWebView 加载完成时,初始化上下文环境:

#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];self.context = context;
}
#pragma mark - 响应
/** OC 调用 JS 无返回值 */
- (IBAction)didClickLeftItem:(id)sender {NSDictionary *dict = @{@"name": @"kangpp", @"age": @28};// 上下文调用 JS 函数[self.context[@"ocCallJS_byJSContext"] callWithArguments:@[dict]];
}

1.2 JS 调用 OC 函数

JS 调用 OC 函数有三种实现方式:

webView: shouldStartLoadWithRequest: 协议中拦截 JS 操作。
② 使用 JavaScriptCore,向 JS 中注册 OC 类,JS 函数中直接调用 OC 方法。
③ 使用 JSContext 上下文,JS 回调 OC 代码块。

1.2.1 OC 拦截 JS 超链接操作请求

HTML 文件中,需要调用 OC 方法的标签,添加超链接属性(超链接协议可自定义)。那么该标签的操作将在 UIWebViewDelegate 协议方法 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 中被监听拦截。
JS 文件如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script></script></head><body><div><a href="kpp://jsCallOC:/helloword/js">JS 调用 OC 方法(该标签的操作将被 OC 拦截)</a></div></body>
</html>

当点击 <a> 标签时,在 下方协议方法中我们将从request中获取URL信息:

#pragma mark - UIWebViewDelegate
// 加载所有请求数据,以及控制是否加载
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {// URL ==> kpp://jsCallOC:/helloword/jsNSURL *requestURL = request.URL;// URL 的一般格式为 scheme://host:port/path?NSString *scheme = requestURL.scheme;NSString *host = requestURL.host;NSNumber *port = requestURL.port;NSArray *paths = requestURL.pathComponents;// URL 全路径字符串NSString *absoluteString = requestURL.absoluteString;// 端口后的相对路径NSString *path = requestURL.path;return YES;
}

根据以上从 URL 中获取的数据,可以在此设置路由调用 OC 中指定的方法。前提当然是自己协商一致 URL 数据格式。

#pragma mark - UIWebViewDelegate
// 加载所有请求数据,以及控制是否加载
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {// request : host + 路由  : 拦截if ([request.URL.scheme isEqualToString:@"kpp"]) {// 方法名 kpp://jsCallOC:/helloword/jsNSString *routerName = request.URL.host;SEL methodSEL = NSSelectorFromString(routerName);// 测试方法为 jsCallOCNSLog(@"routerName => %@", routerName);if ([self respondsToSelector:methodSEL]) {objc_msgSend(self,methodSEL,@"");} else {NSLog(@"没有找到对应的路由方法");}return NO;}return YES;
}
/** JS 调用 OC 的响应方法 */
- (void)jsCallOC {NSLog(@"被JS调用的方法!");UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"提示" message:@"JS调用OC方法" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];[controller addAction:okAction];[self presentViewController:controller animated:YES completion:nil];
}

1.2.2 向 JS 中注入 OC 类

向 JS 注入 OC 类,需要引入 <JavaScriptCore/JavaScriptCore.h> 框架,使用 JSContext 向 JS 中注入 OC 类。
同时,被 JS 调用的 OC 方法,需要遵守 JSExport 协议。
例如,需求为 JS 调用 OC 的 getUserInfo 方法,获取应用内用户信息。
首先,要将该方法使用协议约定,并继承JSExport 协议:

@protocol TestProtocol <JSExport>
- (NSString *)getUserInfo;
@end

然后在注入JS的类中遵守TestProtocol协议并实现 getUserInfo 方法 ,demo中直接在控制器实现:

@interface ViewController ()<UIWebViewDelegate, TestProtocol>
@property (nonatomic, strong) UIWebView *webView;
@end

当 UIWebView 加载完成的时候,使用JSContext 向 WebView 中注入OC类:

#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];// 可以注入实例对象也可以注入类对象context[@"ViewController"] = self;
}

相应的在JS 中,可以直接使用 OC 类和方法调用:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script>function getUserInfo() {// 注入OC类以后,此处通过OC类名可直接调用var val = ViewController.getUserInfo();alert(val);}</script></head><body><input type="button" value="注入OC类的方式 调用OC方法,并获取返回值" onClick="getUserInfo()" /></body>
</html>

1.2.3 使用 JSContext 上下文,JS函数 回调 OC 代码块

JS 代码中blockOCCode()就是执行的OC代码块,如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script>function jsCallOC_byJSContext() {// arr 是 OC 注入的全局属性,可以在此处处理后,传递给OC// 对注入的属性,做业务处理后返回给 OCarr.splice(0, 1)blockOCCode(arr)}</script></head><body><input type="button" value="JS 调用 OC 方法(JS 回调 OCBlock 代码块)" onClick="jsCallOC_byJSContext()" /></body>
</html>

同理,在OC代码中,当页面加载完毕,就要拿到上下文的引用,注入属性及blockOCCode 代码块赋值:

#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {// 拿到 JS 上下文引用JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];self.context = context;self.context[@"ViewController"] = self;// js 中注入全局变量[context evaluateScript:@"var arr = ['张三', '李四', '王五', '赵六']"];context[@"blockOCCode"] = ^(NSArray *jsArr){// jsArr 是 JS 传递给 OC代码块的参数NSLog(@"blockOCCode->jsArr == %@", jsArr);// 通过上下文拿到 JS 全局属性//NSArray *orgArr = [JSContext currentArguments];//NSLog(@"blockOCCode->orgArr == %@", orgArr);};
}

如此即可实现 JS 回调 OC 代码块。

1.3 异常收集

JS 异常收集代码:

#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {// 异常收集self.context.exceptionHandler = ^(JSContext *context, JSValue *exception) {NSLog(@"%@",exception);};
}

2、WKWebView OC 与 JS 交互

WKWebView 初始化:

    // 配置类WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];// 适配移动设备NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];WKUserContentController *wkUController = [[WKUserContentController alloc] init];[wkUController addUserScript:wkUScript];configuration.userContentController = wkUController;// 初始化 WebViewself.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];// <WKUIDelegate, WKNavigationDelegate>self.webView.UIDelegate = self;self.webView.navigationDelegate = self;[self.view addSubview:self.webView];// 加载(本地) H5 文件NSString *urlStr = [[NSBundle mainBundle] pathForResource:@"WKWebView_Index.html" ofType:nil];NSURL *fileURL = [NSURL fileURLWithPath:urlStr];[self.webView loadFileURL:fileURL allowingReadAccessToURL:fileURL];

2.1 WKUIDelegate 协议

常用该协议替换 JS 弹窗提示,以获得更好的用户体验。

// 创建一个新的 WebView 视图时调用
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
// 视图关闭时调用
- (void)webViewDidClose:(WKWebView *)webView;
// JS 警告框调用
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
// JS 确认框调用
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
// JS prompt()函数,该方法会被执行
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler;

2.2 OC 调用 JS 函数

OC 调用 JS 是通过 evaluateJavaScript: completionHandler: 方法实现的,JS 代码比较简单:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script>function ocCallJS(str) {alert("OC ---> JS" + str);<!-- return value 通过 evaluateJavaScript: completionHandler: 回调中的值传递给OC -->return "ocCallJS return value";}</script></head>
</html>

OC 代码也不难:

/** OC 调用 JS 返回值在 completionHandler 的回调参数 result 里 */
- (IBAction)didClickRightItem:(id)sender {// OC --> JS 有返回值NSString *jsStr = @"ocCallJS('WK_ocCallJS:OC-->JS')";[self.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {// result 是 JS return 回来的值NSLog(@"%@----%@",result, error);}];
}

2.3 JS 调用 OC

WKWebView 中 JS 调用 OC 函数有两种实现方式:

① 使用 WKNavigationDelegate 协议 webView: decidePolicyForNavigationAction: decisionHandler: 方法拦截 JS 操作请求。
② 使用 WKScriptMessageHandler 协议 userContentController: didReceiveScriptMessage: 方法,接收 JS 发来的特定消息进行解析处理。

2.3.1 拦截 JS 超链接请求

HTML 文件中,需要调用 OC 方法的标签,添加超链接属性(超链接协议可自定义)。那么该标签的操作将在 WKNavigationDelegate 协议方法 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler 中被监听拦截。
JS 代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title></head><body><div><a href="kpp://WKWebView_jsCallOC:/helloword/js"> WK 中调用OC  </a><div/><br />         </body>
</html>

OC 中拦截,并使用路由调用指定 OC 方法:

#pragma mark - WKNavigationDelegate
// 拦截 JS 代码中的 请求操作
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {if ([navigationAction.request.URL.scheme isEqualToString:@"kpp"]) {NSString *routerName = navigationAction.request.URL.host;SEL methodSEL = NSSelectorFromString(routerName);NSLog(@"routerName => %@", routerName);if ([self respondsToSelector:methodSEL]) {objc_msgSend(self,methodSEL,@"");} else {NSLog(@"没有相应路由");}decisionHandler(WKNavigationActionPolicyCancel);return;}decisionHandler(WKNavigationActionPolicyAllow);
}
// 被 JS 调用的 OC 方法
- (void)WKWebView_jsCallOC {UIAlertController *controller = [UIAlertController alertControllerWithTitle:@"提示" message:@"WK 中JS调用OC方法" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];[controller addAction:okAction];[self presentViewController:controller animated:YES completion:nil];
}

2.3.2 OC 接收 JS 发来的消息

该方法使用步骤上相对繁琐,但 WKScriptMessageHandler 协议中只有一个方法userContentController: didReceiveScriptMessage:
① 引入 WKScriptMessageHandler 协议,并使用 config 初始化 WKWebView。
② 注册 ScriptMessageHandler
③ 实现协议方法。
④ 移除 ScriptMessageHandler

JS 代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>OC与JS交互</title><script>function jsSendMessage(){// js 发送消息, messgaeToOC 是在 OC 代码中注册过的名称var val =  window.webkit.messageHandlers.messgaeToOC.postMessage("js 发送给 OC 的消息");alert(val);}</script></head><body><div><input type="button" value="messgaeHandle" onClick="jsSendMessage()" /><div/><br /></body>
</html>

OC 代码实现步骤:

// ① 引入协议
@interface KYWKContorller ()<WKScriptMessageHandler>
// ② 注册消息处理名称为:messgaeToOC
- (void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];[self.webView.configuration.userContentController addScriptMessageHandler:self name:@"messgaeToOC"];
}
// ③ 实现协议方法
#pragma mark - WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{// message.name 就是我们注册的 messgaeToOC// message.body 就是JS发送过来的消息NSLog(@"%@---%@",message.name, message.body);// 根据这两个参数 写我们的业务代码... ...
}
// ④ 控制器销毁时移除 `ScriptMessageHandler`
- (void)viewWillDisappear:(BOOL)animated{[super viewWillDisappear:animated];[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"messgaeToOC"];
}

3、第三方库实现 OC 与 JS 交互

3.1 WebViewJavascriptBridge 库使用

该节介绍的第三方库是:WebViewJavascriptBridge。
该库支持 UIWebViewWKWebView。使用比较简单,上手容易。
使用步骤:

① 引入头文件
② 初始化桥接类实例
③ (JS 调用 OC)OC中 registerHandler 注册JS方法,使用block传参及回调;( OC 调用 JS)callHandler 调用 JS 方法,使用block回调JS返回结果。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>OC与JS交互</title><script><!-- 使用该库,JS 中代码中需要添加:-->function setupWebViewJavascriptBridge(callback) {if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }window.WVJBCallbacks = [callback];var WVJBIframe = document.createElement('iframe');WVJBIframe.style.display = 'none';WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';document.documentElement.appendChild(WVJBIframe);setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)}setupWebViewJavascriptBridge(function(bridge) {// JS 被调用的方法  OCCallJSFunction 定义的标识bridge.registerHandler('OCCallJSFunction', function(data, responseCallback) {alert('JS方法被调用:' + data);responseCallback('OC调用的JS方法已被执行');})})          function jsCallsOCFunc(){WebViewJavascriptBridge.callHandler('jsCallsOC', {'name': 'kpp'}, function(response) {alert(response);})}</script>
</head>
<body><div><input type="button" value="JS 调用 OC 方法" onclick="jsCallsOCFunc()" /> <br /><div/><br /><div><a href="kpp://WKWebView_jsCallOC:/helloword/js"> WK 中调用OC (不使用第三方)  </a><div/><br />
</body>
</html>

OC 代码实现:

#import "WebViewJavascriptBridge.h"
@property (strong, nonatomic) WKWebView   *webView;
@property (nonatomic, strong) WebViewJavascriptBridge *wjb;
- (void)createWjb {// 初始化桥接类实例self.wjb = [WebViewJavascriptBridge  bridgeForWebView:self.webView];// 设置 WKNavigationDelegate 代理,保留该协议使用者依然可用[self.wjb setWebViewDelegate:self];
}
/** JS 调用 OC 方法 */
- (void)jsCallOC {// JS-->OC[self.wjb  registerHandler:@"jsCallsOC" handler:^(id data, WVJBResponseCallback responseCallback) {// data 是 JS 传递给OC 的参数,responseCallback可将执行结果回调给 JSNSLog(@"%@---%@----%@",[NSThread currentThread],data,responseCallback);responseCallback(@"JS调用的OC方法已执行");}];
}
/** OC 调用 JS 方法 */
- (void)OCCallJS {[self.wjb callHandler:@"OCCallJSFunction" data:@"传递参数param" responseCallback:^(id responseData) {// data 是 OC 传递给 JS 的参数,responseData是 JS 执行完成后回调给OC 的执行结果NSLog(@"%@--%@",[NSThread currentThread],responseData);}];
}

iOS JS与OC交互相关推荐

  1. iOS: JS和Native交互的两种方法,iosjsnative交互

    iOS: JS和Native交互的两种方法,iosjsnative交互 背景: UIWebView: iOS 用来展示 web 端内容的控件. 1. 核心方法: - (NSString*)string ...

  2. OC WKWebView的JS与OC交互、Cookie管理

    完全抄录:iOS中UIWebView与WKWebView.JavaScript与OC交互.Cookie管理看我就够(中) ####WKWebView 是Apple于iOS 8.0推出的WebKit中的 ...

  3. UIWebView中JS与OC交互 WebViewJavascriptBridge的使用

    一.综述 现在很多的应用都会在多种平台上发布,所以很多程序猿们都开始使用Hybrid App的设计模式.就是在app上嵌入网页,只要写一份网页代码,就可以跑在不同的系统上.在iOS中,app多是通过W ...

  4. JS和OC交互的简单应用

    先简单地说一下思路吧 需求:在App中嵌入一个webView,已经有了网址,但是需要去掉这个网页中的一些内容 解决方案:取到webView要加载的网址,对这个网址对应的网页信息进行修改 简单描述: 遵 ...

  5. (0085)iOS开发之OC与JS交互高级用法(JavaScriptCore)

    前述:JavaScriptCore你不知道的OC与JS之间交互.OC与JS之间用model实现交互.通讯.传值!好玩! 几乎三年来一直断断续续接触OC与JS交互,每次觉得UIWebView OC与JS ...

  6. iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge

    WebViewJavascriptBridge是一个有点年代的JS与OC交互的库,使用该库的著名应用还挺多的,目前这个库有7000+star.我去翻看了它的第一版本已经是4年前了,在版本V4.1.4以 ...

  7. iOS下JS与OC互相调用(二)--WKWebView 拦截URL

    在上篇文章中讲述了使用UIWebView拦截URL的方式来处理JS与OC交互. 由于UIWebView比较耗内存,性能上不太好,而苹果在iOS 8中推出了WKWebView. 同样的用WKWebVie ...

  8. iOS下JS与OC互相调用(一)--UIWebView 拦截URL

    1.在JS 中做一次URL跳转,然后在OC中拦截跳转.(这里分为UIWebView 和 WKWebView两种,去年因为还要兼容iOS 6,所以没办法只能采用UIWebView来做.) 2.利用WKW ...

  9. iOS中JS 与OC的交互(JavaScriptCore.framework)

    iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...

最新文章

  1. 理论+实操: linux中firewalld防火墙基础讲解(转载)
  2. ios开发-UI基础-应用管理(单纯界面)
  3. timestamp类型设置默认时间
  4. NYOJ 14 会场安排问题 贪心算法 之 选择不相交区间
  5. python学习:map()
  6. android菜单点击功能怎么做的,单击android中的Menu按钮打开上下文菜单
  7. 中国大学MOOC 计算机组成原理第4章 测试(上)
  8. 数据结构与算法之基数排序
  9. 前端学习(2694):重读vue电商网站15之阻止页签tabs切换
  10. impdp oracle 只导入表结构_oracle数据库怎么导入dmp,只导入数据不导入表结构?...
  11. python之判断一个值是不是可以被调用
  12. 迅捷pdf文档转换器注册码
  13. NVMe驱动详解系列——第一部分:NVMe驱动初始化和注销
  14. 内网穿透 (Natapp)
  15. 列出5个python标准库_5个常用 Python 标准库
  16. 小学计算机教师面试试题及答案,2019上半年小学信息技术教师资格证面试试题及答案(精选)第一批...
  17. lisp ssget 浩辰_ssget 详解
  18. html元素标记不允许使用嵌套,第153天:关于HTML标签嵌套的问题详解
  19. gdb学习20:总结
  20. A,B,C,D,E五个人在某天夜里去捕鱼

热门文章

  1. OMNI.COM The Greatest program in the world
  2. 网络优化整体解决方案 企业网络优化的好帮手
  3. 微信支付和支付宝支付所用应用签名如何获取
  4. .net framework4.0 安装回滚问题
  5. 兔子与狐狸c语言,【狐狸和兔子的故事】_ 狐狸和兔子故事_亲亲宝贝网
  6. C++内存管理:内存池实现
  7. javaweb物品租赁系统源码(毕设)
  8. Revit启动后,如何把你的命令显示在Revit的Ribbon(工具栏)上?
  9. 小学生台灯哪个品牌更护眼?学习专用的护眼台灯品牌
  10. 11 万金油 String,为什么不好用了?