首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用UIWebView时,有没有办法从Objective-C访问DOM?

在iOS项目中,从Objective-C访问DOM是可能的,但是并不是很直接。你可以通过编写一些自定义的逻辑来实现从Objective-C访问DOM。其中最常见的方法是在JavaScript中嵌入一个<webview>元素,然后调用一些HTML/CSS的api来实现DOM内容的交互。

下面是一些可能有用的-webViewDidFinish:loadURL:forFrames:代理方法。

代码语言:objective-c
复制
- (void)webViewDidFinish:(UIWebView *)webView loadURL:(NSURL *)url forFrames:(WebFrameCollection *)frames {
    int i;
    for (i = 0; i< frames.count; i++) {
        NSArray *arr = frames.atIndexedSubscript(i).allFrames;
        for (int j = 0; j < arr.count; j++) {
            WKFrameInfo *frameInfo = arr.objectAtIndex(j);
            NSString *selector = frameInfo.request.dataInjectionPolicy == InjectionPolicy::ShouldProceedWithAllData ? @"click" : @"mousedown";
            [webView evaluateJavaScript:@selector name:selector forInjectedFrames:frames.allFrames];
        }
    }
    [webView.mainFrame evaluateJavaScript:@"document.readyState=='complete'" completionHandler:^(id response, NSError *error) {
        if (error) {
            NSLog(@"Error loading DOM: %@\n", [error description]);
        } else {
            NSDictionary *dict = response;
            // Do something with the DOM
        }
    }];
}

当然,这只是其中的一种方法,你可以根据需要自由调整,比如使用querySelector来获取DOM中的元素或调用JavaScript函数来读取或更新DOM内容。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【IOS】IOS开发问题解决方法索引(三)

DOM WebKit 里头,所有的 DOM 对象都继承自 DOMObject,DOMObject 又继承自 WebScriptObject,所以我们在取得了某个 DOM 对象之后,也可以 Objective-C...JS 传 Array 到 Objective-C ,还需要特别做些处理才能变成 NSArray, Obj C 传一个 NSArray 到 JS ,会自动变成 JS Array。...在 IOS 上我们没办法将某个 Objective-C 对象变成 JS 对象,所以,在网页中触发了某些事件,想要通知 Objective-C 这一端,往往会选择使用像「zonble://」这类 Customized...ChromeOS 完全以 WebKit 製作使用者介面,不过我们没办法在 ChomeOS 上写我们在这边所讨论的桌面或行动应用程序,所以不在我们讨论之列。...不过,在调用 Java 对象,只能够传递简单的文字、数字,複杂的 JS 对象就没办法了。

88020

oc 与 js 互相调用

很久之前用的互相调用的方法,今天要分享下,故记录下 Objective-C,通常写作ObjC或OC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。...UIWebView用于在App中嵌入网页内容,通常情况下是html格式的网页,也支持pdf, word等文档。 控件优点 可跨平台    开发一次可以部署iOS、Android等平台。...排版布局能力强    强大的HTML+CSS让人膜拜 控件缺点 性能    Native先生与HTML5先生争论最喜欢说的一句话就是:“你性能不行”。...数据通讯复杂    UIWebView与App之间进行数据通讯只能通过javascript或者UIWebViewDelegate来进行,客户端想传参数给UIWebView修改网页或者网页中获取数据都比较复杂...使用场景 排版复杂的内容 需后台灵活控制的界面 原网页 1.加载网页 UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds

1.2K10

iOS下JS与OC互相调用(四)--JavaScriptCore

它是iOS7开始加入的,用 Objective-C 把 WebKit 的 JavaScript 引擎封装了一下,提供了简单快捷的方式与JavaScript交互。...JSValue包含了每一个JavaScript类型的值,通过JSValue可以将Objective-C中的类型转换为JavaScript中的类型,也可以将JavaScript中的类型转换为Objective-C...把JSValue 保存进Objective-C 堆对象中是不正确的,这很容易引发循环引用,而导致JSContext不能释放。...3.避免循环引用,因为block 会持有外部变量,而JSContext也会强引用它所有的变量,因此在block中调用self,要用__weak 转一下。...JavaScriptCore,JS调用Native方法,参数的传递更方便,不用担心特殊符号的转换问题。

2.8K10

手把手教你Core Data迁移到Realm

通信 Js 使用了两种方式来与 Objective-C 通信,一种是使用 XMLHttpRequest 发起请求的方式,另一种则是通过设置透明的 iframe 的 src 属性。...通过在 Js 端创建一个透明的 iframe,设置这个 ifame 的 src 为自定义的协议,而 ifame 的 src 更改时,UIWebView 会先回调其 delegate 的 webView:...            execIframe.src = "gap://ready";         }     }     ... } iOS这边对应的要在WebView里面写响应的方法 // UIWebView...加载 URL 前回调的方法,返回 YES,则开始加载此 URL,返回 NO,则忽略此 URL - (BOOL)webView:(UIWebView*)theWebView...端,Objective-C 返回结果带上 callbackId,JS 端就可以根据 callbackId 找到回调方法。

