关键词:webrtc数据回调机制,webrtc传图片机制,php比较字符串
一、webrtc
1.1 梳理老师回放代码
1)首先有一个按钮,用于新建白板,如下:
<buttonid="btn-getDataURL1" style="width:220px;font-size:36px;">新建白板</button></span>
2)这个按钮有一个单击事件:
$('#btn-getDataURL1').click( function(){
arr_base64_img_i =$("#picWrap").children().length;
saveCanvas(globelId);
designer.undo('all');
globelId = null;
});
单击会执行一个函数,第一句:
a) arr_base64_img_i= $("#picWrap").children().length;
这一句:计算放回放图片的div内已经放了几张图片。
注:会看到两个问题,一是窗口记录不连续:0,1,2,4,5,6,7,8;二是出现了很多空白页。
b) saveCanvas(globelId)(2-1);
这一句调用一个函数,作用是保存图像到下方。
c) designer.undo('all');
这一句用于清空白板,就是说,老师写完一板,保存到下方之后,要清空白板。
d)globelId=null;
这一句,置变量globelId为空。
3)在 2)中调用了一个函数saveCanvas(globelId)(函数2-1),代码如下:
function saveCanvas(imgId){
designer.saveImg('image/png',imgId,function(dataURL,imgId) {
getArrBase64(dataURL,imgId);
$(".tea_base64").off("click");
$(".tea_base64").on("click",onImgClick);
});
}
这个函数需要传入一个参数imgId:
a) designer.saveImg('image/png',imgId,function(dataURL,imgId) {
这一句调用了一个函数designer.saveImg()(函数3-1),用于保存图像。
b) getArrBase64(dataURL,imgId);
在a)中调用了另一个函数getArrBase64()(函数3-2),用于获取一个图片的base64位码。
c) $(".tea_base64").off("click");
这一句的作用是:解绑click事件。
d) $(".tea_base64").on("click",onImgClick);
这一句的作用是,给类.tea_base64绑定click事件,并且调用一个函数onImgClick(函数3-3)。
4)在3)中,引入了三个函数designer.saveImg()(函数3-1)、getArrBase64()(函数3-2)、onImgClick(函数3-3),分别分析:
4-1) designer.saveImg()
designer.saveImg= function(format,imgId,callback) {
saveImgListener = callback;
if (!designer.iframe) return;
designer.postMessage({
saveImg: true,
format: format,
imgId:imgId
});
};
这个函数需要传三个参数format,imgId,callback:
a)saveImgListener = callback;
这一句用于回传。
b)if (!designer.iframe) return;
这一句说明,如果designer.iframe(函数4-1-1)不成立,就返回。
c) designer.postMessage({(函数4-1-2)
这一句是webrtc中用于消息传递,它需要三个参数saveImg,format,imgId,应对其分别设置。
4-2) getArrBase64()
function getArrBase64(dataURL,imgId) {
if(imgId!= null && $("#arr_base64_img"+imgId).length>0){
$("#arr_base64_img"+imgId).attr("src", dataURL);
}else{
varpicWrap=document.getElementById('picWrap');
picWrap.innerHTML+=' <img id= "arr_base64_img'+arr_base64_img_i+'"class="tea_base64" style=" border:1pxsolid red; width:100px; height:150px;" src="'+dataURL +'"'+"<br>";
}
};
这个函数getArrBase64需要两个参数:dataURL及imgId:
a) if(imgId != null &&$("#arr_base64_img"+imgId).length>0){
$("#arr_base64_img"+imgId).attr("src", dataURL);
}
这个判断是说如果imgId非空,并且图片id存在,就把执行if里面的内容,这一句话是说:如果老师点下面的回放图片,修改之后,点保存的话,图像id存在,就替换原来的那张图片。里面的语句,就是替换原有的dataURL,.attr就是返回标签属性,本程序中,就是把dataURL赋给属性src.
b) else{
varpicWrap=document.getElementById('picWrap');
picWrap.innerHTML+=' <img id= "arr_base64_img'+arr_base64_img_i+'"class="tea_base64" style=" border:1pxsolid red; width:100px; height:150px;" src="'+dataURL +'"'+"<br>";
}
上述几句话是说:如果老师保存的图像id不存在,就追加到后面去。
4-3) onImgClick()
function onImgClick(){
if(globelId == null){
arr_base64_img_i =$("#picWrap").children().length;
}
saveCanvas(globelId);
designer.undo('all');
globelId = this.id.substr(14);
designer.addImgByUrl(this.src,true);
}
a) if(globelId == null){
arr_base64_img_i =$("#picWrap").children().length;
}
如果globelId为空,则会重新计算arr_base64_img_i的长度,这是导致arr_base64_img_i不存在的原因。
b) saveCanvas(globelId);
保存图像
c) globelId = this.id.substr(14);
通过截取的方式,获得globelId的值。
d) designer.addImgByUrl(this.src,true);
调用函数designer.addImgByUrl()(函数4-3-1),用于把下面的回放图片展示到白板上。
这个函数onImgClick()的作用是,点击下面的图像,会先保存白板上的内容到一个新的图像。
5) 在4中),用到了三个函数designer.iframe(函数4-1-1)、designer.postMessage({(函数4-1-2)、designer.addImgByUrl()(函数4-3-1),分别进行分析如下:
5-1)designer.iframe
designer.iframe= document.createElement('iframe');
这个好像是一个变量,具体作用还不明了。
5-2)designer.postMessage
designer.postMessage = function(message) {
if (!designer.iframe) return;
message.uid = designer.uid;
designer.iframe.contentWindow.postMessage(message,'*');
};
这个函数用于传递消息,用于消息回传。
5-3)designer.addImgByUrl()
designer.addImgByUrl =function(url,restore){
if (!designer.iframe) return;
designer.postMessage({
addImgByUrl: true,
url: url,
restore :restore?restore:false
});
}
这个函数用于把base64位码,放到白板上。
1.2 把老师回放代码放到正式服上并对bug进行调试,增加理解
bug1:放到正式服上,arr_base64_img_i为空。
结果:
这一步是对的,因为在本地测,也没值,本来,当时div中的,还没生成图片,不可能有值。
bug2:
这两个警告没有弹出来,在本地就能弹出来。说明函数designer.saveImg()出错了。
imgId没有传进去:在widget.min.js中加入如下程序段:
另外:canvas-designer-widget.js中两个地方也需要改 一下:
二、php
2.1 比较字符串
1)strcmp()
两个字符串进行比较,如果字符串1和字符串2相等,则返回0;
如果字符串1<字符串2,则返回-1;
如果字符串1>字符串2,则返回1;
看个例子:
注:就是说如果字符串1,仅是长度小于字符串2,则返回-1;如果能从前到后比较出字符串1比字符串2小多少个,则返回具体的数目。要想比较时不区分大小写,可以用strcasecmp()进行比较。要想按自然数进行比较,可以用strnatcmp().
2) strncmp()
这个函数主要对数据进行比较,并且可以指定比较的位数,看个例子:
注:可以用于数据,也可以用于字符串进行比较。
3)similar_text()
比较两个字符串的相似度,看个例子:
注:它会比较两个字符串中,相同的字母有几个。这个函数可以有最三个参数$v,它会返回两个字符串相似度的百分比。看个例子:
上述字符串:baidu和baiDu都有5个字符,有4个字符是一样的,所以有80%的相似度。
2016年10月26日星期三