HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

关于IOS触发click事件无法接收payload的解决办法

纠结了一个下午才搞定的一个问题,闲话不多说给大家分享一下
推送工具:个推
个推的透传消息模版有一个参数:payload,这个参数就是在触发click事件传输的值。
template.setPushInfo(actionLocKey, badge, message, sound, payload, locKey, locArgs, launchImage);模版可以从个推文档查到

receive的值不用改还用:transContent的标准格式写法
监听接收的方法:
switch(msg.type){
case "click":
receiveMsg = msg.payload.payload;
break;
case "receive":
receiveMsg = msg.payload;
break;
}

希望这能够节省一下大家的时间,有不同的方法的同学,可以留言指教!

继续阅读 »

纠结了一个下午才搞定的一个问题,闲话不多说给大家分享一下
推送工具:个推
个推的透传消息模版有一个参数:payload,这个参数就是在触发click事件传输的值。
template.setPushInfo(actionLocKey, badge, message, sound, payload, locKey, locArgs, launchImage);模版可以从个推文档查到

receive的值不用改还用:transContent的标准格式写法
监听接收的方法:
switch(msg.type){
case "click":
receiveMsg = msg.payload.payload;
break;
case "receive":
receiveMsg = msg.payload;
break;
}

希望这能够节省一下大家的时间,有不同的方法的同学,可以留言指教!

收起阅读 »

dclouder 连接蓝牙

Android 蓝牙

搞了很久,终于搞出来的,但是还不是很友好,目前,js不能开启多线程,只能 一次取完了数据,就关闭socket,下次再取数据,的时候,
在开启socket 获取完了,关闭;不能一直开着socket ,不然会阻塞当前主线程,什么也干不了,有没有大神指导这种情况如何处理,怎样才能,一直开着socket ,不停地解析传过来的包,不阻塞主线程呢,我是使用dclouder连接了蓝牙设备,蓝牙发信号,然后手机接收 数据,

先是搜索:
console.log("search::isOpen="+isOpen);
if(isOpen==true) return;
main = plus.android.runtimeMainActivity();
var IntentFilter = plus.android.importClass('android.content.IntentFilter');
var BluetoothDevice = plus.android.importClass("android.bluetooth.BluetoothDevice");
console.log("开始搜索设备");
var filter = new IntentFilter();
// var bdevice = new BluetoothDevice();
var BleDevice = new BluetoothDevice();
disableBtn(true);
BAdapter.startDiscovery(); //开启搜索
var receiver;
receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
onReceive: function(context, intent) { //实现onReceiver回调函数
plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作
if(intent.getAction() == "android.bluetooth.adapter.action.DISCOVERY_FINISHED") {
main.unregisterReceiver(receiver); //取消监听
disableBtn(false);
plus.nativeUI.toast("搜索结束");
console.log("搜索结束");
} else {
BleDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if(BleDevice==null){main.unregisterReceiver(receiver); //取消监听
disableBtn(false); return;}
var name=BleDevice.getAddress()+BleDevice.getName();
if(bleArray.indexOf(name)==-1){
bleArray.push(name);
addNode(table,BleDevice.getAddress(),BleDevice.getName());
}//开始判断
var lastBLE = localStorage.getItem('lastBLE');
console.log("lastBLE::"+lastBLE);
if(lastBLE!=null&&lastBLE==BleDevice.getAddress()){
main.unregisterReceiver(receiver); //取消监听
disableBtn(false);
ConnectEqu(lastBLE);
}

                }  
            }  
        });   
        filter.addAction(BleDevice.ACTION_FOUND);  
        filter.addAction(BAdapter.ACTION_DISCOVERY_STARTED);  
        filter.addAction(BAdapter.ACTION_DISCOVERY_FINISHED);  
        filter.addAction(BAdapter.ACTION_STATE_CHANGED);  
        main.registerReceiver(receiver, filter); //注册监听   

搜索完了,开始连接蓝牙:

