【问题标题】:Set state depending on whether document.getelementbyid exists根据 document.getelementbyid 是否存在设置状态
【发布时间】:2018-09-17 14:51:39
【问题描述】:

所以我目前正在使用 InjectJavascript 来更改我的 webview 的 html 元素的值。我能够将这些值分配给我所在州的值。我将如何设置一些等于 document.getElementById('data').value 的状态变量?好像 ReactNative 和 javascript 代码不兼容。

我试过 if(document.getElementById('data').value.length > 0) { ${this.setState({data: document.getElementById('data').value})}},但它不工作

const jsCode= `
  document.getElementById('username').value='${this.state.userName}';  
  document.getElementById('password').value='${this.state.userPassword}';
  document.getElementById('logIn').click();
`

<WebView
   style={styles.webView}
   source={{uri: 'http://example.com'}}
   javaScriptEnabled
   injectedJavaScript={jsCode}
   renderLoading={()=>{
     return(
       <ActivityIndicator style = {
          { position: 'absolute', left: 0, right: 0,
            top: 0, bottom: 0, alignItems: 'center',
            justifyContent: 'center'
          }
       }/>
     )}
   }>
 </WebView>

【问题讨论】:

  • 所以要明确一点,你想setState 基于视图中的一些值变化吗?如果是这样,这不会与特定的输入事件相关联吗?然后我们可以分配一些处理函数来实际执行setState?
  • 是的,所以基本上我正在创建一个用于登录网站的反应原生移动应用程序。我正在使用注入的javascript将文本输入数据放入webview的字段中。当 web 视图上出现 html 元素“无效”时,我试图从本质上切换到我的应用程序上的错误视图。
  • 在jscode中,我尝试查看文档是否包含类名“无效”的元素,然后我应该设置状态,this.setstate({switchtoerrorview: true})
  • 好的,什么会触发“无效”元素?你能挂钩一些事件逻辑(例如一些文本输入处理程序)来检查错误情况何时发生吗?然后通过这种方式,您可以从同一个处理程序触发setState 调用
  • 邮箱和密码错误时触发无效元素。似乎我只能访问注入的 javascript 代码中的“document.getelementbyid”。但我不能同时使用反应组件和 javascript。就像我无法使用 console.log 打印出 document.getelementbyid 值一样,除非我使用模板文字,如 ${console.log},但是我无法访问文字内部的 document.getelementbyid。跨度>

标签: javascript react-native webview getelementbyid setstate


【解决方案1】:

要将一些数据从 WebView 组件传递到 react-native 端,您可以使用 onMessage prop。

注意:an issuepostMessage相关。示例注入代码取自this answer 来解决这个问题。

onMessage

WebView 调用时调用的函数 window.postMessage。设置此属性将注入一个 postMessage 全局进入您的 WebView,但仍会调用 postMessage 的预先存在的值。

window.postMessage 接受一个参数,数据,它将是 可用于事件对象 event.nativeEvent.data数据必须 是一个字符串

示例

const jsCode = `function waitForBridge() {
   //the react native postMessage has only 1 parameter
   //while the default one has 2, so check the signature
   //of the function
   if (window.postMessage.length !== 1){
     setTimeout(waitForBridge, 200);
   }
   else {
     window.postMessage('abc'); // postMessage expects a string
   }
}

window.onload = waitForBridge;`

//...

<WebView
   style={styles.webView}
   source={{uri: 'http://example.com'}}
   javaScriptEnabled
   injectedJavaScript={jsCode}
   onMessage={(event) => console.log('Posted Message: ', event.nativeEvent.data)}
   renderLoading={()=>{
     return(
       <ActivityIndicator style = {
          { position: 'absolute', left: 0, right: 0,
            top: 0, bottom: 0, alignItems: 'center',
            justifyContent: 'center'
          }
       }/>
     )}
   }>
 </WebView>

【讨论】:

  • 所以本质上,当我完成我所有的事件,比如填写用户名/密码/点击,我可以等待webview发送消息,当我收到消息时,我可以相应地设置状态。我有它的要点吗?
  • 是的。你明白了。您可以等待他们填写所有内容,也可以在每次更改中发布消息。如何实施取决于您。只要记住你需要传递一个字符串,所以如果你想传递一些数据,比如一个对象,你可以使用window.postMessage(JSON.stringify({some:'object})),然后在反应端解析 json 对象。
猜你喜欢
  • 1970-01-01
  • 2017-06-11
  • 2015-01-29
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
相关资源
最近更新 更多