react-native - 为什么 WebView 脚本注入不起作用?
问题描述
该文档建议我应该能够将值注入 WebView 组件显示的网页中,以便加载页面时可以使用该值:
具体来说,下面的代码展示了如何在window
对象中设置一个值,但没有展示它是如何使用的:
import React, { Component } from 'react';
import { View } from 'react-native';
import { WebView } from 'react-native-webview';
export default class App extends Component {
render() {
const runFirst = `
window.isNativeApp = true;
true; // note: this is required, or you'll sometimes get silent failures
`;
return (
<View style={{ flex: 1 }}>
<WebView
source={{uri: 'my-url-here'}}
injectedJavaScriptBeforeContentLoaded={runFirst}
/>
</View>
);
}
}
我正在加载的页面如下所示:
<html>
<body>
<script>
alert(window.isNativeApp)
</script>
</body>
</html>
显示undefined
. 我也试过:
<html>
<body>
<script>
var fn = function() {
alert(window.isNativeApp)
}
document.addEventListener('DOMContentLoaded', fn, false)
</script>
</body>
</html>
结果相同。鉴于我应该能够发送网页值,我应该如何使用它们?
从我的package.json
:
"react-dom": "~16.9.0",
"react-native": "^0.62.1",
"react-native-webview": "^8.2.1",
附录一
事实上,上面似乎根本没有运行。如果我尝试以下操作:
const runFirst = `
console.log('INJECTION')
alert('INJECTION')
true; // note: this is required, or you'll sometimes get silent failures
`;
我既没有收到警报,也没有在日志中找到任何痕迹。当然,我不确定alert()
在加载文档之前是否可以工作,或者在常规应用程序的控制台输出中我是否可以看到日志
相比之下injectedJavaScript
,似乎确实在运行,尽管在文档加载之后,这意味着<script>
在我的文档运行时,该值尚未设置
解决方案
对于下一个为此苦苦挣扎的可怜草皮,图书馆已经坏了,并且(有一天)会被修复,但与此同时,这很有效:
<WebView
source={{uri: 'my-url-here'}}
injectedJavaScriptBeforeContentLoaded={runFirst}
onMessage={event => { alert(event.nativeEvent.data )}}
/>
旨在用于另一个方向的onMessage
通信,但它的存在使代码工作
推荐阅读
- sql - 多年来,在 column1 中查找与 column2 中的“DATE”匹配的所有项目
- alignment - 是否有使用点云的基于 slam 的对齐方式?
- ios - 如何过滤 Core Data Song/Playlist 类型关系中的已订购项目?
- reactjs - React JS如何将道具从一个组件传递到另一个组件
- git - GIT - 进行更改后合并问题
- javascript - 是否可以在 Nodejs 中设置参数之前调用函数?
- sql - 如何将复杂查询解析为 SQL?
- python - 未使用用户名和密码连接到 Socks5
- java - SQL 语法错误:“com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;”
- rest - Azure B2C - 使用 OAuth2 持有者令牌的 REST 调用可防止后续登录