【功能介绍】

类似与修改个人信息的时候,点击头像,就可以完成选择照片、上传照片等步骤达到替换头像的目的。

【运行流程】

(1)点击头像

(2)选择头像

(3)点击“完成”,上传头像

1.HTML图片部分的代码(个人信息还会包含姓名[id="name"]、介绍[id="intro"]元素等)

<div>
<img id="avatar"ng-src="{{avatar}}" ng-click="choosePicMenu()">
</div>
<input ng-hide="true" type="file" id="photoBtn" accept="image/*"onchange="picChange(event,'avatar')"/>

2.js核心代码

(1)选择图片

//点击图片,向id=“photoBtn”的元素发送click()事件,打开文件选择窗口,选择图片
$scope.choosePicMenu = function() {
$('#photoBtn').click();
}
//选择完图片之后,该input元素发生了change,激活onchange属性,执行picChange(event,'avatar')函数
//其中event指这个onchange事件,event.target指发生这个事件的元素,关于event更多介绍,请点:传送门
function picChange(event,imgId){
var files = event.target.files;
if(files && files.length >= 1){
var file = files[0];
     //loadImage是javaScript插件javascript-load-image(传送门)中的功能
loadImage.parseMetaData(
file,
function (data) {
if (!data.imageHead) {
loadImage(
file,
function (img) {
var URL = window.URL || window.webkitURL;
var imgURL = img.toDataURL("image/png");
$('#'+imgId).attr('src', imgURL);
$('#' + imgId).attr('data-change', 1);
},
{maxWidth: 600,
canvas: true} // Options
);
return;
}
// Combine data.imageHead with the image body of a resized file
// to create scaled images with the original image meta data, e.g.:
// get orietation info.
if (data.exif && data.exif[0x0112]) {
var orientation = data.exif[0x0112];
loadImage(
file,
function (img) {
var URL = window.URL || window.webkitURL;
var imgURL = img.toDataURL("image/png");
$('#'+imgId).attr('src', imgURL);
$('#' + imgId).attr('data-change', 1);
},
{maxWidth: 600,
canvas: true,
orientation:orientation} // Options
);
} else {
loadImage(
file,
function (img) {
var URL = window.URL || window.webkitURL;
var imgURL = img.toDataURL("image/png");
$('#'+imgId).attr('src', imgURL);
$('#' + imgId).attr('data-change', 1);
},
{maxWidth: 600,
canvas: true} // Options
);
}
}
);
}
}

(2)上传图片

//新建一个FormData对象
var fd = new FormData();
//如果修改了图像,id=“avatar”的元素的“data-change”属性会为true
if($('#avatar').attr('data-change')){
var files = document.getElementById('photoBtn').files;
if(files && files.length >= 1){
fd.append('ffile',files[0]);//把图像添加到formData对象中
}
}
//获取姓名、介绍等其他元素
var name = $('#name').val();
var intro = $('#intro').val();
if(name){
fd.append('name',name);
}
if(intro){
fd.append('introduction',intro);
}
//使用XMLHttpRequest对象发送请求
var xhr = new XMLHttpRequest();
xhr.addEventListener("load", $scope.updateComplete, false);
xhr.open("POST", "some url");
xhr.send(fd);
$scope.updateComplete = function(evt){
var resp = evt.target.responseText;
var respJson = $.parseJSON(resp);
if(respJson.status == 0){
console.log("success!");
}else{
console.log("fail");
}
};

