我也遇到了这个问题,我可以通过设置混合内容模式来让它工作:
mixedContentMode={'compatibility'}
请参阅下面的 props.url = {uri:'https://google.com'} 快速测试 javascript 将“看看我,我正在注入”粘贴到搜索框中。
import React from 'react';
import { Button, StyleSheet, Text, View, ScrollView, WebView } from 'react-native';
export class WebViewController extends React.Component {
constructor(props) {
super(props);
}
render() {
const url = this.props.url;
console.log(`v:1`);
console.log(`url info: ${JSON.stringify(url)}`);
console.log(`javascript: ${Constants.javascript.injection}`);
return (
<View style={styles.root}>
<WebView
source={url}
injectedJavaScript={Constants.javascript.injection}
mixedContentMode={'compatibility'}
javaScriptEnabled={true}
style={styles.webview}
/>
</View>
);
}
}
const styles = StyleSheet.create({
root: {
flex:1,
alignSelf: 'stretch',
},
webview: {
flex:1,
alignSelf: 'stretch',
},
})
const Constants = {
javascript: {
injection: `
Array.from(document.getElementsByTagName('input')).forEach((item) => {
if(item.type == "search") {
item.value = "look at me, I'm injecting";
}
})
`
}
}
我预计问题是当您直接添加 html 并注入 javascript 时,webview 会将注入视为来自同一来源的 javascript。与通过 url 加载页面时不同,在这种情况下,您的 javascript 是外来的,并且默认值是 'never' 的混合内容模式被认为是在原点之外的
见:https://facebook.github.io/react-native/docs/webview.html#mixedcontentmode
混合内容模式
指定混合内容模式。即 WebView 将允许安全源从任何其他源加载内容。
mixedContentMode 的可能值为:
'never'(默认)- WebView 将不允许安全源从不安全的源加载内容。
'always' - WebView 将允许安全源从任何其他源加载内容,即使该源不安全。
'compatibility' - WebView 将尝试与现代 Web 浏览器在混合内容方面的方法兼容。