首先感谢http://www.htmleaf.com/Demo/201504211717.html这款插件。

   使用之初,对于插件的结构很是糊涂,首先文件的核心是cropper.js,其次才是mian.js算是一个功能丰富的demo,其中文件包中也有example里边也是不错的demo,含有图片的上传与裁剪,以及裁剪后的上传(example的demo中这是重点,文件中的crop.php演示环境,导致没有搞懂上传,不知道提交的demo是否正确。这也是下来极重要解决的。)

  ①首先配置的是一系列属性,文件的裁剪配置,

    aspectRatio: NaN,  //是自由裁剪还是按照比例16/9(等比例)
    preview: '.img-preview',  //截图时的预览模式

    autoCropArea:0.5,  //定义时初始化时截图框的百分比,大于0小于1的小数。百分数不行

    zoomable: false,  //设置截图的时候是否图片可以由鼠标滑轮缩放 /2016/1/11

    (这部分也只是了解了项目中需要修改的部分,具体在demo中调试)

  ②其次,最重要的是保存替换当前图片为截图,在项目实际情况中的需求是,对商品的图片裁剪后直接生效,就需要讲裁剪的图片保存起来,并且替换当前的,<img 的src的url。由于crop.php没有环境配置,不知道其中的保存原理。

于是联想到main.js中的getCroppedCanvas按钮,该按钮是获得了裁剪后的图片的。但是这个裁剪是一个canvas,就需要学习canvas的图片的保存方式。通过查看,发现保存的关键在main.js中的result = $image.cropper(data.method, data.option);上。通过

alert(result ),发现result是一个HTMLCanvasElement,最后通过学习,HTMLCanvasElementHTMLCanvasElement.toDataURL()能够返回canvas中的image的src.url。具体学习https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement

这样得到的url其实是该图片的base64编码字符串,可以前台通过js处理,也可以传给后台,提交服务器保存的时候让后台python或者java处理。

以下是本渣渣的部分代码,截图实在弹出的模态框种实现的:模态框id="edit-pic-modal"

  

 $(".edit-pic").click(function(){
var edit_modal = $("#edit-pic-modal"),
this_img = $(this).closest(".thumbnail").find("img");
if(this_img.attr("src")!="/static/image/add.png"){
var pic_link = $(this).closest(".thumbnail").find("img").attr("src")
//var pic = $(this).closest(".thumbnail").find("img")
$("#edit-img-content").html("");
var image_content = $("#edit-img-content");
var div=$("<div/>").attr("class","col-md-12");
var img_html_str="<div class='thumbnail img-container'>"
+"<img src='" + pic_link + "' class='image img-responsive'>"
+"</div>";
div.html(img_html_str).appendTo(image_content);
edit_modal.modal("show");
var $image = $('.img-container > img'),
$dataX = $('#dataX'),
$dataY = $('#dataY'),
$dataHeight = $('#dataHeight'),
$dataWidth = $('#dataWidth'),
$dataRotate = $('#dataRotate'),
options = {
aspectRatio: NaN,
preview: '.img-preview',
crop: function (data) {
$dataX.val(Math.round(data.x));
$dataY.val(Math.round(data.y));
$dataHeight.val(Math.round(data.height));
$dataWidth.val(Math.round(data.width));
$dataRotate.val(Math.round(data.rotate));
}
};
$image.on({
'build.cropper': function (e) {
console.log(e.type);
},
'built.cropper': function (e) {
console.log(e.type);
},
'dragstart.cropper': function (e) {
console.log(e.type, e.dragType);
},
'dragmove.cropper': function (e) {
console.log(e.type, e.dragType);
},
'dragend.cropper': function (e) {
console.log(e.type, e.dragType);
},
'zoomin.cropper': function (e) {
console.log(e.type);
},
'zoomout.cropper': function (e) {
console.log(e.type);
}
}).cropper(options); // Methods
$(document.body).on('click', '[data-method]', function () {
var data = $(this).data(),
$target,
result; if (data.method) {
data = $.extend({}, data); // Clone a new one if (typeof data.target !== 'undefined') {
$target = $(data.target);
if (typeof data.option === 'undefined') {
try {
data.option = JSON.parse($target.val());
} catch (e) {
console.log(e.message+"one");
}
}
} result = $image.cropper(data.method, data.option);//$image的内容没有变化
var res = result.toDataURL("image/png").split(",");
if (data.method === 'getCroppedCanvas') {
//alert("s=="+$('#getCroppedCanvasModal').modal().find('.modal-body').html(result).toDataURL("image/png"));
$.ajax({
"type": "POST",
"url": "/picture/"+shop_id+"/upload/base",
"dataType": "json",
"data": {
"filedata": res[res.length-1]
},
"success":function(data){
if(data.status == 1) {
edit_modal.modal("hide");
this_img.attr("src",data.url);
}else{ }
},
"error": function(){
console.log("there is some error happened while editing.");
}
})
} if ($.isPlainObject(result) && $target) {
try {
$target.val(JSON.stringify(result));
} catch (e) {
console.log(e.message + "two");
}
} }
}).on('keydown', function (e) { switch (e.which) {
case 37:
e.preventDefault();
$image.cropper('move', -1, 0);
break; case 38:
e.preventDefault();
$image.cropper('move', 0, -1);
break; case 39:
e.preventDefault();
$image.cropper('move', 1, 0);
break; case 40:
e.preventDefault();
$image.cropper('move', 0, 1);
break;
}
}); }else{
return 0;
}
});

