-
React Native Web 安卓h5 Touchable onPress 触发两次问题解决
2019-12-24 16:17:38在维护基于 React Native Web 的 h5 项目时,遇到这样的一个 bug,在部分安卓 h5 页面一些点击事件会稳定触发两边,这样的问题在 iOS 和 pc 调试 h5 都是好的,甚至同一机型只要另外换一个浏览器可能也会有不同的...在维护基于 React Native Web 的 h5 项目时,遇到这样的一个 bug,在部分安卓 h5 页面一些点击事件会稳定触发两边,这样的问题在 iOS 和 pc 调试 h5 都是好的,甚至同一机型只要另外换一个浏览器可能也会有不同的效果。
在调试阶段,发现只要把
TouchableHighlight
等组件都干掉,换成 div,点击事件也从onPress
改到onClick
,就全部是好的,不过由于是三端项目,需要TouchableHighlight
这些 React Native 组件,当然不能这么改了了事,不过也给我定位到可能是 React Native WebTouchable
类组件的 bug定位到是这个问题,很快可以找到对应问题 issue 以及 RNW 作者的回复和解决 链接
管中窥豹
根据 issue 里大家的讨论结合后面作者 necolas 的修复改动,我们可以加一些 console 来看下引起问题的原因
首先在有问题的 onPress 函数里添加
console.log('触发 onPress 函数')
然后在
node_modules/react-native-web/dist/modules/ResponderEventPlugin/index.js
找到以下的代码(在备注的地方加入console)ResponderEventPlugin.extractEvents = function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { var hasActiveTouches = ResponderTouchHistoryStore.touchHistory.numberActiveTouches > 0; var eventType = nativeEvent.type; // 在这加 console console.log('responder >>> ', topLevelType, Date.now() - lastActiveTouchTimestamp) var shouldSkipMouseAfterTouch = false; if (eventType.indexOf('touch') > -1) { lastActiveTouchTimestamp = Date.now(); } else if (lastActiveTouchTimestamp && eventType.indexOf('mouse') > -1) { var now = Date.now(); shouldSkipMouseAfterTouch = now - lastActiveTouchTimestamp < 250; } if ( // Filter out mousemove and mouseup events when a touch hasn't started yet (eventType === 'mousemove' || eventType === 'mouseup') && !hasActiveTouches || // Filter out events from wheel/middle and right click. nativeEvent.button === 1 || nativeEvent.button === 2 || // Filter out mouse events that browsers dispatch immediately after touch events end // Prevents the REP from calling handlers twice for touch interactions. // See #802 and #932. shouldSkipMouseAfterTouch) { return; } var normalizedEvent = normalizeNativeEvent(nativeEvent); return originalExtractEvents.call(ResponderEventPlugin, topLevelType, targetInst, normalizedEvent, nativeEventTarget); };
然后我们看一下效果
可以看到 onPress 确实触发了两次,且第一次在
touchend
之后,第二次在mouseup
之后,所以我们可以合理推测 React Native Web 的 Touchable 组件将 onPress 应该就是在touchend
和mouseup
都绑定上了那为何只有特定安卓 h5 会有这个问题呢?照上面的推论,那应该每个设备都有这个问题
我们可以换至不会触发问题的浏览器下看一下效果(在我的 onePlus 6T 下只有微信环境稳定复现,其他浏览器都不会有问题)
似乎差不多不过就是没有触发两次 onPress,让我们再来看一下源码的实现
简而言之就是,
now - lastActiveTouchstamp < 250
时,就可以使shouldSkipMouseAfterTouch = true
,从而跳过绑定在 mouse 上的 onPress 事件,从而避免触发两次的情况而我们在前面 console 后面加上的数字就是
now - lastActiveTouchstamp
的值,可以看到问题浏览器下,该值均在 320+,不在 250ms 的安全阈值内,无法跳过绑定在 mouse 上的 onPress 事件,因此触发两次 onPress。解决方案
找到引起问题的原因,就可以需要找到一些解决方法了,下面我抛砖引玉,提供三种解决方案的思路
1. 升级 react-native-web 版本
在 0.11.7+ 的版本,RNW 作者将安全阈值更新到了 1000ms,这就可以解决绝大多数的浏览器问题。(当然了在公司某台巨卡测试机上 仍有问题,根据上面的调试,测出来的相距时间达到了 1200ms+)
2. 利用 postinstall 钩子函数处理
不过目前项目已经很难做依赖库升级的情况下,我们可以利用 npm 的 postinstall 钩子函数,写一些脚本在
npm i
后执行,人为修改本地node_modules
里的文件举个例子,可以利用
sed
命令来处理sed -i '' "s/250/1500/g" ./node_modules/react-native-web/dist/modules/ResponderEventPlugin/index.js
这种方式很灵活,可以灵活改动安全阈值,比如我就把 250 改到了 1500
3. 使用 preventDefault 函数
移動端瀏覽器 :當 Touch Event 與 Mouse Event 同時存在的時候
从上面的文章可以知道,我们可以在
touchend
handler 中执行event.preventDefault()
去取消 mouse event 的发送也就是说,我们可以在有问题的 onPress 里加上
event.preventDefault()
就可以了(上面文章打不开的,网上还有其他很多优质博客,这里不再赘述) -
Android和H5之间的交互
2016-11-24 16:20:32hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的? 1、webView加载页面 我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置...Android和H5之间的交互
hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的?
1、webView加载页面
我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同:
//例如:加载assets文件夹下的test.html页面 mWebView.loadUrl("file:///android_asset/test.html") //例如:加载网页 mWebView.loadUrl("http://www.baidu.com")
如果只是这样调用mWebView.loadUrl()加载的话,那么当你点击页面中的链接时,页面将会在你手机默认的浏览器上打开。那如果想要页面在App内中打开的话,那么就得设置setWebViewClient:
mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { mWebView.loadUrl(url); return true; } } });
2、Android本地通过Java调用HTML页面中的JavaScript方法
想要调用js方法那么就必须让webView支持
WebSettings webSettings = mWebView.getSettings(); //设置为可调用js方法 webSettings.setJavaScriptEnabled(true);
若调用的js方法没有返回值,则直接可以调用mWebView.loadUrl("javascript:do()");其中do是js中的方法;若有返回值时我们可以调用mWebView.evaluateJavascript()方法:
mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.e(TAG, "onReceiveValue value=" + value); } });
js代码如下:
<script type="text/javascript"> function sum(a,b){ return a+b; } function do(){ document.getElementById("p").innerHTML="hello world"; } </script>
2、js调用Android本地Java方法
在Android4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法
public class JsInteration { @JavascriptInterface public String back() { return "hello world"; } }
定义完这个方法后再调用mWebView.addJavascriptInterface()方法:
mWebView.addJavascriptInterface(new JsInteration(), "android");
那么在js中怎么来调用呢?
<script type="text/javascript"> function s(){ //调用Java的back()方法 var result =window.android.back(); document.getElementById("p").innerHTML=result; } </script>
4、拦截HTML页面中的点击事件
mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //判断url拦截事件 if (url.equals("file:///android_asset/test2.html")) { Log.e(TAG, "shouldOverrideUrlLoading: " + url); startActivity(new Intent(MainActivity.this,Main2Activity.class)); return true; } else { mWebView.loadUrl(url); return false; } } });
以上就是Java调用js方法以及js调用Java方法的实现交互方式中的一种。下面给出完整代码:
mainActivity
public class MainActivity extends AppCompatActivity { public static final String TAG = "MainActivity"; private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = (WebView) findViewById(R.id.webView); mWebView.loadUrl("file:///android_asset/test.html"); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new JsInteration(), "android"); mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.equals("file:///android_asset/test2.html")) { Log.e(TAG, "shouldOverrideUrlLoading: " + url); startActivity(new Intent(MainActivity.this,Main2Activity.class)); return true; } else { mWebView.loadUrl(url); return false; } } }); } //Android调用有返回值js方法 @TargetApi(Build.VERSION_CODES.KITKAT) public void onClick(View v) { mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.e(TAG, "onReceiveValue value=" + value); } }); } public class JsInteration { @JavascriptInterface public String back() { return "hello world"; } } }
test.html
<!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript"> function sum(a,b){ return a+b; } function s(){ var result =window.android.back(); document.getElementById("p").innerHTML=result; } </script> </head> <body> <button onclick="s()">调用本地方法</button> <a href="file:///android_asset/test2.html">点击</a> <p id="p"></p> </body> </html>
-
Android 和H5之间的交互-基础篇
2020-06-08 16:39:14hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的? 1、webView加载页面 我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置...hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的?
1、webView加载页面
我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同:
//例如:加载assets文件夹下的test.html页面 mWebView.loadUrl("file:///android_asset/test.html") //例如:加载网页 mWebView.loadUrl("http://www.baidu.com")
如果只是这样调用mWebView.loadUrl()加载的话,那么当你点击页面中的链接时,页面将会在你手机默认的浏览器上打开。那如果想要页面在App内中打开的话,那么就得设置 setWebViewClient:
mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { mWebView.loadUrl(url); return true; } } });
2、Android本地通过Java调用HTML页面中的JavaScript方法
想要调用js方法那么就必须让webView支持
WebSettings webSettings = mWebView.getSettings(); //设置为可调用js方法 webSettings.setJavaScriptEnabled(true);
若调用的js方法没有返回值,则直接可以调用 mWebView.loadUrl("javascript:do()"); 其中do是js中的方法;若有返回值时我们可以调用 mWebView.evaluateJavascript() 方法:
mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.e(TAG, "onReceiveValue value=" + value); } });
js代码如下:
<script type="text/javascript"> function sum(a,b){ return a+b; } function do(){ document.getElementById("p").innerHTML="hello world"; } </script>
3、js调用Android本地Java方法在Android4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法
public class JsInteration { @JavascriptInterface public String back() { return "hello world"; } }
定义完这个方法后再调用 mWebView.addJavascriptInterface() 方法:
mWebView.addJavascriptInterface(new JsInteration(), "android");
那么在js中怎么来调用呢?
<script type="text/javascript"> function s(){ //调用Java的back()方法 var result =window.android.back(); document.getElementById("p").innerHTML=result; } </script>
4、拦截HTML页面中的点击事件
mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //判断url拦截事件 if (url.equals("file:///android_asset/test2.html")) { Log.e(TAG, "shouldOverrideUrlLoading: " + url); startActivity(new Intent(MainActivity.this,Main2Activity.class)); return true; } else { mWebView.loadUrl(url); return false; } } });
以上就是Java调用js方法以及js调用Java方法的实现交互方式中的一种。下面给出完整代码:
mainActivitypublic class MainActivity extends AppCompatActivity { public static final String TAG = "MainActivity"; private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = (WebView) findViewById(R.id.webView); mWebView.loadUrl("file:///android_asset/test.html"); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new JsInteration(), "android"); mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.equals("file:///android_asset/test2.html")) { Log.e(TAG, "shouldOverrideUrlLoading: " + url); startActivity(new Intent(MainActivity.this,Main2Activity.class)); return true; } else { mWebView.loadUrl(url); return false; } } }); } //Android调用有返回值js方法 @TargetApi(Build.VERSION_CODES.KITKAT) public void onClick(View v) { mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.e(TAG, "onReceiveValue value=" + value); } }); } public class JsInteration { @JavascriptInterface public String back() { return "hello world"; } } }
test.html
<!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript"> function sum(a,b){ return a+b; } function s(){ var result =window.android.back(); document.getElementById("p").innerHTML=result; } </script> </head> <body> <button onclick="s()">调用本地方法</button> <a href="file:///android_asset/test2.html">点击</a> <p id="p"></p> </body> </html>
-
Android和H5交互
2019-03-24 23:24:57hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的? 1、webView加载页面 我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置...hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的?
1、webView加载页面
我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同:
//例如:加载assets文件夹下的test.html页面 mWebView.loadUrl("file:///android_asset/test.html") //例如:加载网页 mWebView.loadUrl("http://www.baidu.com")
如果只是这样调用mWebView.loadUrl()加载的话,那么当你点击页面中的链接时,页面将会在你手机默认的浏览器上打开。那如果想要页面在App内中打开的话,那么就得设置setWebViewClient:
mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { mWebView.loadUrl(url); return true; } } });
2、Android本地通过Java调用HTML页面中的JavaScript方法
想要调用js方法那么就必须让webView支持
WebSettings webSettings = mWebView.getSettings(); //设置为可调用js方法 webSettings.setJavaScriptEnabled(true);
若调用的js方法没有返回值,则直接可以调用mWebView.loadUrl("javascript:do()");其中do是js中的方法;若有返回值时我们可以调用mWebView.evaluateJavascript()方法:
mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.e(TAG, "onReceiveValue value=" + value); } });
js代码如下:
<script type="text/javascript"> function sum(a,b){ return a+b; } function do(){ document.getElementById("p").innerHTML="hello world"; } </script>
3、js调用Android本地Java方法
在Android4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法
public class JsInteration { @JavascriptInterface public String back() { return "hello world"; } }
定义完这个方法后再调用mWebView.addJavascriptInterface()方法:
mWebView.addJavascriptInterface(new JsInteration(), "android");
那么在js中怎么来调用呢?
<script type="text/javascript"> function s(){ //调用Java的back()方法 var result =window.android.back(); document.getElementById("p").innerHTML=result; } </script>
4、拦截HTML页面中的点击事件
mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //判断url拦截事件 if (url.equals("file:///android_asset/test2.html")) { Log.e(TAG, "shouldOverrideUrlLoading: " + url); startActivity(new Intent(MainActivity.this,Main2Activity.class)); return true; } else { mWebView.loadUrl(url); return false; } } });
以上就是Java调用js方法以及js调用Java方法的实现交互方式中的一种。下面给出完整代码:
mainActivity.java
public class MainActivity extends AppCompatActivity { public static final String TAG = "MainActivity"; private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWebView = (WebView) findViewById(R.id.webView); mWebView.loadUrl("file:///android_asset/test.html"); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new JsInteration(), "android"); mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.equals("file:///android_asset/test2.html")) { Log.e(TAG, "shouldOverrideUrlLoading: " + url); startActivity(new Intent(MainActivity.this,Main2Activity.class)); return true; } else { mWebView.loadUrl(url); return false; } } }); } //Android调用有返回值js方法 @TargetApi(Build.VERSION_CODES.KITKAT) public void onClick(View v) { mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.e(TAG, "onReceiveValue value=" + value); } }); } public class JsInteration { @JavascriptInterface public String back() { return "hello world"; } } }
test.html
<!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript"> function sum(a,b){ return a+b; } function s(){ var result =window.android.back(); document.getElementById("p").innerHTML=result; } </script> </head> <body> <button onclick="s()">调用本地方法</button> <a href="file:///android_asset/test2.html">点击</a> <p id="p"></p> </body> </html>
-
h5怎么跟mysql进行交互_Android和H5交互-基础篇
2021-02-06 19:47:37hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的?1、webView加载页面我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同... -
Android和H5交互-基础篇
2017-08-18 16:33:00hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的? 1、webView加载页面 我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置... -
android和H5之间的交互 最近用到这个比较多 很多知识都忘了 来巩固一下
2017-07-11 10:03:13hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的? 1、webView加载页面 我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置... -
魔法秀,让你的 H5 页面秒变 Hybrid APP(混合应用)
2018-06-26 14:06:24原文地址:https://wangfanggang.com/Mobile/native-apex/引言很多时候我们也想要有自己的移动端APP,怎奈还要兼容 iOS、Android 不同平台,开发成本太高。昨天刷 twitter,无意中发现一个好玩的网站 ... -
AdvancedHybrid-Framework-Android,一个先进的android混合框架,可以通过webview进行h5和本地交互。...
2019-09-25 06:57:26H5 和原生控件混合的 Hybride 应用,这类应用有一个特点,大部分页面通过前端 H5 页面实现,难免会遇到 B 页面和 Native 交互的场景,通常安卓端和 IOS 端页面和 Native 层间的交互使用的两套不同架构,前端开发同时... -
Android开发之--安卓原生与h5交互-基础篇
2017-05-25 10:38:20hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的? 1、webView加载页面 我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的... -
HTML5页面调起APP
2017-05-21 10:13:17为了提升app的曝光和app的用户新增,添加H5分享页的应用场景是必不可少的,但是各种平台环境不一,要如何兼容和策略处理。下面会一一说明 1. 页面调起原生app 调起原生 app,然后下载APP 不同平台的兼容和策略处理... -
前端技术的开放和封闭
2021-01-03 23:13:13这也是我们在 PC 和无线时代不断提炼前端开发框架、研发模式、共享代码和开源社区建设的基本理念,即将规范做轻、研发环境做实、抽离代码、贡献代码的体验打磨到最佳。这种对一致性、规范性、简单性的美学追求... -
Hybrid开发原理分析和开发中常见问题
2020-11-10 21:11:52开发和发布的成本极高,两端需要不同的技术人员来维护,原生开发人员非常的稀缺 2.WebApp 移动端运行在浏览器上的网站,我们一般称之为H5应用,就是泛指我们经常开发的spa,map页面 语言:js,vue,react,angular等 优点... -
混合开发
2017-04-11 18:32:18ybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的? 1、webView加载页面 我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的... -
无线客户端的日志采集
2021-01-23 15:17:40目录0 概述1 页面事件2 控件点击及其他事件3 特殊场景4 H5 & Native 日志统一5 设备...日志采集根据不同的用户行为分成不同的事件,“事件”是无线客户端日志行为的最小单位; 事件一般分为页面事件和控件点击事件 -
轻量级安卓Hybride应用框架
2017-12-04 11:38:01该项目适合那些H5和原生控件混合的Hybride应用,这类应用有一个特点,大部分页面通过前端H5页面实现,难免会遇到B页面和Native交互的场景,通常安卓端和IOS端页面和Native层间的交互使用的两套不同架构,前端开发... -
Appium-Hybrid Mobile App
2021-01-30 20:21:21定义 可以理解为通过 Web 网络技术(如 HTML,CSS 和 JavaScript)与 Native 相结合的混合移动应用程序。H5主要用于界面的编写,比如按钮、...现在很多app都是由原生页面(native)和webview页面(H5)组成,在自动... -
现如今市面上端的形态多种多样,Web、React Native、微信小程序等各种端大行其道,当业务要求同时在不同的端都要求有所表现的时候,针对不同的端去编写多套代码的成本显然非常高,这时候只编写一套代码就能够适配到...
-
2019 与我的技术之路
2020-12-09 05:17:58公司决定将原来基于 Vue 的纯 H5 开发的 App 和一个基于 React Native 的开源 IM 客户端 <a href="https://github.com/mattermost/mattermost-mobile">mattermost-mobile</a> 融合成一个 App。主要通过 React Native... -
[vue] 从0到1自己构架一个vue项目,说说有哪些步骤、哪些重要插件、目录结构你会怎么组织
2021-01-02 14:12:13前端的项目目前来看主要分为小程序开发,H5页面开发、PC官网、后台管理系统开发、Native开发。不同的项目所涉及的知识点和环境不太一样,但是很多方面是相通的。 1.1小程序 由于框架限定在Vue,所以这里指的是使用... -
FinClip:看小程序如何助力企业移动应用转型升级
2020-12-08 14:13:17原生应用开发模式(Native)为 App 的开发与升级提供了标准化的实现与优化方案,但在此模式下,开发者需要根据不同平台撰写不同代码,对研发团队的配置和能力要求自然不会太低。 与此同时,原生开发下过于标准化的... -
快速学习02
2018-04-11 17:42:12计划论坛的一级页面,VIP页面要用内嵌H5页面; 如何交互 用到的知识点 User Agent 是什么:它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的... -
RF+Appium 测试webview:用户注册
2017-12-14 15:28:18RF+Appium 测试Webview:用户注册Hybrid APP 的测试方法: ...移动应用和 Webview 分别属于两个不同的上下文(context)。移动应用默认情况下的 context 为“NATIVE_APP”,而 Webview 的context 为“WEBVIEW_pack -
hellomui.zip
2020-08-04 21:29:17开发者可以根据自己的需要进行代码适配,对于APP使用增强的原生组件,对于普通浏览器里面运行的页面使用h5组件。同时用户还可以使用mui.os.android、mui.os.ios及mui.os.wechat对平台进行检测,然后书写不同的逻辑... -
目前Fly.js支持的平台包括:Node.js 、微信小程序 、Weex 、React Native 、Quick App 和浏览器,这些平台的 JavaScript 运行时都是不同的。更多的平台正在持续添加中,请保持关注。 简介 Fly.js 是一个基于 ...
-
天猫双11前端分享系列(四):大规模 Node.js 应用
2021-01-10 04:14:29根据 url 和设备类型选择不同的页面返回。返回时设置 <a href="http://www.w3.org/Protocols/HTTP/Issues/vary-header.html"><code>vary</code></a> 为 <code>detector</code>,保证 CDN 根据不同的设备类型...
-
[leetcode] 1726. Tuple with Same Product
-
Mycat 实现 MySQL的分库分表、读写分离、主从切换
-
MySQL 备份与恢复详解(高低版本 迁移;不同字符集 相互转换;表
-
Docker从入门到精通
-
国内室内定位方向分析详解-蓝牙定位在室内定位方案中的优势
-
ROS软路由如何实现多个设备连接不同ip地址?
-
MyBatis中的模糊查询--like
-
yiqiandeMOG_BattleHud.rar
-
MySQL 数据库权限管理(用户高级管理和精确访问控制)
-
golang语言中map的初始化及使用
-
程序员必修基础套餐课
-
分享多开技术-实现单窗口单IP,多窗口多个不同IP的技术【电脑端】
-
php提示Notice: Undefined index解决方法
-
Unity Texture Overview Pro 5.0.7z
-
三轮生肖发行数量(2004-2015)
-
解决CentOS8使用mysql远程连接时无法链接端口问题
-
C/C++中函数声明的作用
-
1MHZ超声波雾化电路图+pcb
-
删除win10自带杀毒软件.iso
-
单位换算公式