JavaScript与OC交互

JavaScript是一门脚本语言,简称JS


完整的网页组成:

HTML:内容(文字、图片)
CSS:美化、样式
JS:动态效果、事件处理、跟用户进行交互


JS的常见作用有

给HTML网页添加动态功能,比如响应用户的各种操作
操纵HTML元素,比如添加、删除、修改网页元素


常见的JavaScript函数

alert(10); //弹框
document.getElementById(‘test’); // 根据ID获得某个DOM元素


如何在OC中调用JavaScript代码

使用UIWebView的stringByEvaluatingJavaScriptFromString方法即可


JS调用OC

通过使用UIWebView的代理方法实现
JS和OC交互的第三方框架:WebViewJavaScriptBridge

    /**拦截请求
     * 每当webView即将发送一个请求之前,都会调用这个方法
     * 返回YES:允许加载这个请求
     * 返回NO:禁止加载这个请求
     */ 
      - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        if ([request.URL.absoluteString containsString:@"xiaoshuo"])         
        return NO;
        return YES;
    }
JS调用OC原理:

1、调用方法:通过拦截请求,然后截取到请求地址中的字符串,将字符串变成相应的方法,就能调用。(perfomeSelector:)
2、传参数:通过自定义特定的字符,对对应的请求地址进行切割,然后将对应的字符串当参数传递(方法的参数最好都设计成字符串,想要转换类型,在方法中转)(perfomeSelector:withObject:)
3、三个参数或以上:
使用NSInvocation:一个NSInvocation对象包装一次方法调用(方法调用者,方法名,方法参数,方法返回值)
给NSObjcect添加一个分类来实现perfomeSelector传递多个参数:
#import "NSObject+Extension.h"
@implementation NSObject (Extension)
- (id)performSelector:(SEL)selector withObjects:(NSArray *)objects
{
// 方法签名(方法的描述)
NSMethodSignature *signature = [[self class]
instanceMethodSignatureForSelector:selector];
if (signature == nil) {
//@throw [NSException exceptionWithName:@"错误" reason:@"方法找不到" userInfo:nil];
[NSException raise:@"错误" format:@"%@方法找不到", NSStringFromSelector(selector)];
}

        // NSInvocation : 利用一个NSInvocation对象包装一次方法调用(方法调用者、方法名、方法参数、方法返回值)
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
        invocation.target = self;
        invocation.selector = selector;
    // 设置参数
    NSInteger paramsCount = signature.numberOfArguments - 2; // 除self、_cmd以外的参数个数
    paramsCount = MIN(paramsCount, objects.count);
    for (NSInteger i = 0; i < paramsCount; i++) {
        id object = objects[i];
        if ([object isKindOfClass:[NSNull class]]) continue;
        [invocation setArgument:&object atIndex:i + 2];
    }
    // 调用方法
    [invocation invoke];
    // 获取返回值
    id returnValue = nil;
    if (signature.methodReturnLength) { // 有返回值类型,才去获得返回值
        [invocation getReturnValue:&returnValue];
    }
    return returnValue;
    }
    @end

强制去除Xcode编译警告⚠️信息
  //#pragma clang diagnostic push  
  #pragma clang diagnostic ignored "警告信息类型"
  //#pragma clang diagnostic pop

你可能感兴趣的:(JavaScript与OC交互)