我想在 react-native 中拦截对我的 webview 中的链接的点击并执行自定义操作,而不是按照官方指南中的描述导航到链接的目标。这就是我所做的:
import React from 'react';
import {View, Linking} from 'react-native';
import AsyncStorage from '@react-native-community/async-storage';
import {WebView} from 'react-native-webview';
export default class WebViewScreen extends React.Component {
static navigationOptions = {
title: 'Produck',
};
constructor(props) {
super(props);
}
/**
* Defines content and look of the WebViewScreen.
*/
render() {
const DEFAULT_URL = "https://www.myurl.de/index.html";
return (
<View style={{ flex: 1 }}>
<WebView
ref = {webview => {
this.myWebView = webview;
}}
renderLoading = {this.renderLoading}
startInLoadingState = {true}
automaticallyAdjustContentInsets = {true}
source = {{ uri: DEFAULT_URL }}
javaScriptEnabled = {true}
domStorageEnabled = {true}
cacheEnabled = {false}
useWebKit = {true} // use WKWebView on iOS (http://facebook.github.io/react-native/blog/2018/08/27/wkwebview)
onNavigationStateChange={this.handleWebViewNavigationStateChange.bind(this)}
/>
</View>
);
}
handleWebViewNavigationStateChange = newNavState => {
const {url} = newNavState;
if (!url) return;
if (isExternal(url)) {
this.myWebView.stopLoading();
// do something else, e.g.
Linking.openURL(url);
}
};
}
如果我单击该 web 视图中的链接,则 URL 将按预期在系统浏览器中打开。然而,问题是之后 webview 被冻结了。我无法再点击任何链接,甚至无法滚动页面。当然,这不是应该的。重点是在其他地方打开一个链接,以便 web 视图中的页面保持可用。即使我删除了Linking
-part,结果也将保持不变。然后页面只是在单击链接时冻结。
有谁知道该怎么做?我猜 stopLoading 方法不仅仅是中止加载。它是否也可能取消当前页面上任何正在运行的 Javascript?如果是这样,我可以防止这种情况吗?