jq mobile作为一个web开发手机app的框架,打包后的apk,其实就是在手机上模拟一个简易的浏览器,然后进行js操作,在没有服务器端脚本语言的支持下,如何传递参数呢?
很明显,这就要依靠jquery mobile来获取了。
在$(document).bind('pagebeforechange',function(e,data){... ... });事件里面:
$(document).bind('pagebeforechange',function(e,data){ if (typeof data.toPage !== "string"){//这个事件会调用两次,但每次的data内容不一样,所以要判断 return; } var urlObj = $.mobile.path.parseUrl(/blog_article/data.toPage);//取到一个对象 var paramStr = urlObj.search;//对象中的参数,格式为 例: ?id=34&key=perfect&action=go });还要处理这个取到的参数,笔者想用诸如serialize,unserialize之类的函数进行处理,可惜都没有找到合适的;于是自己写了个函数来处理:
function getUrlParam(string) { var obj = {}; if (string.indexOf("?") != -1) { var string = string.substr(string.indexOf("?") + 1); var strs = string.split("&"); for(var i = 0; i < strs.length; i ++) { var tempArr = strs[i].split("="); obj[tempArr[0]] = unescape(tempArr[1]); } } return obj; }
于是第一处的代码可以这样处理:
$(document).bind('pagebeforechange',function(e,data){ if (typeof data.toPage !== "string"){ return; } var paramUrl = $.mobile.path.parseUrl(/blog_article/data.toPage); var params = getUrlParam(paramUrl.search); }); function getUrlParam(string) { var obj = {}; if (string.indexOf("?") != -1) { var string = string.substr(string.indexOf("?") + 1); var strs = string.split("&"); for(var i = 0; i < strs.length; i ++) { var tempArr = strs[i].split("="); obj[tempArr[0]] = unescape(tempArr[1]); } } return obj; }
Xcode换到了4.2 或是4.5遇到了一些问题,之前的代码很多都不能运行,提示如标题所示的错误,在国外论坛上给出了解决办法,如下:
PS:有时API的文档的示例是组件来的,不是工程文件来的
Matroska 开源多媒体容器标准。MKV属于其中的一部分。
Matroska常见的有.MKV视频格式、MKA音频格式、.MKS字幕格式、.MK3D files (stereoscopic/3D video).
MKV是建立在EBML这种语言的基础上,所以要了解MKV格式需要先了解EBML这种语言。
EBML是一种类似于XML格式的可扩展二进制元语言,使用可变长度的整数存储,以节省空间。
EBML基本元素结构:
typedef struct { vint ID // EBML-ID vint size // size of element char[size] data // data } EBML_ELEMENT;
ID标志属性类型
size为后面data部分的大小
data部分为ID所标识属性的实际数据
上面可以看到ID和size的类型都是vint,vint(Unsigned Integer Values of Variable Length)可变长度无符号整型,比传统32/64位整型更加节省空间。
长度计算方法为
长度 = 1 +整数前缀0比特的个数.
从MKV文件中简单接一段来举个例子。这是16进制表示方式
因为每个EBML元素都是由ID size data 三部分组成,我们就按照这些来分析。
将0x428 转成2进制 为 01000010 按照上面规则 前面有1个0 所以知道ID的长度为2,也就是0x4282为ID值。
将0x88 转成2进制为 10001000 1为开头 长度就是1,去掉前缀1变成了00001000 ,也就是 size的值为 8.
接下来的8个字节就是data值:6D 61 74 72 6F 73 6B 61 根据上面ID值查表得知 这个EMBL 名称为DocType 也就是说data的内容是string格式,所以转成askII码 data值就是“matroska” 和后面显示的一致。
所以这个EBML元素就解析出来了
ID=0x4282;
size=8;
data=“matroska” ;
得到的信息就是 DocType = matroska。
让我们看看MKV的整体框架结构。
Level 0 Grouping Level 1 Level 2 Level 3 EBML Header EBMLVersion DocType Segment Meta Seek Information SeekHead Seek SeekID SeekPosition Seek SeekID SeekPosition Segment Information Info Title SegmentUID Track Tracks TrackEntry Name TrackNumber TrackType TrackEntry Name TrackNumber TrackType Chapters Chapters Edition Entry Clusters Cluster Timecode BlockGroup Block BlockGroup Block ReferenceBlock BlockGroup Block Cluster Timecode BlockGroup Block BlockGroup Block BlockGroup Block BlockGroup Block BlockDuration Cueing Data Cues CuePoint CueTime CuePosition CuePoint CueTime CuePosition Attachment Attachments AttachedFile FileName FileData AttachedFile FileName FileData Tagging Tags Tag MultiTitle Language Tag MultiTitle Language EBML元素都有自己的级别,每一个高一级的元素由若干次一级的元素组成。
从整个MKV文件整体来看可分为2大部分:
EBML Header和Segment。
EBML Header由EBMLVersion、DocType等子元素组成,包含了文件的版本、文档类型等相关信息。
Segment部分保存了媒体文件的视频和音频的实际数据,其data部分又可以分为SeekHead、Tracks、Cluster等若干子元素。
未完待续!