main = plus.android.runtimeMainActivity();  
        BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");  
        UUID = plus.android.importClass("java.util.UUID");  
        uuid = UUID.fromString(FETUS_UUID);  
        BAdapter = BluetoothAdapter.getDefaultAdapter();  
        device = BAdapter.getRemoteDevice(mac_address);  
        plus.android.importClass(device);  
        bluetoothSocket=null;  
        bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);  
        plus.android.importClass(bluetoothSocket);  
        if(!bluetoothSocket.isConnected()) {       
            bluetoothSocket.connect();  
        }             
       if(bluetoothSocket.isConnected()) {   
        isOpen=true;  
        console.log("search::isOpen="+isOpen);  
        console.log('设备已连接'); //连接成功做标记,下次直接连接  

// localStorage.setItem('lastBLE',mac_address);
// var lastBLE =localStorage.getItem('lastBLE');
// console.log("lastBLE::"+lastBLE);
var inputStream = bluetoothSocket.getInputStream();
plus.android.importClass(inputStream);
var msg =null;
try{
var msg ;//= br.readLine();
while(isOpen){
var msg=inputStream.read();
console.log(msg);
parseData(msg);
}
// }
//地址:http://ask.dcloud.net.cn/question/60
}catch(err){
console.log("异常"+err);
}
}

附件是完整的代码:

继续阅读 »

搞了很久,终于搞出来的,但是还不是很友好,目前,js不能开启多线程,只能 一次取完了数据,就关闭socket,下次再取数据,的时候,
在开启socket 获取完了,关闭;不能一直开着socket ,不然会阻塞当前主线程,什么也干不了,有没有大神指导这种情况如何处理,怎样才能,一直开着socket ,不停地解析传过来的包,不阻塞主线程呢,我是使用dclouder连接了蓝牙设备,蓝牙发信号,然后手机接收 数据,

先是搜索:
console.log("search::isOpen="+isOpen);
if(isOpen==true) return;
main = plus.android.runtimeMainActivity();
var IntentFilter = plus.android.importClass('android.content.IntentFilter');
var BluetoothDevice = plus.android.importClass("android.bluetooth.BluetoothDevice");
console.log("开始搜索设备");
var filter = new IntentFilter();
// var bdevice = new BluetoothDevice();
var BleDevice = new BluetoothDevice();
disableBtn(true);
BAdapter.startDiscovery(); //开启搜索
var receiver;
receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
onReceive: function(context, intent) { //实现onReceiver回调函数
plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作
if(intent.getAction() == "android.bluetooth.adapter.action.DISCOVERY_FINISHED") {
main.unregisterReceiver(receiver); //取消监听
disableBtn(false);
plus.nativeUI.toast("搜索结束");
console.log("搜索结束");
} else {
BleDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if(BleDevice==null){main.unregisterReceiver(receiver); //取消监听
disableBtn(false); return;}
var name=BleDevice.getAddress()+BleDevice.getName();
if(bleArray.indexOf(name)==-1){
bleArray.push(name);
addNode(table,BleDevice.getAddress(),BleDevice.getName());
}//开始判断
var lastBLE = localStorage.getItem('lastBLE');
console.log("lastBLE::"+lastBLE);
if(lastBLE!=null&&lastBLE==BleDevice.getAddress()){
main.unregisterReceiver(receiver); //取消监听
disableBtn(false);
ConnectEqu(lastBLE);
}

                }  
            }  
        });   
        filter.addAction(BleDevice.ACTION_FOUND);  
        filter.addAction(BAdapter.ACTION_DISCOVERY_STARTED);  
        filter.addAction(BAdapter.ACTION_DISCOVERY_FINISHED);  
        filter.addAction(BAdapter.ACTION_STATE_CHANGED);  
        main.registerReceiver(receiver, filter); //注册监听   

搜索完了,开始连接蓝牙:

