React Native WebView 开发中的各种问题

 1.WebView 嵌入 html 代码时乱码,  在后面加 baseUrl: ''

<WebView source ={{html:"<h1> html </h1>", baseUrl: ''}}></WebView>

2.浏览器返回上一页

//定义 canGoBack
constructor(props){
  super(props);
  this.state = {
    canGoBack: false
  }
}

//添加ref属性
//onNavigationStateChange 当导航状态发生变化的时候调用,回调接收一个参数,里面包含了canGoBack
<WebView 
  ref={(browser)=>{this.browser=browser}} 
  onNavigationStateChange={this._onNavigationStateChange}>
</WebView>

//返回上一页方法,有上一页时调用此方法就行
onBackHandler = ()=>{
  if(this.state.canGoBack){
    this.browser.goBack();
  }
}

//当WebView导航状态发生变化的时候调用,将 navState.canGoBack 保存
_onNavigationStateChange = (navState) => {
  this.setState({
    canGoBack: navState.canGoBack
  });
}

3.ScrollView嵌套WebView 滚动条问题(ScrollView 和 WebView 都自带滚动条, 嵌套后ScrollView的滚动条无效)

 3.1 使用WebView的属性 injectedJavaScript 注入脚本代码, 通过 window.postMessage 向上派发Event

const injectedJavaScript = `
(function () {
  var height = null;
  function changeHeight() {
    if (document.body.scrollHeight != height) {
      height = document.body.scrollHeight;
      if (window.postMessage) {
        window.postMessage(JSON.stringify({
          type: 'setHeight',
          data: height,
        }))
      }
    }
  }
  setInterval(changeHeight, 100);
}());`;

 3.2 使用WebView的属性 onMessage 接收 window.postMessage 发送的data,实现网页和RN之间的数据交换,得到height后设置给WebView

onMessageActions = {
  setHeight: (height) => {
    if (height > 0) {
      this.setState({ height });
    }
  },
};

render() {
  return (
    <ScrollView style={{ flex: 1 }}>
      <Text>头部</Text>
      <WebView 
        source ={{ uri: 'https://www.baidu.com' }}
        style={{height: this.state.height,width:Dimensions.get('window').width}} 
        injectedJavaScript={injectedJavaScript}
        onMessage={(event) => {
          try {
            const action = JSON.parse(event.nativeEvent.data);
            const { type, data } = action;
            //hasOwnProperty 判断对象是否包含特定的自身(非继承)属性
            if (this.onMessageActions.hasOwnProperty(type)) {
              this.onMessageActions[type](data);
            }
          } catch (error) {
            console.log(error);
          }  
        }}></WebView>
    </ScrollView>
  );
}

 3.3 WebView 图片过大问题(上述已经解决了滚动冲突问题,  但是如果WebView嵌入html代码, html里面的图片宽度超过了手机宽度,那么WebView的高度会很高~很高~~~底部会有一大~~~片空白)

把 injectedJavaScript 代码修改一下 给所有图片添加最大宽度限制

const injectedJavaScript = `
(function () {
  var height = null;
  for(i=0; i < document.images.length; i++){
    document.images[i].style['max-width'] = ${Dimensions.get("window").width-20};
  }
  function changeHeight() {
    if (document.body.scrollHeight != height) {
      height = document.body.scrollHeight;
      if (window.postMessage) {
        window.postMessage(JSON.stringify({
          type: 'setHeight',
          data: height,
        }))
      }
    }
  }
  setInterval(changeHeight, 100);
}());`;

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值