Cách tạo tinymce dán vào văn bản thuần túy theo mặc định


103

Googled nó hàng nghìn lần, Không ai đưa ra giải pháp hoàn chỉnh về cách làm cho Tinymce dán vào văn bản thuần túy theo mặc định và loại bỏ bất kỳ định dạng nào mà không cần nhấp vào nút "dán dưới dạng văn bản".

Bất kỳ ý tưởng về cách thực hiện điều đó? hoặc làm thế nào để bật nút "dán dưới dạng văn bản" tự động?

Cảm ơn bạn

Câu trả lời:


59

CHỈNH SỬA: giải pháp này dành cho phiên bản 3.x, đối với phiên bản 4.x, hãy đọc câu trả lời từ @Paulo Neves

Vấn đề là plugin Paste tự động đặt lại văn bản thuần túy dán trên mỗi lần dán. Vì vậy, tất cả những gì chúng ta cần làm - thiết lập nó trở lại. Đoạn mã sau sẽ hữu ích.

tinyMCE.init({
...
oninit : "setPlainText",
plugins : "paste"

....
});

Định nghĩa của setPlainText

 function setPlainText() {
        var ed = tinyMCE.get('elm1');

        ed.pasteAsPlainText = true;  

        //adding handlers crossbrowser
        if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) {
            ed.onKeyDown.add(function (ed, e) {
                if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45))
                    ed.pasteAsPlainText = true;
            });
        } else {            
            ed.onPaste.addToTop(function (ed, e) {
                ed.pasteAsPlainText = true;
            });
        }
    }

Vì vậy, bây giờ nó sẽ luôn luôn là đơn giản.


Tôi nghĩ đó là do không có plugin dán mà tôi đã tạo ví dụ làm việc - hãy xem 92.248.232.12/tinymce/examples/simple.html tinyMCE.init ({... oninit: "setPlainText", plugins: "paste" .. ..});
er-v

5
Câu trả lời tuyệt vời, mặc dù tôi thấy mình gặp lỗi JS liên quan đến định nghĩa của "ed". Điều này rất đơn giản để khắc phục bằng cách xóa dòng tinyMCE.get ("elm1") và đặt ed làm tham số đầu tiên của phương thức setPlainText: ví dụ: "function setPlainText (ed) {...".
drmonkeyninja

8
Trong các phiên bản sau của tinymce, một số tùy chọn đã được thêm vào để giải quyết vấn đề này. paste_text_sticky_default: truepaste_text_sticky: truetrong cấu hình của bạn nên thực hiện thủ thuật. (Tôi đang sử dụng 3.5.0.1)
Greg

@ er-v bất kỳ gợi ý về cách để tồn tại các TinyMCE định dạng chuỗi bằng cách sử dụng hình thức: stackoverflow.com/questions/17247900/...
codeObserver

13
Chỉ cần thử .init({ plugins: ["paste"], paste_as_text: true }), và nó hoạt động giống như một sự quyến rũ với TinyMCE 4.1 mà không cần thêm một chức năng nào khác.
Rémi Breton

149

Đối với tinyMCE 3X hoặc 4X, mọi thứ đã thay đổi một chút. bây giờ bạn có thể làm điều này và nó hoạt động tốt.

tinymce.init({
    plugins: "paste",
    paste_as_text: true
});

5
Có, các cách tiếp cận khác không hoạt động nhưng điều này thì có.
Tim

2
@Tim Cách tiếp cận được hiển thị trong câu trả lời của câu hỏi này là TinyMCE 3.x. Nếu bạn đang sử dụng TinyMCE 4 trở lên, cách tiếp cận trong câu trả lời này sẽ hiệu quả.
Leonardo Montenegro

Có một plugin hoặc tùy chọn cho bất kỳ thứ gì trong TinyMCE .. không có gì lạ khi nó là tốt nhất!
supersan

1
Cảm ơn bạn về giải pháp, nhưng điều này thực sự có nghĩa là tôi phải nhớ chỉnh sửa tệp cấu hình mỗi khi các plugin được cập nhật?
Mike

84

Tôi đã giải quyết vấn đề này với mã này

tinyMCE.init({
...
plugins : "paste",
paste_text_sticky : true,
setup : function(ed) {
    ed.onInit.add(function(ed) {
      ed.pasteAsPlainText = true;
    });
  }
....
})

11
Đối với những gì nó đáng giá, tôi nghĩ rằng giải pháp của bạn tốt hơn câu trả lời đã chọn.
arikfr

@Dariusz Lyson, có đề xuất nào về cách duy trì chuỗi được định dạng tinyMCE bằng biểu mẫu không? : Stackoverflow.com/questions/17247900/...
codeObserver

9
Tôi gặp lỗi javascript mà thuộc onInittính của ednó không được xác định. Unable to get property 'add' of undefined or null reference
Tim

35

Chỉ cần bản thân tôi chạy vào cái này và phát hiện ra rằng kể từ TinyMCE 3.4.2, bạn có thể chỉ cần:

paste_text_sticky: true,
paste_text_sticky_default: true

... thật tuyệt.


2
+1 cho các tùy chọn cấu hình này, đừng quên thêm plugin dán vào mảng plugin!
Fredszaq