main = plus.android.runtimeMainActivity();  
        BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");  
        UUID = plus.android.importClass("java.util.UUID");  
        uuid = UUID.fromString(FETUS_UUID);  
        BAdapter = BluetoothAdapter.getDefaultAdapter();  
        device = BAdapter.getRemoteDevice(mac_address);  
        plus.android.importClass(device);  
        bluetoothSocket=null;  
        bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);  
        plus.android.importClass(bluetoothSocket);  
        if(!bluetoothSocket.isConnected()) {       
            bluetoothSocket.connect();  
        }             
       if(bluetoothSocket.isConnected()) {   
        isOpen=true;  
        console.log("search::isOpen="+isOpen);  
        console.log('设备已连接'); //连接成功做标记,下次直接连接  

// localStorage.setItem('lastBLE',mac_address);
// var lastBLE =localStorage.getItem('lastBLE');
// console.log("lastBLE::"+lastBLE);
var inputStream = bluetoothSocket.getInputStream();
plus.android.importClass(inputStream);
var msg =null;
try{
var msg ;//= br.readLine();
while(isOpen){
var msg=inputStream.read();
console.log(msg);
parseData(msg);
}
// }
//地址:http://ask.dcloud.net.cn/question/60
}catch(err){
console.log("异常"+err);
}
}

附件是完整的代码:

收起阅读 »

福利来了MUI完整视频教程更新中(5日内完成全部章节)

mui

使用dcloud做了一个还算不小的app项目,感觉非常不错。给大家录制了MUI的视频教程,随后将录制 H5+,APP项目开发实例教程。MUI完整视频教程更新中(5日内完成全部章节)。

视频教程观看地址:
http://www.hcoder.net/course/info_211.html

交流群:335126794

继续阅读 »

使用dcloud做了一个还算不小的app项目,感觉非常不错。给大家录制了MUI的视频教程,随后将录制 H5+,APP项目开发实例教程。MUI完整视频教程更新中(5日内完成全部章节)。

视频教程观看地址:
http://www.hcoder.net/course/info_211.html

交流群:335126794

收起阅读 »

mui的选择器,ID访问方式必须用索引值吗?

请教 mui("#pageTitle")通过ID返回的对象不唯一,必须用mui("#pageTitle")[0]访问才行,为什么??哪位能解释一下?

请教 mui("#pageTitle")通过ID返回的对象不唯一,必须用mui("#pageTitle")[0]访问才行,为什么??哪位能解释一下?

webservices接口调用

ajax js

/**

  • 调用Webservices方法,
  • methodName调用webservices方法名称,
  • paramTag提交的参数标签字符串,例参数名cmd参数值1,<cmd>1</cmd>
  • completeMethod 请求结束的回调方法
    */
    function goWebservices(methodName,paramTag,completeMethod){
    var data = getWebservicesData(methodName,paramTag);
    var webservicesUrl = getWebservicesUrl();
    //alert(data);
    mui.ajax({
    url:webservicesUrl,
    type:'POST',
    dataTyle:'xml',
    data:data,
    timeout:10000,//超时时间设置为10秒;
    complete:completeMethod,
    beforeSend:function(request){
    request.setRequestHeader('SOAPAction','')
    },
    contentType:'text/xml; charset=\"utf-8\"'
    });
    }
    /**
  • 获得webservice请求参数xml报文
  • @param {Object} functionName
  • @param {Object} paramTag
    */
    function getWebservicesData(functionName,paramTag){
    var data='<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
    data = data + '<soap:Body>';
    data = data + '<'+functionName+' xmlns="http://sh.inobido.com/">';
    data = data + paramTag;
    data = data + '</'+functionName+'>';
    data = data + '</soap:Body>';
    data = data + '</soap:Envelope>';
    return(data);
    }
继续阅读 »

/**

  • 调用Webservices方法,
  • methodName调用webservices方法名称,
  • paramTag提交的参数标签字符串,例参数名cmd参数值1,<cmd>1</cmd>
  • completeMethod 请求结束的回调方法
    */
    function goWebservices(methodName,paramTag,completeMethod){
    var data = getWebservicesData(methodName,paramTag);
    var webservicesUrl = getWebservicesUrl();
    //alert(data);
    mui.ajax({
    url:webservicesUrl,
    type:'POST',
    dataTyle:'xml',
    data:data,
    timeout:10000,//超时时间设置为10秒;
    complete:completeMethod,
    beforeSend:function(request){
    request.setRequestHeader('SOAPAction','')
    },
    contentType:'text/xml; charset=\"utf-8\"'
    });
    }
    /**
  • 获得webservice请求参数xml报文
  • @param {Object} functionName
  • @param {Object} paramTag
    */
    function getWebservicesData(functionName,paramTag){
    var data='<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
    data = data + '<soap:Body>';
    data = data + '<'+functionName+' xmlns="http://sh.inobido.com/">';
    data = data + paramTag;
    data = data + '</'+functionName+'>';
    data = data + '</soap:Body>';
    data = data + '</soap:Envelope>';
    return(data);
    }
