TinyMCE實現簡單的本地上傳


TinyMCE這個東西很多地方再用,不過我以前一直沒用過,最近才接觸,因為有一套現成的metro風格的皮膚,僅此而已,不過最終如何調用還是我得來實現。其他的都好說,網上的資料一大把一大把的,唯獨這個本地圖片上傳,網上查的資料都是三言兩語,不成體系,有些地方總歸是沒有說到,費了好大勁兒,總算是鬧明白怎么弄這個了。(大牛們這次怎么就不能一起愉快的玩耍呢……)

TinyMCE中使用本地上傳圖片,實際上是在TinyMCE中使用了一個編寫好的插件。這個插件自定義性非常大,按照你的想法,想干嘛就干嘛。

首先一點,在TinyMCE編輯器初始化時啟用圖片功能,這個不說了,網上資料都有,一大把一大把的。這里只舉一個例子:

tinymce.init({
            selector: 'textarea',
            mode: "textareas",
            theme: "advanced",
            plugins: "preview",
            theme_advanced_toolbar_location: "top",
            theme_advanced_toolbar_align: "left",
            theme_advanced_buttons1: "bold, italic, underline, strikethrough, justifyleft, justifycenter, justifyright, justifyfull, bullist, numlist, outdent, indent, undo,redo, link, unlink,  hr, formatselect, fontselect, fontsizeselect, forecolor,spacer,cut,copy,paste, image,cleanup, code, myplugins,preview",
            theme_advanced_buttons2: "",
            theme_advanced_buttons3: "",
        });
        tinymce.mceImage

 

然后直奔本地圖片上傳。

 

核心要關注的就是這個htm頁面和image.js文件這兩個。

image.htm這個里面你可以完全自己定義,不用太操心,你希望他是什么樣子都可以,一般都會跟你整體項目的UI框架保持一致,當然也有特別炫酷的。當你覺得他的墨陽能夠讓你滿意,記得在head標簽區域內引用“image.js”文件。這個很重要。

這里我們還用到了jquery.form.js這個經典的插件,主要是要用它來實現ajax提交表單。

這里是我自己的代碼,給大家參考下:

<head>
    <script src="../../../../../Scripts/jquery-1.7.1.min.js"></script>
    <script type="text/javascript" src="../../../jquery.form.js"></script>
    <script type="text/javascript" src="../../tiny_mce_popup.js"></script>
    <script type="text/javascript" src="../../utils/mctabs.js"></script>
    <script type="text/javascript" src="../../utils/form_utils.js"></script>
    <script type="text/javascript" src="js/image.js"></script>
</head>

上面的東西除了jquery.form.js都可以在插件內部找到,這里不再一一解釋作用了。往下就是html主體部分,這個大家隨意,反正只要有個form標簽,里面再有個<input type='file' ……>就可以了。

先說上傳本身,上傳本身要利用ajax提交表單,具體來說就是利用jquery.form.js中的ajaxSubmit方法,參數和Jquery的ajax一樣,但是不需要傳遞data參數,因為表單本身在內部會處理完當做post方式傳輸。與此同時,對於上傳文件來說,form表單中需要設置如下內容:

method="post" enctype="multipart/form-data" action="……"

method和action兩個屬性不解釋了,如有疑問請自行百度。enctype 屬性規定在發送到服務器之前應該如何對表單數據進行編碼,默認值是“application/x-www-form-urlencoded”,編碼所有字符,“text/plain”是指不編碼特殊字符,但會將空格轉換為 "+" 加號,還有一個值就是我們用到的“multipart/form-data”,該值為不對字符編碼,上傳文件的請求必須使用這個值。這種方式的核心在於post請求的數據在文件數據和文本數據中存在分隔符,具體的不贅述太多了。

然后是表單 提交的部分(重頭戲哦):

if (document.getElementById("upload").value == "") {
                    alert("請選擇一個圖片文件,再點擊上傳。");
                    return;
                }
                $("#myForm").ajaxSubmit({
                    type: "POST", dataType: "text", url: "……", async: true, success: function (value) {
                        if (value != "0") {
                            $("#src").val(value);
                            $("#uploadsrc").html("<img src='"+value+"' />");
                        }
                        else {
                            alert("上傳失敗");
                        }
                    }, error: function (value) {
                        alert("失敗" + value);
                    }
                });