ZH奶酪:AngularJS/JavaScript上传图片【PC端】的更多相关文章

  1. ZH奶酪:JavaScript调用AngularJS的函数/$scope/变量

    使用背景: 需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过co ...

  2. ZH奶酪:PHP上传图片三个步骤

    1. 上传图片三步骤 第一步:首先判断文件类型是否为图片格式,若是则上传文件; 第二步:然后重命名文件(一般都是避免上传文件重名,现在基本上都是以为时间来命名); 第三步:最后把文件上传到指定目录,成 ...

  3. ZH奶酪:JavaScript中的JSON.stringify() and JSON.parse()

    JSON.stringify() JSON.stringify()可以将任意的JavaScript值序列化成JSON字符串. 语法 JSON.stringify(value[, replacer [, ...

  4. ZH奶酪:JavaScript清空数组的三种方法

    参考链接:http://snandy.iteye.com/blog/893955 方式1,length赋值为0 目前 Prototype中数组的 clear 方法和mootools库中数组的 empt ...

  5. JavaScript判断移动端及pc端访问不同的网站

    JavaScript判断移动端及pc端访问不同的网站 现在很多网站都是分为两个版本,一个pc端的一个移动端的(响应式除外),针对这两个版本,就需要对访问的设备进行判断,如果是pc,就直接访问pc网站, ...

  6. 【Javascript Demo】移动端访问PC端网页时跳转到对应的移动端网页

    不想通过CSS自适应在PC端和移动端分别显示不同的样式,那么只能通过在移动端访问PC端网页时跳转到对应的移动端网页了,那么怎么跳转呢,网上也有很多文章说明,下面是本人测试有效的方式. 1.效果图 PC ...

  7. vue封装原生的可预览裁剪上传图片插件H5,PC端都可以使用

    思路:1.先做出一个上传的图片的上传区 <!-- 上传区 --> <label for="fileUp"> <div class="upBo ...

  8. javascript检测客户端环境是否是pc端

    //isPC(): 检测客户端环境是否是pc端 function isPC(){ let userAgent = navigator.userAgent; let agents = ["An ...

  9. ZH奶酪:IBG项目工作内容

    IBG项目技术概览 (HTML/CSS/JavaScript/AngularJS/PHP/MySQL): (1)后台:PHP Yii2.0 Framework (2)前端:Ionic Framewor ...

随机推荐

  1. lodash用法系列(6),函数种种

    Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...

  2. iOS 7.1 系统可以设置 button shapes,此功能可让按钮多一条下滑线

    IniOS 7, Apple completely revamped the user interface to give it a fresh and modern look. One of the ...

  3. C#编程(四十八)----------列表

    C#中的List C#中deList怎么样?List<T>类是ArrayList类的泛型等效类,该类使用大小可按需动态增长的数组实现List<T>泛型接口. 泛型的好处:它为使 ...

  4. 在Android.mk文件中输出打印消息

    http://www.xuebuyuan.com/1947880.html 在进行Android NDK的开发当中有时想看看Android.mk文件当中某个变量的值,可以再Android.mk文件当中 ...

  5. Wireshark基本用法 && 过滤规则 && 协议详解

    基本使用: https://www.cnblogs.com/dragonir/p/6219541.html 协议解析: https://www.jianshu.com/p/a384b8e32b67 ( ...

  6. ack-grep 代码全文搜索

    安装 ubuntu下要安装ack-grep,因为在debian系中,ack这个名字被其他的软件占用了. sudo apt-get install ack-grep 特点 大家都说自己的东西好,因此ac ...

  7. TeXLive里面集成了CTeX,Lyx是一个编辑软件

    TeXLive里面集成了CTeX,LaTeX是排版引擎,CTeX和TeXLive是发行版.LaTeX是毛坯房,CTeX和TeX Live是带精装的房子.CTeX 套装是一个个人作品,存在很多问题.这些 ...

  8. C#与Java的语法差异

    C#与Java的语法差异C与Java的语法差异前言程序结构基本语法数据类型字符串变量与常量运算符判断语句循环语句访问权限方法数组结构枚举类继承多态运算符重载接口命名空间预处理器指令正则表达式异常IO泛 ...

  9. react-router的browserHistory/react-router-dom的BrowserRouter刷新页面404问题解决

    前端解决: '/' 表示把所有的url都发给代理https://api.example.com bypass 表示不需要发给发给代理服务器的条件 如下配置,可以监听https://api.exampl ...

  10. NOI 2015 Bless All!

    明天day1,加油!RP++! (话说出题人貌似是dyf&lyd?好虚啊……