1.3K70

Hybrid App 应用 开发中 9 个必备知识点复习(WebView 调试 等)

, UIWebView 中限制了; WKWebView 目前缺少关于页码相关的 API; WKWebView 提供加载网页进度的属性; WKWebView 使用 Safari 相同的 JavaScript...全局 WebView 在客户端刚启动,就初始化一个全局的 WebView 待用,并隐藏,当用户访问了 WebView ,直接使用这个 WebView 加载对应网页,并展示。...当用户访问页面,不需要初始化 WebView 的时间。 当然这也带来了一些问题,包括: 额外的内存消耗。 页面间跳转需要清空上一个页面的痕迹,更容易内存泄露。 2....:inspect 访问已启用调试的 WebView 列表,需要访问外国网站。...》 九、调试企业微信、微信和钉钉版,可以使用哪些工具?

3.1K00

iOS引入JavaScriptCore引擎框架(二)

为何放弃第一种方案 UIWebView的JSContext获取     上篇中,我们通过简单的kvc获取UIWebVIew的JSContext,但是实际上,apple并未给开发者提供访问UIWebView...的方法,虽然通过KVC可达到目标,但是当APP采用该种hack方法,有很大几率不能通过APP Store的审核,这对于一个基于上线的商业APP而言是难以忍受的,所以我们必须寻找另一种方法来获取UIWebView...,若要侦听渲染过程中的一系列事件,则必须使用WebFrameLoadDelegate对象:         1、加载过程: 在一个访问一个网页的的整个过程,包括开始加载,加载标题,加载结束等。...Nick的发现     在iOS中,尽管没有暴露WebFrameLoadDelegate,但是在具体实现上仍会判断WebKit的implement有没有实现这个协议的某些方法,如果实现则仍会执行,而且在...js引擎的方式)来完成oc和js的通信将更为流行,尽管目前apple提供的针对jsc的开发接口文档几乎没有,但是我们通过webkit的源码做一些hack的方式也不是不可以,毕竟只要UIWebView仍然使用

1.5K40

Hybrid App 应用开发中 9 个必备知识点复习