当然代码太长,太渣,高手估计50行足以,才外还有的bug就是,点击第一次$(".edit-pic").click(function()还算是ok,当第二次点击的时候会报错:

 ② 2016/1/09修正了第二次点击错误 就是上段代码第78行提示的:

var res = result.toDataURL("image/png").split(",");  toDataURL is not function的问题,主要原因是调试发现$image的对象再次编辑的时候没有变化,刚还是第一次的内容,导致canvas没有刷新(问题描述可能不太准确,但是就是$image的问题).

解决方法:在77,78行将$image重新取值更新一下,或者如下
  var $new_image = $('.img-container > img');
  var result = $new_image.cropper(data.method, data.option); //一下是在系统实际应用中出现的另外的问题
③修正每次编辑完,其他图片也跟正变化的问题,
  原因:系统中的模态框的提交按钮没有提交后没有解绑click事件,导致每次编辑后,同一个模态框绑定了多了一次,原来的url自然就被后边的更新了,也让我认识到了unbind()函数的作用;
  解决方法:每次执行
    $("#edit-pic-modal").find('[data-method="getCroppedCanvas"]').unbind().on('click', function () {
  的时候先进行解绑事件

  

  

jquery截图插件的使用的更多相关文章

  1. 基于 jQuery Jcrop 插件的功能模块:头像剪裁

    /** Jcrop version: 0.9.12 jQuery version: 1.9.0 Author: 小dee Date: 2014.10.30 */ 先看看他山之石:博客园的头像模块也是使 ...

  2. 如果你只会JQuery的插件式开发, 那么你可以进来看看?

    对于JQuery的学习,已经有3年多的时间了,直到去年与我的组长一起做项目,看到他写的JS,确实特别漂亮,有时甚至还看不太懂, 我才发现其实我不太会JQuery.所以我有时间就会去看看他写的JS代码, ...

  3. JQuery的插件式开发

    如果你只会JQuery的插件式开发, 那么你可以进来看看? 对于JQuery的学习,已经有3年多的时间了,直到去年与我的组长一起做项目,看到他写的JS,确实特别漂亮,有时甚至还看不太懂, 我才发现其实 ...

  4. 分享在MVC3.0中使用jQuery DataTable 插件

    前不久在网络上看见一个很不错的jQuery的DataTable表格插件.后来发现在MVC中使用该插件的文章并不多.本文将介绍在MVC3.0如何使用该插件.在介绍该插件之前先简单介绍一下,推荐该插件的原 ...

  5. jquery编写插件(转)

    教你开发jQuery插件(转)   阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原 ...

  6. 深入学习jQuery自定义插件

    原文地址:jQuery自定义插件学习 1.定义插件的方法 对象级别的插件扩展,即为jQuery类的实例增加方法, 调用:$(选择器).函数名(参数);      $(‘#id’).myPlugin(o ...

  7. [jQuery]jQuery DataTables插件自定义Ajax分页实现

    前言 昨天在博客园的博问上帮一位园友解决了一个问题,我觉得有必要记录一下,万一有人也遇上了呢. 问题描述 园友是做前端的,产品经理要求他使用jQuery DataTables插件显示一个列表,要实现分 ...

  8. 使用jQuery.form插件,实现完美的表单异步提交

    传送门:异步编程系列目录…… 时间真快,转眼一个月快结束了,一个月没写博客了!手开始生了,怎么开始呢…… 示例下载:使用jQuery.form插件,实现完美的表单异步提交.rar 月份的尾巴,今天的主 ...

  9. 为jQuery写插件

    很多场合,我们都会调用jQuery的插件去完成某个功能,比如slider. 如下图,做一个div,通过“$( "#slider" ).slider();”的方式直接将div变成sl ...

随机推荐

  1. papi酱视频因违规遭下线整改,你知道原因吗?

    今日4月18日,在微信上的一篇<papi酱遭广电总局封杀 罗振宇1200万恐打水漂>的文章迅速转了起来,说的就是现在网红第一人“papi酱”的视频被广电总局责令下架的消息.箭头直指papi ...

  2. 如何在Rails中执行Get/Post/Put请求

    require 'open-uri' require 'json' require 'net/http' class CoupleController < ApplicationControll ...

  3. JBoss和Tomcat版本、及Servlet、JSP规范版本对应一览 【转】

    原文地址:http://blog.csdn.net/hills/article/details/40896357 JBoss和Tomcat版本.及Servlet.JSP规范版本对应一览 JBossAS ...

  4. jq 获取除节假日与周六日 外的日期 和 星期

    //设置节假日的数组         var holiday = Array('2016-04-30','2016-05-01','2016-05-02','2016-06-09','2016-06- ...

  5. scala在linux以及在windows的安装,以及在IDEA中新建Scala项目

    一:linux下配资scala 1.上传 2.解压 3.配置环境 4.source一下 5.启动和简单使用 6.输出语句 二:scalac的使用 1.新建文件测试目录 2.新建程序 3.文件编译器书写 ...

  6. java程序中调用Linux命令Windows命令

    目前总结的方法: 调用Linux简单的命令行,设置文件夹权限755 String scriptDir = "/home/wenf"; String cmd = "chmo ...

  7. EBS R12.2应用层启动脚本的执行过程

    $ pwd /app/oracle/apps/VIS/fs1/inst/apps/VIS_erptest/admin/scripts $ ./adstrtal.sh apps/apps You are ...

  8. SQL Server错误与事务处理

    T-SQL中出现的错误,依据和事务的关系,可以分为两种情况: 有的错误会导致发生错误位置之后的代码不再执行,如果错误位置在事务中,该事务也会自动回滚(即在错误位置之后的rollback语句不会执行,但 ...

  9. 20145320《Java程序设计》第3周学习总结

    20145320<Java程序设计>第3周学习总结(第四章) 教材学习内容总结 对象(Object):存在的具体实体,具有明确的状态和行为 类(Class):具有相同属性和行为的一组对象的 ...

  10. datatable动态添加,及填充数据

    DataTable tblDatas = new DataTable("Datas"); tblDatas.Columns.Add("ID", Type.Get ...