React中如何调用注入ReactNative的WebView的JavaScript代码?
How to call JavaScript code injected into WebView of ReactNative in React?
我在React-Native中的WebView中注入了一段JS代码。我想在我的网页上调用这个js代码(使用React),就像在程序中使用API一样,但是我失败了
这是我当前的代码:
const WebAPICode = `
function test() {
alert('Hello');
}
`;
export default class PluginView extends Component {
render() {
return (
<View {...this.props}>
<WebView
ref={webView=> this.webView = webView}
originWhitelist={['*']}
source={{ uri: "http://10.0.2.2:3000/" }}
onLoadEnd={()=>this.webView.injectJavaScript(WebAPICode)}
/>
<Text>{WebAPICode}</Text>
</View>
);
}
}
我想在React
中调用它,但这显然是错误的方式。查了很多资料还是不知道怎么实现。
function App() {
return (
<span onClick={()=>test()}>test</span>
);
}
就像setTimeout函数一样,js标准中没有这个函数,但是浏览器把它添加到了window对象中,window.setTimeout,我也想加上自己定义的对 webview 的功能,就像测试一样。
将测试函数注入到此 webview 中,而不是将其写入脚本标签中。
<html lang="en">
<head>
<script>
// The function is defined here, but I want this
// definition to be injected into the browser
function test() {
alert('hello');
}
/**
* This is what I want:
* <WebView injectedJavaScript={`function test() {
* alert('hello');
* }`}/>
* Inject the test function into this webview instead
* of writing it in the script tag.
*/
</script>
</head>
<body>
<script>
test();
</script>
</body>
</html>
查看 official document of the webview
并了解如何使用它。编写模块时始终参考官方文档。
你可以用这个
const WebAPICode = `alert('Hello')`;
...
<WebView
ref={webView=> this.webView = webView}
originWhitelist={['*']}
source={{ uri: "http://10.0.2.2:3000/" }}
javaScriptEnabled={true}
injectedJavaScript={WebAPICode}
/>
如果你的网站上有这个功能,你可以调用它。
<html>
<head>
<script language="javascript">
function test()
{
alert('Hello');
}
</script>
</head>
<body>
...
const WebAPICode = `test()`;
...
<WebView
ref={webView=> this.webView = webView}
originWhitelist={['*']}
source={{ uri: "http://10.0.2.2:3000/" }}
javaScriptEnabled={true}
injectedJavaScript={WebAPICode}
/>
要执行评论中显示的数据,您必须这样做。
您的 webview 页面执行此操作
var data = {name: "getname"}
window.ReactNativeWebView.postMessage(data);
handleMessage(e) {
//여러 데이터가 리스트 형식으로 올때
let parsedata = JSON.parse(e.nativeEvent.data);
message = parsedata.name
if(message == "get name") {
const data = { name: "John" }
this.webview.postMessage(JSON.stringify(data));
}
}
<WebView
ref={webview => (this.webview = webview)}
onMessage={mssage => this.handleMessage(mssage)}
}
接收网页浏览页面
document.addEventListener("message", function(event) {
console.log("Received post message", event);
test(event.data);
}, false);
您可以从 webview 调用 postMessage 并像这样设置您的 webview onMessage 道具。
onMessage={event => { console.log(event) } }
在您的网络视图中 html:
window.ReactNativeWebView.postMessage("Your Message");
我在React-Native中的WebView中注入了一段JS代码。我想在我的网页上调用这个js代码(使用React),就像在程序中使用API一样,但是我失败了
这是我当前的代码:
const WebAPICode = `
function test() {
alert('Hello');
}
`;
export default class PluginView extends Component {
render() {
return (
<View {...this.props}>
<WebView
ref={webView=> this.webView = webView}
originWhitelist={['*']}
source={{ uri: "http://10.0.2.2:3000/" }}
onLoadEnd={()=>this.webView.injectJavaScript(WebAPICode)}
/>
<Text>{WebAPICode}</Text>
</View>
);
}
}
我想在React
中调用它,但这显然是错误的方式。查了很多资料还是不知道怎么实现。
function App() {
return (
<span onClick={()=>test()}>test</span>
);
}
就像setTimeout函数一样,js标准中没有这个函数,但是浏览器把它添加到了window对象中,window.setTimeout,我也想加上自己定义的对 webview 的功能,就像测试一样。
将测试函数注入到此 webview 中,而不是将其写入脚本标签中。
<html lang="en">
<head>
<script>
// The function is defined here, but I want this
// definition to be injected into the browser
function test() {
alert('hello');
}
/**
* This is what I want:
* <WebView injectedJavaScript={`function test() {
* alert('hello');
* }`}/>
* Inject the test function into this webview instead
* of writing it in the script tag.
*/
</script>
</head>
<body>
<script>
test();
</script>
</body>
</html>
查看 official document of the webview
并了解如何使用它。编写模块时始终参考官方文档。
你可以用这个
const WebAPICode = `alert('Hello')`;
...
<WebView
ref={webView=> this.webView = webView}
originWhitelist={['*']}
source={{ uri: "http://10.0.2.2:3000/" }}
javaScriptEnabled={true}
injectedJavaScript={WebAPICode}
/>
如果你的网站上有这个功能,你可以调用它。
<html>
<head>
<script language="javascript">
function test()
{
alert('Hello');
}
</script>
</head>
<body>
...
const WebAPICode = `test()`;
...
<WebView
ref={webView=> this.webView = webView}
originWhitelist={['*']}
source={{ uri: "http://10.0.2.2:3000/" }}
javaScriptEnabled={true}
injectedJavaScript={WebAPICode}
/>
要执行评论中显示的数据,您必须这样做。
您的 webview 页面执行此操作
var data = {name: "getname"}
window.ReactNativeWebView.postMessage(data);
handleMessage(e) {
//여러 데이터가 리스트 형식으로 올때
let parsedata = JSON.parse(e.nativeEvent.data);
message = parsedata.name
if(message == "get name") {
const data = { name: "John" }
this.webview.postMessage(JSON.stringify(data));
}
}
<WebView
ref={webview => (this.webview = webview)}
onMessage={mssage => this.handleMessage(mssage)}
}
接收网页浏览页面
document.addEventListener("message", function(event) {
console.log("Received post message", event);
test(event.data);
}, false);
您可以从 webview 调用 postMessage 并像这样设置您的 webview onMessage 道具。
onMessage={event => { console.log(event) } }
在您的网络视图中 html:
window.ReactNativeWebView.postMessage("Your Message");