但是目前 IOS10 以下的系统以及很少了, 小结: WKWebView 相较于 UIWebView 在整体上有较大的提升,满足 iOS 上面使用同一套控件的功能,同时对整个内存的开销以及滚动刷新率和...全局 WebView 在客户端刚启动,就初始化一个全局的 WebView 待用,并隐藏,当用户访问了 WebView ,直接使用这个 WebView 加载对应网页,并展示。...当用户访问页面,不需要初始化 WebView 的时间。 当然这也带来了一些问题,包括: 额外的内存消耗。 页面间跳转需要清空上一个页面的痕迹,更容易内存泄露。 2....访问已启用调试的 WebView 列表,需要访问外国网站。...》] (https://www.cnblogs.com/miantest/p/7289694.html) 八、调试企业微信、微信和钉钉版,可以使用哪些工具?

2.3K30

Hybrid App 应用开发中 9 个必备知识点复习

UIWebView 中限制了; WKWebView 目前缺少关于页码相关的 API; WKWebView 提供加载网页进度的属性; WKWebView 使用 Safari 相同的 JavaScript...全局 WebView 在客户端刚启动,就初始化一个全局的 WebView 待用,并隐藏,当用户访问了 WebView ,直接使用这个 WebView 加载对应网页,并展示。...当用户访问页面,不需要初始化 WebView 的时间。 当然这也带来了一些问题,包括: 额外的内存消耗。 页面间跳转需要清空上一个页面的痕迹,更容易内存泄露。 2....inspect 访问已启用调试的 WebView 列表,需要访问外国网站。...》] (https://www.cnblogs.com/miantest/p/7289694.html) 八、调试企业微信、微信和钉钉版,可以使用哪些工具?

2.6K20

【Hybrid】288- Hybrid App 应用开发中 9 个必备知识点复习

但是目前 IOS10 以下的系统以及很少了, 小结: WKWebView 相较于 UIWebView 在整体上有较大的提升,满足 iOS 上面使用同一套控件的功能,同时对整个内存的开销以及滚动刷新率和...全局 WebView 在客户端刚启动,就初始化一个全局的 WebView 待用,并隐藏,当用户访问了 WebView ,直接使用这个 WebView 加载对应网页,并展示。...当用户访问页面,不需要初始化 WebView 的时间。 当然这也带来了一些问题,包括: 额外的内存消耗。 页面间跳转需要清空上一个页面的痕迹,更容易内存泄露。 2....访问已启用调试的 WebView 列表,需要访问外国网站。...》] (https://www.cnblogs.com/miantest/p/7289694.html) 八、调试企业微信、微信和钉钉版,可以使用哪些工具?

2.3K20

技术 | Hybrid载体的变化(一)

iOS的角度上来说载体UIWebView变成了WKWebView,Android有着他们自研的X5当然原生的内核,如果你用着Android7.0也不见得会卡,这才是小程序能出来的根本原因,没有载体,...,一句话,你用它原来UIWebView出现的各种问题都被解决了。...icepyApp"); self.wkWebView = WKWebView(frame: self.view.frame, configuration: config) 最终当你需要向Native发送消息就需要使用这个属性并调用其...就没有这么方便的办法了。...,选择一个你认为比较合理的渲染时间,当Web报时大于它,肯定渲染就不符合预期,这个时候,你还需要从另外的角度去分析问题了,我的建议是使用performance再加上DOM Ready ,全局Error

85130

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

(这里分为UIWebView 和 WKWebView两种,去年因为还要兼容iOS 6,所以没办法只能采用UIWebView来做。) 2.利用WKWebView 的MessageHandler。...---- 今天就详细的介绍一下使用UIWebView拦截URL 的方式来实现JS与OC 的交互。 为什么不使用第三方库或者RAC呢?...因为就相互调用的接口使用的非常少啊,就那么三两个,完全没必要使用牛刀啊。 ? UIWebView 拦截URL 我之前就使用的是UIWebView + 拦截URL 的方式实现的JS与OC 交互。...loadURL的实现来自关于UIWebView和PhoneGap的总结一文。 2.为什么loadURL 中的链接,使用统一的scheme?...答:便于在OC 中做拦截处理,减少在JS中调用一些OC 没有实现的方法,webView 做跳转。

3.6K40

IOS开发系列——UIWebView专题【整理,部分原创】

UIWebView专题 1初始化 1.1API接口使用 1.1.1loadhtmlstring iOS: UIWebview loadhtmlstring & Localcss/js/image....js files“compile sources” move to "Copy bundle resources",见下图 1.1.2UIWebView加载本地html文件 UIWebView...部分内容参考于stackoverflow 2.1.4UIWebView载入带有锚点(anchor)的URL存在的问题及解决办法 UIWebView载入带有锚点(anchor)的URL存在的问题及解决办法...http://blog.csdn.net/fengbingyang/article/details/7484453 方案一: 最近在使用ios中的UIWebView显示本地网页,遇到如下问题:...经过一番尝试,摸索出一种解决办法,具体如下: 在javascript代码的结尾部分添加一句kk="###"; 通过这样的尝试,成功让UIWebView不再跳转到初始加载位置。

89740

浅谈Hybrid

在赋予 H5 原生 API 能力的基础上,进一步通过 JSBridge 将 JS 解析成的虚拟节点数(Virtual DOM)传递到 Native 并使用原生渲染。...Dom 主要是用于负责 dom 的解析、映射、添加等等的操作,最后通知 UI 线程更新。而 Render 负责在 UI 线程中对 dom 实现渲染。...一般使用的开发语言为 Java、C++、Objective-C。。...分别来看一下 Native 开发的优缺点: 优点 用户体验近乎完美 性能稳定 访问本地资源(通讯录、相册) 操作流畅 设计出色的动效、转场 系统级的贴心通知或提醒 用户留存率高 缺点 门槛高,原生开发人才稀缺...上面这三种方式都可以被称为是JS上下文注入,他们都有一个共同的特点就是,不通过任何拦截的办法,而是直接将一个 native 对象(or 函数)注入到 JS 里面,可以由 Web 的 JS 代码直接调用,

6.8K30

ReactJS到React-Native,架构原理概述

这些组件因平台而不同,因此在使用React Native ,如何组织你的组件变得尤为重要。...在使用React Native ,如果你想复用代码,那么这些组件的抽象分离就至关重要。当然,如果一个组件渲染 元素,那它显然不能在Android 平台复用了。...JSX模板学习使用有一定的成本Vue.JS 组件化,数据绑定 Virtual DOM 模板就是普通的html,数据绑定使用mustache风格,样式直接使用css异步提供了Promise的支持只支持callback...而如果在使用 Chrome 浏览器进行调试,那么所有的 JavaScript 代码都将运行在 Chrome 的 V8 引擎中,与原生代码通过 WebSocket 进行通信。...JS调用OC代码在调用 Objective-C 代码,JavaScript 会解析出方法的 ModuleId、MethodId 和 Arguments 并放入到 MessageQueue 中,等待 Objective-C

5.3K10

ReactJS到React-Native,架构原理概述

这些组件因平台而不同,因此在使用React Native ,如何组织你的组件变得尤为重要。...在使用React Native ,如果你想复用代码,那么这些组件的抽象分离就至关重要。当然,如果一个组件渲染 元素,那它显然不能在Android 平台复用了。...JSX模板学习使用有一定的成本Vue.JS 组件化,数据绑定 Virtual DOM 模板就是普通的html,数据绑定使用mustache风格,样式直接使用css异步提供了Promise的支持只支持callback...而如果在使用 Chrome 浏览器进行调试,那么所有的 JavaScript 代码都将运行在 Chrome 的 V8 引擎中,与原生代码通过 WebSocket 进行通信。...JS调用OC代码在调用 Objective-C 代码,JavaScript 会解析出方法的 ModuleId、MethodId 和 Arguments 并放入到 MessageQueue 中,等待 Objective-C

5.6K10
领券