收起阅读 »

HBuilder使用夜神安卓模拟器进行模拟器调试配置软件

真机调试

根据网友调试经验,总结,做的小软件。

HBuilder连接夜神安卓模拟器进行调试,是比较好的,因为夜神安卓模拟器比较强大,而且可以自定义硬件分配(但没感觉有什么效果( ° △ °|||)︴)。

已经修改……

根据网友调试经验,总结,做的小软件。

HBuilder连接夜神安卓模拟器进行调试,是比较好的,因为夜神安卓模拟器比较强大,而且可以自定义硬件分配(但没感觉有什么效果( ° △ °|||)︴)。

已经修改……

App store 应用审核由于 IPv6 网络问题被拒的一点分析

六月以后陆续有一些软件提交市场的时候被拒了,症状基本就是无法登陆啥的。我们公司的应用也未能幸免。

很多同学也想了不少办法,申诉、拍视频啥的都有,有人成功有人失败。但是如果苹果不能再自己的测试环境下测试成功,基本就还是要被拒的。

先分析一下情况,很多开发者抱怨自己按照苹果给出的方法,在自己电脑上搭了 IPv6 的环境测试了,没有问题,为啥一提交审核就不行了呢?这里就要看一下本机搭的这个 IPv6 环境到底是怎么回事,它到底能验证什么。

苹果提供的方法是帮我们创建一个 NAT64 的网络,这里先要搞清楚啥是 NAT64. 其实简单来说,就是这样的:

Mac 创建的 IPv6 网络
所以,手机和 Mac 之间是 IPv6 没错,但 Mac 和你的服务器之间还是 IPv4 连接。如果这项测试通过,可以说明:你的客户端应用在 IPv6 网络下,是(基本)没有问题的,但是无法验证你的服务器能够对 IPv6 网络做出正确的响应。

然而,苹果审核的时候,却是要去 DNS 服务器询问你的服务器的 IPv6 地址,然后进行访问。如果查询不到 IPv6 地址,可能会进而询问 IPv4 地址,然后进行转换使用。苹果明确表示服务器不需要支持 IPv6,但是有一点苹果没有指出来,那就是,虽然你的服务器不用支持 IPv6,但是必须正确响应 IPv6 的 DNS 查询。

如何验证呢??使用以下命令即可:

$ dig +nocmd +nostats example.com AAAA
如果返回的 status 为 NOERROR, 那基本就没什么问题,但是一定要在多个网络环境下测试都通过才行。如果返回的是其他的响应,尤其是 SERVFAIL 的情况,那就基本杯具了。由于你已经验证了客户端没有问题,现在要做的,就是催着你的运维、后台啥的,赶紧去改 DNS 配置,直到稳定返回 NOERROR 为止。
原文地址:http://www.jianshu.com/p/d18ada23f78d

继续阅读 »

六月以后陆续有一些软件提交市场的时候被拒了,症状基本就是无法登陆啥的。我们公司的应用也未能幸免。

很多同学也想了不少办法,申诉、拍视频啥的都有,有人成功有人失败。但是如果苹果不能再自己的测试环境下测试成功,基本就还是要被拒的。

先分析一下情况,很多开发者抱怨自己按照苹果给出的方法,在自己电脑上搭了 IPv6 的环境测试了,没有问题,为啥一提交审核就不行了呢?这里就要看一下本机搭的这个 IPv6 环境到底是怎么回事,它到底能验证什么。

苹果提供的方法是帮我们创建一个 NAT64 的网络,这里先要搞清楚啥是 NAT64. 其实简单来说,就是这样的:

Mac 创建的 IPv6 网络
所以,手机和 Mac 之间是 IPv6 没错,但 Mac 和你的服务器之间还是 IPv4 连接。如果这项测试通过,可以说明:你的客户端应用在 IPv6 网络下,是(基本)没有问题的,但是无法验证你的服务器能够对 IPv6 网络做出正确的响应。