方法里看到對於表單“myForm”使用了ajaxSubmit方法,方法跟jquery本身的ajax一樣,簡單明了,至於后台的代碼這里不說了,如果有同學需要的話可以百度,或者聯系我。在文件上傳完畢之后,可以看到在例子中我是把圖片顯示了出來,這樣主要為了方便,預覽一下再確定,省的誤操作,這個大家可以根據自己的用戶習慣和要求來設計。

然后就是如何把圖片添加到文本編輯器里了。因為TinyMCE的方式是彈出窗口,注意是窗口,不是層。對於這樣的彈出窗口,一般情況下我們會有插入,取消之類的按鈕來使用,這里只說插入和取消,其他的就不說了。

取消:主要功能為刪除圖片,關閉窗口,刪除圖片這個在自己后台處理就是了,用一個ajax方法,后台刪除就是了,服務端代碼這里不做研究了。關閉窗口我們使用TinyMCE的方法:tinyMCEPopup.close(),這樣可以直接關閉彈出窗口並使焦點回到富文本編輯器本身。

插入:把剛剛上傳的圖片對象插入到富文本編輯器當前的光標所在處。並關閉彈出窗口,這里就要用到前文提到的image.js了。這個image.js文件,tinyMCE本身就有,但是不見得適用每個人,所以需要自行修改。

文件中有一個聲明好的全局變量:ImageDialog,這里面可以做很多東西。文件本身有很多方法,大家感興趣的可以研究下,這里只說一些我們馬上就需要用到的代碼。

insertAndClose: function () {
        var ed = tinyMCEPopup.editor, f = document.forms[0], nl = f.elements, v, args = {}, el;

        tinyMCEPopup.restoreSelection();

        // Fixes crash in Safari
        if (tinymce.isWebKit)
            ed.getWin().focus();

        if (!ed.settings.inline_styles) {
            args = {
                vspace: nl.vspace.value,
                hspace: nl.hspace.value,
                border: nl.border.value,
                align: getSelectValue(f, 'align')
            };
        } else {
            // Remove deprecated values
            args = {
                vspace: '',
                hspace: '',
                border: '',
                align: ''
            };
        }

        tinymce.extend(args, {
            src: nl.src.value.replace(/ /g, '%20'),
            width: 100,
            height: 100,
            alt: "",
            title: "",
            'class': getSelectValue(f, 'class_list'),
            style: "",
            id: "",
            dir: "",
            lang: "",
            usemap: "",
            longdesc: ""
        });

        args.onmouseover = args.onmouseout = '';

        //if (f.onmousemovecheck.checked) {
        //    if (nl.onmouseoversrc.value)
        //        args.onmouseover = "this.src='" + nl.onmouseoversrc.value + "';";

        //    if (nl.onmouseoutsrc.value)
        //        args.onmouseout = "this.src='" + nl.onmouseoutsrc.value + "';";
        //}

        el = ed.selection.getNode();

        if (el && el.nodeName == 'IMG') {
            ed.dom.setAttribs(el, args);
        } else {
            tinymce.each(args, function (value, name) {
                if (value === "") {
                    delete args[name];
                }
            });

            ed.execCommand('mceInsertContent', false, tinyMCEPopup.editor.dom.createHTML('img', args), { skip_undo: 1 });
            ed.undoManager.add();
        }

        tinyMCEPopup.editor.execCommand('mceRepaint');
        tinyMCEPopup.editor.focus();
        tinyMCEPopup.close();
    }

這個方法是我根絕別人的東西改改直接用的,方法是把圖片添加到富文本編輯器當前光標處並關閉彈出窗口的。其中:

tinyMCEPopup是tinyMCE的彈出窗口對象,利用他可以通過tinyMCEPopup.editor操作富文本編輯器,同時,tinymce是tinymce的全局對象。

在方法中:

tinymce.extend(args, {

   src: nl.src.value.replace(/ /g, '%20'),

   width: 100,

   height: 100,

   alt: "",

   title: "",

   'class': getSelectValue(f, 'class_list'),

   style: "",

   id: "",

   dir: "",

   lang: "",

   usemap: "",

   longdesc: ""

});

這個方法我是自己改的很死,因為我的需求沒有那么嚴格,所以這些參數我都是寫死的,各位根據需要自行修改吧,這是初始化的設定。

編寫完成關閉方法,還需要調用,在HTML頁面中,在插入按鈕對應的點擊方法中,可以直接使用:ImageDialog.insertAndClose()方式調用。

以上,就是基本的tinyMCE本地圖片上傳功能,往下就是根據需要調整了,各位發揮才智,可以各種酷炫哦。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM