摘要:屬性介紹默認是默認是在粘貼操作時為空剪切板中的各項數據剪切板中的數據類型。避免重復創建上傳中文件成功失敗處理已上傳上傳出錯添加文件到隊列并上傳開始上傳其他參考獲取剪切板內容,控制圖片粘貼在線代碼編輯器事件說明
Markdown編輯器選用https://simplemde.com
它是一款純js實現的markdown編輯器。缺點不支持圖片上傳。那我們就得改造它。
simplemde是基于codemirror編輯器的.
先介紹基本:
codemirror文檔:http://codemirror.net/doc/man...
simplemde文檔:https://github.com/NextStepWe...
API文檔:
拖拽:
https://developer.mozilla.org...
https://developer.mozilla.org...
粘貼:
https://developer.mozilla.org...
https://developer.mozilla.org...
注意一點:目前firefox與chrome比較新的版本都實現了這些API。
paste事件綁定的元素不一定是input,普通的div也是可以綁定的,如果是給document綁定了,就相當于全局了,任何時候的粘貼操作都會觸發。
獲取事件對象ClipboardEvent
先寫一下事件綁定的代碼
pasteEle.addEventListener("paste", function (e){ if ( !(e.clipboardData && e.clipboardData.items) ) { return ; } for (var i = 0, len = e.clipboardData.items.length; i < len; i++) { var item = e.clipboardData.items[i]; if (item.kind === "string") { item.getAsString(function (str) { // str 是獲取到的字符串 }) } else if (item.kind === "file") { var pasteFile = item.getAsFile(); // pasteFile就是獲取到的文件 } } });
粘貼事件提供了一個clipboardData的屬性,如果該屬性有items屬性,那么就可以查看items中是否有圖片類型的數據了。
clipboardData介紹
介紹一下clipboardData對象,它實際上是一個DataTransfer類型的對象,DataTransfer 是拖動產生的一個對象,但實際上粘貼事件也是它。
屬性介紹
dropEffect String 默認是 none
effectAllowed String 默認是 uninitialized
files FileList 在粘貼操作時為空List
items DataTransferItemList 剪切板中的各項數據
types Array 剪切板中的數據類型。
DataTransferItem
items是一個DataTransferItemList對象,自然里面都是DataTransferItem類型的數據了。
DataTransferItem有兩個屬性kind和type
kind 一般為string或者file
type 具體的數據類型,例如具體是哪種類型字符串或者哪種類型的文件,即MIME-Type,常見的值有text/plain、text/html、Files。
方法
getAsFile 空 如果kind是file,可以用該方法獲取到文件
getAsString 回調函數 如果kind是string,可以用該方法獲取到字符串,字符串需要用回調函數得到,回調函數的第一個參數就是剪切板中的字符串
綜合
// demo 程序將粘貼事件綁定到 document 上 document.addEventListener("paste", function (e) { var cbd = e.clipboardData; //var ua = window.navigator.userAgent; for(var i = 0; i < cbd.items.length; i++) { var item = cbd.items[i]; if(item.kind == "file"){ var blob = item.getAsFile(); if (blob.size === 0) { return; } // blob 就是從剪切板獲得的文件 可以進行上傳或其他操作 } } }, false);drop事件
DragEvent
DragEvent.dataTransfer
dropEffect String 默認是 none
effectAllowed String 默認是 uninitialized
files FileList
items DataTransferItemList 剪切板中的各項數據
types Array 剪切板中的數據類型。
DataTransferItem
items是一個DataTransferItemList對象,自然里面都是DataTransferItem類型的數據了。
DataTransferItem有兩個屬性kind和type
kind 一般為string或者file
type 具體的數據類型,例如具體是哪種類型字符串或者哪種類型的文件,即MIME-Type,常見的值有images/*、text/plain、text/html、Files。
方法
getAsFile 空 如果kind是file,可以用該方法獲取到文件
getAsString 回調函數 如果kind是string,可以用該方法獲取到字符串,字符串需要用回調函數得到,回調函數的第一個參數就是剪切板中的字符串
dropEle.addEventListener("drop", function (e){ var data = new FormData(); var files = event.dataTransfer.files; var i = 0; var len = files.length; while (i < len){ data.append("file" + i, files[i]); i++; } var xhr = new XMLHttpRequest(); xhr.open("post", "/upload", true); xhr.onreadystatechange = function(){ if (xhr.readyState == 4){ alert(xhr.responseText); } }; xhr.send(data); });
阻止瀏覽器默認打開拖拽文件的行為:參考這里
window.addEventListener("drop",function(e){ e = e || event; console.log(e); //e.preventDefault(); if (e.target.tagName != "textarea") { // check wich element is our target e.preventDefault(); } },false);
理論知識說完了。下面開始實驗改造codemirror
codemirror支持粘貼和拖拽上傳codemirror
附Codemirror常用事件與方法
參考這里
1.onChange(instance,changeObj):codeMirror文本被修改后觸發。
instance是一個當前的codemirror對象,changeObj是一個{from,to,text,removed}對象。其中from,to分別表示起始行對象和結束行對象,行對象包括ch:改變位置距離行頭的間隔字符,line:改變的行數。text是一個字符串數組表示被修改的文本內容,即你輸入的內容。
2.onBeforeChange(instance,changObj):內容改變前被調用
3.onCursorActivity(instance):當鼠標點擊內容區、選中內容、修改內容時被觸發
4.onKeyHandled:(instance,name,event):當一個都dom元素的事件觸發時調用,name為操作名稱。
5.onInputRead(insatance,changeObj):當一個新的input從隱藏的textara讀取出時調用
6.onBeforeSelectionChange(instance,obj):當選中的區域被改變時調用,obj對象是選擇的范圍和改變的內容(本人未測試成功)
7.onUpdate(instance):編輯器內容被改變時觸發
8.onFocus(instance):編輯器獲得焦點式觸發
9.onBlur(instance):編輯器失去焦點時觸發
常用方法:
getValue():獲取編輯器文本內容
setValue(text):設置編輯器文本內容
getRange({line,ch},{line,ch}):獲取指定范圍內的文本內容第一個對象是起始坐標,第二個是結束坐標
replaceRange(replaceStr,{line,ch},{line,ch}):替換指定區域的內容
getLine(line):獲取指定行的文本內容
lineCount():統計編輯器內容行數
firstLine():獲取第一行行數,默認為0,從開始計數
lastLine():獲取最后一行行數
getLineHandle(line):根據行號獲取行句柄
getSelection():獲取鼠標選中區域的代碼
replaceSelection(str):替換選中區域的代碼
setSelection({line:num,ch:num1},{line:num2,ch:num3}):設置一個區域被選中
somethingSelected():判斷是否被選擇
getEditor():獲取CodeMirror對像
undo():撤銷
redo():回退
var simplemde = new SimpleMDE({ element: document.getElementById("MyID") }); simplemde.codemirror.on("drop", function(editor,e){ ... }); simplemde.codemirror.on("paste",function(editor,e){ ... });Blob對象轉File對象
為了使用WebUploader這個文件上傳組件,需要將粘貼得到的Blob對象轉為File對象。
Blob 對象是包含有只讀原始數據的類文件對象.File 接口基于 Blob,繼承了 Blob 的功能,并且擴展支持用戶計算機上的本地文件。
var blob=new Blob(); var file = new File([blob], "image.png", {type:"image/png"});
File構造器的第一個參數必須是數組
WebUploader文件上傳http://fex.baidu.com/webuploa...
創建Uploader對象
var uploader = WebUploader.Uploader({ swf: "path_of_swf/Uploader.swf", // 開起分片上傳。 chunked: true });
監聽fileQueued事件來實現進度UI構造:
// 當有文件被添加進隊列的時候 uploader.on( "fileQueued", function( file ) { var $list=$("#list"); $list.append( "" + "" ); });" + file.name + "
" + "等待上傳...
" + "
文件上傳進度:
// 文件上傳過程中創建進度條實時顯示。 uploader.on( "uploadProgress", function( file, percentage ) { var $li = $( "#"+file.id ), $percent = $li.find(".progress .progress-bar"); // 避免重復創建 if ( !$percent.length ) { $percent = $("" + "").appendTo( $li ).find(".progress-bar"); } $li.find("p.state").text("上傳中"); $percent.css( "width", percentage * 100 + "%" ); }); " + "
文件成功、失敗處理:
uploader.on( "uploadSuccess", function( file,data ) { $( "#"+file.id ).find("p.state").text("已上傳"); }); uploader.on( "uploadError", function( file ) { $( "#"+file.id ).find("p.state").text("上傳出錯"); }); uploader.on( "uploadComplete", function( file ) { $( "#"+file.id ).find(".progress").fadeOut(); });
添加文件到隊列并上傳:
uploader.addFiles( file ) uploader.addFiles( [file1, file2 …] )
開始上傳:
uploader.upload() //uploader.upload( file | fileId)
其他參考:
js獲取剪切板內容,js控制圖片粘貼
在線代碼編輯器 CODEMIRROR 事件說明
javascript.ruanyifeng.com
https://developer.mozilla.org...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/80822.html
摘要:前言最近在搭個人博客網站,需要一個編輯器,來進行博客的編寫看了網上的教程,決定使用以為可以直接能拿來用的不過實際運用的時候發現還是有要完善的地方比如令人頭疼的圖片上傳最終效果安裝及初始化在中加入一個在的生命周期函數中,添加的實例化通過指 前言 最近在搭個人博客網站,需要一個markdown編輯器,來進行博客的編寫看了網上的教程,決定使用simplemde以為可以直接能拿來用的不過實際運...
摘要:準備工作首先來一個可編輯的和一些簡單的樣式來封裝兩個方法獲取到操作的文件文件轉為拋出開始拖拽文件要使用到的三個相關事件,分別是,,當元素或者選擇的文本被拖拽到一個有效的放置目標上時,觸發事件。 準備工作 首先來一個可編輯的div和一些簡單的樣式 #test{ height: 300px; width: 300px; ...
摘要:使用場景圖片的拖拽指定區域進行上傳圖片粘貼進行上傳功能核心參考案例代碼定義模塊截圖粘貼如果是圖片讀取完成后,上傳上傳圖片返回一個數據拖拽上傳回調文件返回一個數據解析粘貼過來的內容,看是否有不是本站的圖片解析出來上傳到本站使用方法粘貼上傳圖 使用場景 圖片的拖拽指定區域進行上傳 圖片粘貼進行上傳功能 核心api參考 File clipboardData 案例代碼 Seajs 定義To...
摘要:博客客戶端針對所做的文章編輯工具。傳送門這里只是前端部分,使用構建。為了讓圖片更好地被訪問,需要您事先配置好域名,這樣圖片在插入完畢提交到云端后可以直接通過域名訪問。 Hugo 博客客戶端 針對hugo所做的文章編輯工具。 目前做了mac && win版本。傳送門https://github.com/jecshcier/... 這里只是前端部分,使用webpack + react + ...
閱讀 1121·2021-09-22 16:04
閱讀 1499·2019-08-30 15:43
閱讀 1109·2019-08-29 14:01
閱讀 3444·2019-08-26 12:19
閱讀 3359·2019-08-26 12:15
閱讀 1452·2019-08-26 12:13
閱讀 3270·2019-08-23 17:00
閱讀 1490·2019-08-23 15:38