原生javascript上傳圖片帶進(jìn)度條【實(shí)例分享】
更新時(shí)間:2017年04月06日 15:34:24 作者:DarkNight
本文主要介紹了原生javascript上傳圖片帶進(jìn)度條的實(shí)例詳解。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
javascript代碼:
;
(function(w) {
var error = "上傳控件不支持您的瀏覽器!";
// 構(gòu)造函數(shù)
function UploadImg(option) {
$u = this;
$u.option = option;
$u.init($u.option);
}
UploadImg.prototype = {
//初始化
init: function() {
var $u = this;
//template
$u.addupLoader =
'<form enctype="multipart/form-data">' +
'<label style="display:block;width:100%;cursor:pointer;height:100%;position: absolute;">' +
'<input class="kechenFengMian" type="file" capture="camera" name="file"/>' +
'</label>' +
'</form> ' +
'<img src="" width="280" height="160" />' +
'<div class="upload-progress"><span class="upload-son">等待中……</span></div>' +
'<div class="mask-Div">' +
'<div class="mask-show"></div>' +
'<div class="button-div">' +
'<span class="upload-btn"></span>' +
'<span class="deleteImg-btn"></span></div>' +
'</div>';
$u.wrap = $($u.option.el);
$u._creatFrom();
$u.eventChange($u.wrap.childNodes);
},
//生成form模板
_creatFrom: function() {
this.wrap.innerHTML = $u.addupLoader;
},
_removeFrom: function() {
this.wrap.innerHTML = "";
},
//事件觸發(fā)
/*
*對(duì)于onchange事件若值沒有發(fā)生改變的話
*此事件就會(huì)失效所以在這里打算將DOM移除
*直接初始化所有方法和事件
*
*/
/**
*@method (eventChange)
*@param {childArr} 參數(shù)為數(shù)組集合
*/
eventChange: function(childArr) {
var $u = this;
//提交form表單
addEvent(childArr[0], 'change', function(e) {
//保存當(dāng)前this對(duì)象
var thisForm = this;
if (!thisForm['file'].files.length == 0) {
$u._removeFrom();
$u.init();
testWidthHeight(e,function(iSsize){
if(!iSsize){
alert("上傳的尺寸為:長(zhǎng)為"+$u.option.Max_Width +"寬為"+$u.option.Max_Height);
return false;
}
childArr[2].setAttribute('src', "");
childArr[3].style.display = 'block';
$u.wrap.style.background = "#f3f3f3";
//發(fā)送post請(qǐng)求
$u.ajaxPost(thisForm, $u.option.url, function(result) {
//post成功
var data = JSON.parse(result);
$u.maskEvent(childArr);
childArr[2].setAttribute('src', data.url);
childArr[3].style.display = 'none';
}, function(error) {
//post 失敗
console.log(error);
}, childArr);
});
} else {
alert("上傳個(gè)數(shù)不能為0");
return false;
}
});
/**
*@method (testWidthHeight) 獲取上傳尺寸大小
*@param {e} 事件對(duì)象
*@param {callback} 回調(diào)函數(shù)
*/
function testWidthHeight(e,callback) {
var isSize;
var forms = e.target;
var reader = new FileReader();
reader.onload = function () {
var dataURL = reader.result;
var image = new Image();
image.onload=function(){
var width = image.width;
var height = image.height;
isSize = width <= $u.option.Max_Width && height <= $u.option.Max_Height;
if(typeof callback == 'function') {
callback(isSize);
}
};
image.src = dataURL;
};
reader.readAsDataURL(forms.files[0]);
return isSize;
}
},
//遮罩層上的是事件
maskEvent: function(childArr) {
$u = this;
var addBtn = childArr[4].childNodes[1].childNodes[0];
var deleBtn = childArr[4].childNodes[1].childNodes[1];
//當(dāng)鼠標(biāo)滑過
addEvent($u.wrap, "mouseover", function() {
if (childArr[2].getAttribute('src')) {
childArr[4].style.top = 0;
}
});
//當(dāng)鼠標(biāo)離開
addEvent($u.wrap, "mouseout", function() {
childArr[4].style.top = -300 + 'px';
});
//修改
addEvent(addBtn, 'click', function() {
childArr[0][0].click();
});
//刪除
addEvent(deleBtn, 'click', function() {
$u.wrap.style.backgroundImage = "url(add-bg-upload1.jpg)";
childArr[2].setAttribute('src', "");
});
},
/**
*@method (ajaxPost) 上傳方法
*@param {fm} 當(dāng)前form表單
*@param {url} url地址
*@param {fnSuc} 成功回調(diào)
*@param {fnErr} 失敗回調(diào)
*@param {childArr} 節(jié)點(diǎn)集合
*/
ajaxPost: function(fm, url, fnSuc, fnErr, childArr) {
var $u = this;
//進(jìn)度條
var proGress = childArr[3].childNodes[0];
if (window.XMLHttpRequest) {
var xhr = new XMLHttpRequest();
} else {
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
//data數(shù)據(jù)
var data = new FormData(fm);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
//成功回調(diào)
if (xhr.status == 200) {
fnSuc(xhr.responseText);
} else {
if (fnErr) {
fnErr(xhr.status);
}
}
}
};
//監(jiān)聽上傳進(jìn)度
addEvent(xhr.upload, "progress", uploadProgress);
//post后臺(tái)
xhr.open('post', url);
//發(fā)送數(shù)據(jù)
xhr.send(data);
//上傳進(jìn)度
function uploadProgress(evt) {
var loaded = evt.loaded; //已上傳的文件大小
var allTotal = evt.total; //總大小
var per = Math.floor((loaded / allTotal) * 100) + '%';
proGress.innerHTML = per;
proGress.style.width = per;
}
},
};
//獲取元素
function $(selectors) {
return document.querySelector(selectors);
}
//事件監(jiān)聽
function addEvent(el, type, fn) {
if (el.addEventListener) {
el.addEventListener(type, fn, false);
} else if (el.attachEvent) {
el.attachEvent('on' + type, function() {
fn.call(el);
});
} else {
throw new Error('not supported or DOM not loaded');
}
}
//判斷瀏覽器是否存在file屬性
if (window.File && window.FileList) {
window.UploadImg = UploadImg;
} else {
alert(error);
return false;
}
})(window);
PHP代碼:
<?php
$file=$_FILES['file'];
foreach ($file as $key => $value) {
$$key=$value;
}
$path='upload/'.time().strtolower(strstr($name, '.')); //修改上傳文件的名稱,strstr($name, '.')是獲取后綴名
move_uploaded_file($tmp_name,$path);
$path=strstr($path,$path[0]); //圖片的存儲(chǔ)地址
$arr=array(
"url"=>$path
);
$json=json_encode($arr); //json
echo $json;
?>
CSS代碼:
.couser-img-upload {
width:280px;
height:160px;
cursor:pointer;
position: relative;
overflow: hidden;
background:url(add-bg-upload1.jpg);
}
.couser-img-upload:hover{
border: 2px solid #00caac;
background:url(add-bg-upload.jpg);
}
.kechenFengMian {
display:none;
}
.upload-progress{
display: none;
width: 90%;
position: absolute;
overflow: hidden;
border:1px solid #00caac;
border-radius: 8px;
top: 50%;
margin-top: -7.5px;
left: 50%;
padding: 2px;
margin-left:-46%;
font-size: 12px;
}
.upload-progress .upload-son{
display: inline-block;
background: #00caac;
border-radius: 8px;
text-align: center;
color: #fff;
}
.mask-Div{
position: absolute;
top: -300px;
width: 100%;
height: 100%;
}
.mask-Div .mask-show{
position: absolute;
width: 100%;
height: 100%;
background: #000;
opacity: 0.5;
}
.mask-Div .button-div{
width: 140px;
height: 50px;
position: absolute;
left: 50%;
top: 50%;
margin-left: -70px;
margin-top: -25px;
}
.mask-Div .button-div span{
display: block;
width: 50px;
height: 50px;
border-radius: 50%;
overflow: hidden;
background:url(tianjiashanchu.png) no-repeat;
}
.mask-Div .button-div span.upload-btn{
background-position: 0px 0px;
float: left;
}
.mask-Div .button-div span.deleteImg-btn{
background:url(tianjiashanchu.png) no-repeat;
background-position: -50px 0px ;
float: right;
}
.mask-Div .button-div span.upload-btn:hover{
background-position: 0px -50px ;
}
.mask-Div .button-div span.deleteImg-btn:hover{
background-position: -50px -50px ;
}
Html代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript" src="uploadImg.js"></script>
</head>
<body>
<div class="couser-img-upload"></div>
<script type="text/javascript">
new UploadImg({
el:".couser-img-upload",
url:'./upload.php',
Max_Width:280,
Max_Height:160
});
</script>
</body>
</html>
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
您可能感興趣的文章:
- JS實(shí)現(xiàn)批量上傳文件并顯示進(jìn)度功能
- JS插件plupload.js實(shí)現(xiàn)多圖上傳并顯示進(jìn)度條
- js實(shí)現(xiàn)帶進(jìn)度條提示的多視頻上傳功能
- JS實(shí)現(xiàn)上傳文件顯示進(jìn)度條
- JS+html5實(shí)現(xiàn)異步上傳圖片顯示上傳文件進(jìn)度條功能示例
- 基于JS實(shí)現(xiàn)視頻上傳顯示進(jìn)度條
- 教你3分鐘利用原生js實(shí)現(xiàn)有進(jìn)度監(jiān)聽的文件上傳預(yù)覽組件
- Node.js上傳文件功能之服務(wù)端如何獲取文件上傳進(jìn)度
- JavaScript實(shí)現(xiàn)監(jiān)控上傳和下載進(jìn)度
- Nodejs文件上傳、監(jiān)聽上傳進(jìn)度的代碼
- JavaScript獲取上傳進(jìn)度的幾種方式實(shí)現(xiàn)
相關(guān)文章
JavaScript代碼簡(jiǎn)化技巧實(shí)例解析
這篇文章主要介紹了JavaScript代碼簡(jiǎn)化技巧實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
使用JS手寫一個(gè)類似?Laravel?驗(yàn)證器的表單驗(yàn)證器
這篇文章主要為大家介紹了使用JS手寫一個(gè)類似?Laravel?驗(yàn)證器的表單驗(yàn)證器實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
使用JS實(shí)現(xiàn)圖片輪播的實(shí)例(前后首尾相接)
下面小編就為大家?guī)硪黄褂肑S實(shí)現(xiàn)圖片輪播的實(shí)例(前后首尾相接)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
根據(jù)判斷瀏覽器類型屏幕分辨率自動(dòng)調(diào)用不同CSS的代碼
根據(jù)判斷瀏覽器類型屏幕分辨率自動(dòng)調(diào)用不同CSS的代碼...2007-02-02