然而,苹果审核的时候,却是要去 DNS 服务器询问你的服务器的 IPv6 地址,然后进行访问。如果查询不到 IPv6 地址,可能会进而询问 IPv4 地址,然后进行转换使用。苹果明确表示服务器不需要支持 IPv6,但是有一点苹果没有指出来,那就是,虽然你的服务器不用支持 IPv6,但是必须正确响应 IPv6 的 DNS 查询。

如何验证呢??使用以下命令即可:

$ dig +nocmd +nostats example.com AAAA
如果返回的 status 为 NOERROR, 那基本就没什么问题,但是一定要在多个网络环境下测试都通过才行。如果返回的是其他的响应,尤其是 SERVFAIL 的情况,那就基本杯具了。由于你已经验证了客户端没有问题,现在要做的,就是催着你的运维、后台啥的,赶紧去改 DNS 配置,直到稳定返回 NOERROR 为止。
原文地址:http://www.jianshu.com/p/d18ada23f78d

收起阅读 »

SDK 集成方式理解

SDK

我对Dcloud SDK 集成方式的理解

官网手册上提供的是三种集成方式

  1. webView 方式
  2. widget 方式
  3. 独立应用方式

其他地方还提到过, runtime 方式 和 webapp 方式,一共是5种叫法。

经过几天的学习, 梳理了不同集成方式的几个异同点。

  1. webView 方式 和 widget 方式, 需要从Android 的 Activity 中调用。
  2. 独立应用方式直接是设定为默认启动Activity, 接管了系统的Activity, 然后加载项目里的html 代码。 runtime 方式应该是这个的另一叫法。
  3. webView 方式打开的是一个浏览器组件,占用了整个屏幕,效果跟系统默认的WebView 是一样的。 通过给他指定打开的URL 地址加载相应的代码。
  4. widget 方式可以指定绑定控件,所以可以和原生应用很好的集成。
  5. 独立应用方式(runtime方式)也可以通过系统Activity 启动。

总结

  1. 概念比较多
  2. 要搞懂不同的集成方式需要了解 Android开发的基本知识
  3. 需要精简,上来就是一大棒吓的我不敢看了。
继续阅读 »

我对Dcloud SDK 集成方式的理解

官网手册上提供的是三种集成方式

  1. webView 方式
  2. widget 方式
  3. 独立应用方式

其他地方还提到过, runtime 方式 和 webapp 方式,一共是5种叫法。

经过几天的学习, 梳理了不同集成方式的几个异同点。

  1. webView 方式 和 widget 方式, 需要从Android 的 Activity 中调用。
  2. 独立应用方式直接是设定为默认启动Activity, 接管了系统的Activity, 然后加载项目里的html 代码。 runtime 方式应该是这个的另一叫法。
  3. webView 方式打开的是一个浏览器组件,占用了整个屏幕,效果跟系统默认的WebView 是一样的。 通过给他指定打开的URL 地址加载相应的代码。
  4. widget 方式可以指定绑定控件,所以可以和原生应用很好的集成。
  5. 独立应用方式(runtime方式)也可以通过系统Activity 启动。

总结

  1. 概念比较多
  2. 要搞懂不同的集成方式需要了解 Android开发的基本知识
  3. 需要精简,上来就是一大棒吓的我不敢看了。
收起阅读 »

我理解的本地打包于在线打包

本地打包

本地打包

官网列举本地打包的特点, 我总结了下

  1. 不需要排队打包, 自己的电脑随时可以打包
  2. 可定制性好, 本地打包可以定制runtime 环境,添加自己的代码,如果需要自动以插件,好像只能用本地打包。
  3. 本地打包,需要注意不要引入过多的库文件。容易造成打包出来的应用比较大。
  4. 本地打包可以根据需要引用的功能包含最少的资源库文件。 我分析他们的在线打包程序,应该是读取了manifest.json 文件,动态引入库文件。

在线打包