3
Trình chỉnh sửa vẫn cho phép dán văn bản khác không phải văn bản thuần túy khi tôi sử dụng phương pháp này.
Tim

7

Tôi nghĩ cách dễ nhất sẽ là:

tinymce.init({
   ...
   paste_as_text: true,
   plugins: "paste",
   ...
});

1

Không phải là tốt hơn để sử dụng:

var ed = tinyMCE.activeEditor;

thay vì:

var ed = tinyMCE.get('elm1');

Tôi đồng ý, tôi đã có thể làm cho công việc kịch bản của tôi sử dụng activeEditor thay vì get ( 'elm1'), tôi cũng đăng tải trong câu trả lời của tôi mã của bạn + Mã chấp nhận như là câu trả lời và nó đang làm việc lớn
GibboK

Đây là một bình luận hướng đến câu trả lời của er-v . Điều này không cung cấp câu trả lời cho câu hỏi. Một khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào .
Tất cả người lao động đều cần thiết vào

1

FYI, TinyMCE đã cải thiện điều này bằng cách triển khai nó như một tùy chọn mặc định trong plugin dán. Thông tin thêm: http://www.tinymce.com/wiki.php/Plugin:paste

Tuy nhiên, nó vẫn chưa hoàn hảo. Vì vậy, đây là một tập lệnh cũng loại bỏ tất cả HTML:

// Paste
        paste_auto_cleanup_on_paste : true,
        paste_remove_spans: true,
        paste_remove_styles: true,
        paste_retain_style_properties: false,

        paste_preprocess : function(pl, o) 
        {    // Replace <div> with <p>
            o.content = o.content.replace(/<div>/gi, "<p>");    
            o.content = o.content.replace(/<\/div>/gi, "</p>");
            o.content = o.content.replace(/<\r\n/gi, "\n");
            o.content = o.content.replace(/<\n\n/gi, "\n");
            o.content = o.content.replace(/<\n\n/gi, "\n");

            // Replace empty styles
            o.content = o.content.replace(/<style><\/style>/gi, "");    

            o.wordContent = true;            
        },

        paste_postprocess : function(pl, o) 
        {    //console.log(o.node.innerHTML);
            var ed = pl.editor, dom = ed.dom;

            // Remove all tags which are not <p> or <br>
            tinymce.each(dom.select('*', o.node), function(el) 
            {    if (el.tagName.toLowerCase() != "p" && el.tagName.toLowerCase() != "br") 
                {    dom.remove(el, 1); // 1 = KeepChildren
                    console.log(el.tagName);
                }
                dom.setAttrib(el, 'style', '');
            });

        },

Nguồn: http://www.tinymce.com/forum/viewtopic.php?pid=60121#p60121


1

Không có plugin: Nghe để dán sự kiện, nhận dữ liệu khay nhớ tạm

Nếu bạn không thể sử dụng hoặc không muốn sử dụng trình cắm vì bất kỳ lý do gì, bạn có thể tạo hàm gọi lại "dán dưới dạng văn bản thuần túy" của riêng mình như sau:

tinyMCE.init({

    // ...,

    setup: function (editor) {

        // Listen for paste event, add "Paste as plain text" callback
        editor.onPaste.add(function (editor, e) {

            // Prevent default paste behavior
            e.preventDefault();

            // Check for clipboard data in various places for cross-browser compatibility.
            // Get that data as text.
            var content = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');

            // Let TinyMCE do the heavy lifting for inserting that content into the editor.
            editor.execCommand('mceInsertContent', false, content);
        });
    }
});

Lưu ý: Điều này được tạo cho TinyMCE 3.5.x. Khả năng tương thích có thể thay đổi theo phiên bản.


1
Giải pháp tuyệt vời cho 3.x - không ai trong số các câu trả lời khác đang làm việc trong trường hợp của tôi
Rolf Pedro Ernst

1

nếu bạn sử dụng tệp .yml, hãy thêm plugin pastepaste_as_text: true

default:
  plugins:
    - paste
  paste_as_text: true

-1

Tôi không chắc điều này có thể xảy ra, vì "paste as plaintext" thực sự thực hiện dọn dẹp văn bản trước khi nó thêm nó vào cửa sổ. Nếu bạn chỉ dán dữ liệu vào cửa sổ, không có thao tác nào có thể được thực hiện. (Trừ khi bạn mắc vào onChangehoặc cái gì đó), nhưng cuối cùng bạn có thể sửa mã đã được dán và do đó, 'sửa hai lần' nó.


-1

Tôi đã làm như sau:

var pastePlainText = function() {
    // No need to pass in an ID, instead fetch the first tinyMCE instance
    var ed = tinyMCE.get(0); 
    ed.pasteAsPlainText = true;  

    //adding handlers crossbrowser
    if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) {
        ed.onKeyDown.add(function (ed, e) {
            if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45))
                ed.pasteAsPlainText = true;
        });
    } else {            
        ed.onPaste.addToTop(function (ed, e) {
            ed.pasteAsPlainText = true;
        });
    }
};

Và sau đó:

tinyMCE.init({
    // ...
    plugins: "paste",
    oninit: pastePlainText // Note, without "
    // ...
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.