이전 기사에서는 이 프로젝트의 전체 HTML 및 CSS를 구현했습니다.
HTML5/CSS3 클래식 사례 - 플러그인 없이 드래그 앤 드롭으로 이미지 업로드(1)
이 블로그는 이전 블로그를 직접 기반으로 작성되었습니다. 최종 효과는 다음과 같습니다.
렌더링 1:
렌더링 2:
그럼 효과 보실 수 있게 사진 두 번 올려주세요~
하셔도 됩니다 보세요 우리 사진을 생성하는 li의 html은 실제로 꽤 복잡하므로 html 문서에 몇 가지 수정을 했습니다:
<span style="font-size:12px;"><body> <p id="uploadBox"> </p> <p id="template" class="hidden"> <li> <img src=""/> <span class="progress"></span> <span class="percentage"></span> </li> </p> </body></span>
할 수 있습니다. 참조 li 표시는 p#template에 독립적으로 기록됩니다. 이렇게 하면 어떤 이점이 있습니까? 파일을 업로드할 때마다 js에서 요소를 생성하고 속성을 할당하는 데 많은 양의 코드가 필요하지 않도록 일반적으로 더 복잡한 html 요소를 생성하도록 설계되어 코드를 단순화하고 작업을 용이하게 할 수 있는 이 방법을 사용하는 것이 좋습니다. 나중에 코드를 유지 관리합니다.
Js 코드:
<span style="font-size:12px;">/** * User: zhy * Date: 14-6-16 * Time: 下午11:06 */ var ZhangHongyang = {}; ZhangHongyang.html5upload = (function () { var _ID_UPLOAD_BOX = "uploadBox"; var _CLASS_PROGRESS = "progress"; var _CLASS_PERCENTAGE = "percentage"; var _tip_no_drag = "将文件拖拽至此区域,即可上传!"; var _tip_drag_over = "释放鼠标立即上传!"; var _uploadEle = null; /** * 初始化对象与事件 * @private */ function _init() { _uploadEle = document.getElementById(_ID_UPLOAD_BOX); _uploadEle.ondragenter = _onDragEnter; _uploadEle.ondragover = _onDragOver; _uploadEle.ondragleave = _onDragLeave; _uploadEle.ondrop = _onDrop; _setStatusNoDrag(); }; /** * 正在拖拽状态 * @private */ function _setDragOverStatus() { if (_checkContatinsElements())return; _uploadEle.innerText = _tip_drag_over; _uploadEle.style.border = "2px dashed #777"; $(_uploadEle).css({lineHeight: $(_uploadEle).height() + "px"}); } /** * 初始化状态 * @private */ function _setStatusNoDrag() { if (_checkContatinsElements())return; _uploadEle.innerText = _tip_no_drag; _uploadEle.style.border = "2px dashed #777"; $(_uploadEle).css({lineHeight: $(_uploadEle).height() + "px"}); } /** * 上传文件 * @private */ function _setDropStatus() { if (_checkContatinsElements())return; _uploadEle.innerText = ""; _uploadEle.style.border = "1px solid #444"; $(_uploadEle).css({lineHeight: "1em"}); $(_uploadEle).append("<ul></ul>"); }; /** * 判断是否已经上传文件了 * @private */ function _checkContatinsElements() { return !!$(_uploadEle).find("li").size(); } /** * 当ondragenter触发 * @private */ function _onDragEnter(ev) { _setDragOverStatus(); } /** * 当ondargmove触发 * @private */ function _onDragOver(ev) { //ondragover中必须组织事件的默认行为,默认地,无法将数据/元素放置到其他元素中。 ev.preventDefault(); } /** * 当dragleave触发 * @private */ function _onDragLeave(ev) { _setStatusNoDrag(); } /** * ondrop触发 * @private */ function _onDrop(ev) { //drop 事件的默认行为是以链接形式打开,所以也需要阻止其默认行为。 ev.preventDefault(); _setDropStatus(); //拿到拖入的文件 var files = ev.dataTransfer.files; var len = files.length; for (var i = 0; i < len; i++) { //页面上显示需要上传的文件 _showUploadFile(files[i]); } } /** * 页面上显示需要上传的文件 * @private */ function _showUploadFile(file) { var reader = new FileReader(); // console.log(file) // console.log(reader); //判断文件类型 if (file.type.match(/image*/)) { reader.onload = function (e) { var formData = new FormData(); var li = $("#template li").clone(); var img = li.find("img"); var progress = li.find(".progress"); var percentage = li.find(".percentage"); percentage.text("0%"); img.attr("src", e.target.result); $("ul", $(_uploadEle)).append(li); $(_uploadEle).find("li").size() == 10 && $(_uploadEle).width(($(_uploadEle).width() + 8) + "px").css("overflow", "auto"); formData.append("uploadFile", file); //上传文件到服务器 _uploadToServer(formData, li, progress, percentage); }; reader.readAsDataURL(file); } else { console.log("此" + file.name + "不是图片文件!"); } } /** * 上传文件到服务器 * @private */ function _uploadToServer(formData, li, progress, percentage) { var xhr = new XMLHttpRequest(); xhr.open("POST", "http://localhost:8080/strurts2fileupload/uploadAction", true); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest', 'Content-Type', 'multipart/form-data;'); //HTML5新增的API,存储了上传过程中的信息 xhr.upload.onprogress = function (e) { var percent = 0; if (e.lengthComputable) { //更新页面显示效果 percent = 100 * e.loaded / e.total; progress.height(percent ); percentage.text(percent + "%"); percent >= 100 && li.addClass("done"); } }; xhr.send(formData); } //把init方法公布出去 return{ init: _init } })(); </span>
이번에는 리터럴을 사용하여 직접 객체를 생성하지 않았습니다. 사용자가 모든 메소드와 변수에 액세스할 수 있기를 바랍니다. 저는 간단한 클로저를 사용합니다. 거의 모든 메소드와 변수가 비공개라고 생각하고 공개하지 않았기 때문에 _로 시작하는 것을 볼 수 있습니다. 게시된 것은 사용자가 호출할 수 있는 init 메소드입니다. 전체적인 방법 역시 네임스페이스를 사용하기 때문에 다른 파트너가 작성한 js는 기본적으로 변수와 같은 문제가 발생하지 않습니다.
위 js에서는 HTML FileApi가 사용됩니다. 소개는 다음과 같습니다.
1. object 이것이 위에서 사용한 것입니다:
File
마지막 수정 날짜: 2013년 12월 26일 목요일 18:45:08 GMT+0800(중국 표준시)
이름 : "yt_key.png"
크기: 45524
유형: "이미지/png"
webkitRelativePath: ""
__proto__: File
위의 속성 중 일부가 포함되어 있는 것을 볼 수 있습니다. 즉, html5를 지원하는 브라우저를 사용하는 경우 onchange를 설정하세요. 입력=유형에 대한 이벤트, 사용자는 사진이나 파일을 선택한 후 사진의 표시나 파일의 크기 및 유형을 판단할 수 있습니다.
2、FileReader主要用于异步读取文件内容,注意是异步的,上例我们使用了它的readAsDataURL的方法,关于DataUri的知识可以自己去百度下。
另外还提供了:readAsText用于读取文本;readAsArrayBuffer和readAsBinaryString方法;
还提供了一些事件:onloadstart, onload, onprogress ,onerror , onloaded , onabort 有兴趣的可以去一个一个查看。
最后页面调用,大功告成:
<span style="font-size:12px;"> <script type="text/javascript" src="jquery-1.8.3.js"></script> <script type="text/javascript" src="js/html5upload.js"></script> <script type="text/javascript"> window.onload = function () { ZhangHongyang.html5upload.init(); } ; </script></span>
위 내용은 HTML5/CSS3 클래식 사례 - 드래그 앤 드롭으로 플러그인 없이 이미지 업로드(2)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!