在线打包比较方便的解决了需要配置编译环境的问题。让没接触过的人快速打包出ios和安卓平台的安装包。

  1. 在线打包根据设定的manifest.json 文件,动态导入库文件,保证了安装包的最小化
  2. 根据manifest设定,动态生成了AndroidManifest.xml 文件内容, 设定了最小的权限

最近学习dcloud 平台, 总结了东西。 准备自己搭建一个持续集成环境,
首先,先制定一个下目标:

  1. 建立SVN资源库, 保存Android 集成SDK 的代码
  2. 建立html5 项目的SVN 资源库
  3. app项目提交, 检查manifest.json 是否改变
  4. 改变了manifest文件,需要重新编译 Android 应用(设定权限,导入库)
  5. 没有改变,生成资源包 wgt 文件和 差异资源包 wgtu
  6. 实现svn 提交代码, 系统自动编译生成资源包或者安装程序
  7. 打开程序,检查程序是否升级,自动下载安装程序 或者 升级资源包。
继续阅读 »

本地打包

官网列举本地打包的特点, 我总结了下

  1. 不需要排队打包, 自己的电脑随时可以打包
  2. 可定制性好, 本地打包可以定制runtime 环境,添加自己的代码,如果需要自动以插件,好像只能用本地打包。
  3. 本地打包,需要注意不要引入过多的库文件。容易造成打包出来的应用比较大。
  4. 本地打包可以根据需要引用的功能包含最少的资源库文件。 我分析他们的在线打包程序,应该是读取了manifest.json 文件,动态引入库文件。

在线打包

在线打包比较方便的解决了需要配置编译环境的问题。让没接触过的人快速打包出ios和安卓平台的安装包。

  1. 在线打包根据设定的manifest.json 文件,动态导入库文件,保证了安装包的最小化
  2. 根据manifest设定,动态生成了AndroidManifest.xml 文件内容, 设定了最小的权限

最近学习dcloud 平台, 总结了东西。 准备自己搭建一个持续集成环境,
首先,先制定一个下目标:

  1. 建立SVN资源库, 保存Android 集成SDK 的代码
  2. 建立html5 项目的SVN 资源库
  3. app项目提交, 检查manifest.json 是否改变
  4. 改变了manifest文件,需要重新编译 Android 应用(设定权限,导入库)
  5. 没有改变,生成资源包 wgt 文件和 差异资源包 wgtu
  6. 实现svn 提交代码, 系统自动编译生成资源包或者安装程序
  7. 打开程序,检查程序是否升级,自动下载安装程序 或者 升级资源包。
收起阅读 »

tap一下会触发两次事件

mui

最后发现问题是:引用了两次mui.min.js

最后发现问题是:引用了两次mui.min.js

【示例】mui.ajax()方法中的XMLHttpRequest

跨域请求 AJAX跨域 ajax 跨域 HTML5+ XMLHttpRequest mui 技术分享

XMLHttpRequest和AJAX

XMLHttpRequest(以下简称为“XHR”)中文可以解释为“可扩展超文本传输请求”,Xml可扩展标记语言,Http超文本传输协议,Request请求。XMLHttpRequest对象是“异步JavaScript和XML”(Asynchronous Javascript And XML)——AJAX实现的核心。

mui.ajax()中的XHR

mui.ajax()中的XHR对象有两种:
window.XMLHttpRequest
5+XMLHttpRequest

异步/同步

AJAX最大的优点就是异步,但是在某些情况下依旧需要进行同步的请求。window的XHR是支持同步的,但是5+的XHR并不支持。也就是说,当使用window的XHR时,可以通过设置async属性来调整异步/同步。

mui.ajax({  
    url: 'http://192.168.0.101:8080/test'  
    data: {},  
    async: true || false, // 异步 || 同步  
    dataType: 'json',  
    type: 'post',  
    timeout: 10000,  
    success: function(data) {  
        // 请求成功  
    },  
    error: function(xhr, type, errorThrown) {  
        // 请求失败  
    }  
});  

关于mui.ajax()的使用,在其API中已经做出了较为全面的说明,这里主要说明mui.ajax()对两种XHR在不同场景下的使用。

5+运行环境

在5+运行环境下,才可以调用plus相关的API,可以使用5+的XHR。
5+运行环境目前有:5+App、流应用基座、360手机助手。

