当前位置: 首页 > 知识库问答 >
问题:

webview - 如何在React Native中获取WebView中特定标签的内容?

何睿范
2024-03-11

在react native中,如何获取webview中的某个标签的内容,例如:
在webview中,加载baidu.com,我要获取这个页面中选择器为#s_menu_mine的innerText.

这是我当前尝试的代码,gpt给我的,但是这并不能触发handleMessage,即使触发了,我也不确定方法内的代码是否正确,代码如下:

import React, { useState, useRef } from 'react';import { View, StyleSheet, Alert } from 'react-native';import { WebView } from 'react-native-webview';const MyWebViewComponent = () => {  const webViewRef = useRef(null);  const handleLoadEnd = (syntheticEvent) => {    const jsCode = `        document.querySelector('#share-desc').textContent;      `;    webViewRef.current.injectJavaScript(jsCode);    console.log(webViewRef.current)  };  const handleMessage = (event) => {    console.log(event)    const content = event.nativeEvent.data;    setWebContent(content);    Alert.alert(content);  };  return (    <View style={styles.container}>      <WebView        ref={webViewRef}        source={{ uri: 'https://www.realmaster.cn/getapp' }}        onLoadEnd={handleLoadEnd}        onMessage={handleMessage}      />    </View>  );};const styles = StyleSheet.create({  container: {    flex: 1,  },});export default MyWebViewComponent;

共有1个答案

谷善
2024-03-11

在React Native中,WebView组件提供了一种在原生应用中嵌入web页面的方式。然而,由于React Native的WebView组件并不直接支持DOM操作,因此我们不能像在浏览器环境中那样直接使用document.querySelector等方法获取特定标签的内容。不过,我们可以通过在WebView中运行的JavaScript代码,将我们想要的数据发送到原生应用。

首先,你需要在WebView加载完成后,注入一段JavaScript代码,该代码将获取特定标签的内容,并使用postMessage方法将内容发送到原生应用。然后,在React Native的WebView组件上监听onMessage事件,该事件将在WebView中的JavaScript代码发送消息时触发。

下面是一个示例代码,展示如何在React Native的WebView中获取特定标签的内容:

import React, { useState, useRef } from 'react';import { View, StyleSheet, Alert } from 'react-native';import { WebView } from 'react-native-webview';const MyWebViewComponent = () => {  const webViewRef = useRef(null);  const [webContent, setWebContent] = useState('');  const handleLoadEnd = () => {    const jsCode = `      const content = document.querySelector('#s_menu_mine').innerText;      window.ReactNativeWebView.postMessage(content);    `;    webViewRef.current.injectJavaScript(jsCode);  };  const handleMessage = (event) => {    const content = event.nativeEvent.data;    setWebContent(content);    Alert.alert(content);  };  return (    <View style={styles.container}>      <WebView        ref={webViewRef}        source={{ uri: 'https://www.baidu.com' }}        onLoadEnd={handleLoadEnd}        onMessage={handleMessage}      />    </View>  );};const styles = StyleSheet.create({  container: {    flex: 1,  },});export default MyWebViewComponent;

在这个示例中,handleLoadEnd函数在WebView加载完成后被调用,它注入了一段JavaScript代码,该代码获取了id为s_menu_mine的元素的innerText,并使用postMessage方法将其发送到原生应用。然后,handleMessage函数在收到来自WebView的消息时被调用,它将消息内容存储到webContent状态变量中,并显示一个警告框。

请注意,你需要确保你要获取的元素的id是正确的,并且该元素在页面加载完成时是存在的。此外,由于跨域安全策略的限制,你可能无法获取到一些网站的内容。

 类似资料:
  • 在隔离的框架和过程中显示外部Web内容。 进程: 渲染进程​ webview 标签可将 guest 内容(例如外部网页)嵌入到应用中. 它不像 iframe , webview 和你的应用运行的是不同的进程. 它不具有与您的网页相同的权限,为确保应用不受嵌入内容的影响,应用和嵌入内容之间的交互全部都是异步的. 使用例子 webview嵌入范例: 1 <webview id="foo" src="h

  • 警告 Electron's webview tag is based on Chromium's webview, which is undergoing dramatic architectural changes. This impacts the stability of webviews, including rendering, navigation, and event routing

  • 警告 Electron的 webview 标签基于 Chromium webview ,后者正在经历巨大的架构变化。 这将影响 webview 的稳定性,包括呈现、导航和事件路由。 我们目前建议不使用 webview 标签,并考虑其他替代方案,如 iframe ,Electron的 BrowserView 或完全避免嵌入内容的架构。 启用 默认情况下,Electron >= 5禁用 webview

  • 本文向大家介绍iOS获取cell中webview的内容尺寸,包括了iOS获取cell中webview的内容尺寸的使用技巧和注意事项,需要的朋友参考一下 最近项目中遇到在cell中获取webView的内容的尺寸的需求 实现的思路其实很简单 就是通过执行js 获取尺寸即可 为了后面用着方便我直接封装了一个HTML的cell 起名就叫  STHTMLBaseCell 下面是实现代码: 以上是.h文件的实

  • 问题内容: 我正在尝试从下面的html中检索网页中的数据 我的目标是解析“#/ word / 1 /” 但输出是 我尝试了很多方法,似乎无法在目标类中获取“ a href”的内容。 我真的不想做的是获取页面的源代码,然后进行字符串搜索,这似乎很愚蠢。 反正得到那个? 问题答案: 据我所知,您可以通过搜索子元素来获取href

  • 问题内容: 我正在尝试从下面的html中检索网页中的数据 我的目标是解析“#/ word / 1 /” 但输出是 我尝试了很多方法,似乎无法在目标类中获取“ a href”的内容。 我真的不想做的是获取页面的源代码,然后进行字符串搜索,这似乎很愚蠢。 反正得到那个? 问题答案: 据我所知,您可以通过搜索子元素来获取href