crossDomain

mui.ajax()配置信息的settings中有个参数crossDomain,说明为“强制使用5+跨域”,此时使用5+的XHR

mui.ajax({  
    url: 'http://192.168.0.101:8080/test'  
    data: {},  
    async: true,  
    dataType: 'json',  
    crossDomain: true, //强制使用5+跨域  
    type: 'post',  
    timeout: 10000,  
    success: function(data) {  
        // 请求成功  
    },  
    error: function(xhr, type, errorThrown) {  
        // 请求失败  
    }  
});  

跨域请求

5+默认采用UIWebview,是支持本地资源跨域请求的。即,此时会调用window的XHR。
当然,你也可以设置crossDomain为true,强制使用5+XHR。

WKWebview

5+的webview在创建的时候,可以设置窗口使用的内核,但是只能在iOS8.0及以上系统中使用。
WKWebview出于安全的设计,不支持window的XHR跨域。所以当使用WKWebview时,始终调用5+的XHR

其他

除了上述提到的场景,mui.ajax()均会调用window的XHR

手机浏览器环境

浏览器环境,一定使用的是window的XHR。
关于微信等浏览器环境开发中的跨域,请参考mui.getJSONP()实现Web跨域

继续阅读 »

XMLHttpRequest和AJAX

XMLHttpRequest(以下简称为“XHR”)中文可以解释为“可扩展超文本传输请求”,Xml可扩展标记语言,Http超文本传输协议,Request请求。XMLHttpRequest对象是“异步JavaScript和XML”(Asynchronous Javascript And XML)——AJAX实现的核心。

mui.ajax()中的XHR

mui.ajax()中的XHR对象有两种:
window.XMLHttpRequest
5+XMLHttpRequest

异步/同步

AJAX最大的优点就是异步,但是在某些情况下依旧需要进行同步的请求。window的XHR是支持同步的,但是5+的XHR并不支持。也就是说,当使用window的XHR时,可以通过设置async属性来调整异步/同步。

mui.ajax({  
    url: 'http://192.168.0.101:8080/test'  
    data: {},  
    async: true || false, // 异步 || 同步  
    dataType: 'json',  
    type: 'post',  
    timeout: 10000,  
    success: function(data) {  
        // 请求成功  
    },  
    error: function(xhr, type, errorThrown) {  
        // 请求失败  
    }  
});  

关于mui.ajax()的使用,在其API中已经做出了较为全面的说明,这里主要说明mui.ajax()对两种XHR在不同场景下的使用。

5+运行环境

在5+运行环境下,才可以调用plus相关的API,可以使用5+的XHR。
5+运行环境目前有:5+App、流应用基座、360手机助手。

crossDomain

mui.ajax()配置信息的settings中有个参数crossDomain,说明为“强制使用5+跨域”,此时使用5+的XHR

mui.ajax({  
    url: 'http://192.168.0.101:8080/test'  
    data: {},  
    async: true,  
    dataType: 'json',  
    crossDomain: true, //强制使用5+跨域  
    type: 'post',  
    timeout: 10000,  
    success: function(data) {  
        // 请求成功  
    },  
    error: function(xhr, type, errorThrown) {  
        // 请求失败  
    }  
});  

跨域请求

5+默认采用UIWebview,是支持本地资源跨域请求的。即,此时会调用window的XHR。
当然,你也可以设置crossDomain为true,强制使用5+XHR。

WKWebview

5+的webview在创建的时候,可以设置窗口使用的内核,但是只能在iOS8.0及以上系统中使用。
WKWebview出于安全的设计,不支持window的XHR跨域。所以当使用WKWebview时,始终调用5+的XHR

其他

除了上述提到的场景,mui.ajax()均会调用window的XHR

手机浏览器环境

浏览器环境,一定使用的是window的XHR。
关于微信等浏览器环境开发中的跨域,请参考mui.getJSONP()实现Web跨域

收起阅读 »

关闭键盘的方法

document.activeElement.blur();
遇到了键盘关闭的问题,在mui里找了好久都没有解决,最后百度解决了!

document.activeElement.blur();
遇到了键盘关闭的问题,在mui里找了好久都没有解决,最后百度解决了!