기본적으로 tinymce 붙여 넣기를 일반 텍스트로 만드는 방법


103

수천 번 구글링을했지만 아무도 Tinymce가 기본적으로 일반 텍스트로 붙여넣고 "텍스트로 붙여 넣기"버튼을 클릭하지 않고 서식을 제거하는 방법에 대한 완전한 솔루션을 제공하지 않습니다.

그것을 구현하는 방법에 대한 아이디어가 있습니까? 또는 "텍스트로 붙여 넣기"버튼을 자동으로 활성화하는 방법은 무엇입니까?

감사합니다

답변:


59

편집 : 이 솔루션은 버전 3.x 용이며 4.x 버전의 경우 @Paulo Neves의 답변을 읽으십시오.

문제는 붙여 넣기 플러그인이 모든 붙여 넣기에서 일반 텍스트 붙여 넣기를 자동으로 재설정한다는 것입니다. 따라서 우리가해야 할 일은 다시 설정하는 것입니다. 다음 코드가 도움이 될 것입니다.

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

....
});

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;
            });
        }
    }

이제는 항상 평범 할 것입니다.


내가 작업 예제를 만든 붙여 넣기 플러그인이 없기 때문이라고 생각합니다. 92.248.232.12/tinymce/examples/simple.html tinyMCE.init ({... oninit : "setPlainText", plugins : "paste".. ..});
er-v

5
좋은 대답이지만 "ed"의 정의와 관련된 JS 오류가 있음을 발견했습니다. 이것은 tinyMCE.get ( "elm1") 행을 제거하고 ed를 setPlainText 메소드의 첫 번째 매개 변수로 두는 것만으로 간단하게 수정할 수 있습니다. 예 : "function setPlainText (ed) {...".
drmonkeyninja 2012

8
이후 버전의 tinymce에서는이를 처리하기 위해 몇 가지 옵션이 추가되었습니다. paste_text_sticky_default: true그리고 paste_text_sticky: true당신의 설정에 트릭을 할해야합니다. (I는 3.5.0.1을 사용하고 있습니다)
그렉

@ er-v 양식을 사용하여 tinyMCE 형식의 문자열을 유지하는 방법에 대한 제안 : stackoverflow.com/questions/17247900/…
codeObserver

13
방금 시도해 보았고 .init({ plugins: ["paste"], paste_as_text: true })추가 기능없이 TinyMCE 4.1에서 매력처럼 작동합니다.
Rémi Breton

149

tinyMCE 3X 또는 4X의 경우 상황이 약간 변경되었습니다. 이제 이것을 할 수 있고 잘 작동합니다.

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

5
예, 다른 접근법은 작동하지 않았지만 작동합니다.
Tim

2
@Tim이 질문의 답변에 표시된 접근 방식은 특정 TinyMCE 3.x입니다. TinyMCE 4 이상을 사용하는 경우이 답변의 접근 방식이 적합합니다.
Leonardo Montenegro

TinyMCE에는 거의 모든 것에 대한 플러그인이나 옵션이 있습니다. 그것이 최고라는 것은 당연합니다!
supersan

1
해결 해주셔서 감사합니다. 그러나 이것은 실제로 플러그인이 업데이트 될 때마다 구성 파일을 편집해야한다는 것을 의미합니까?
Mike

84

이 코드로이 문제를 해결했습니다.

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

11
그만한 가치에 대해서는 귀하의 솔루션이 선택한 답변보다 낫다고 생각합니다.
arikfr 2010

@Dariusz Lyson, 양식을 사용하여 tinyMCE 형식의 문자열을 유지하는 방법에 대한 제안? : stackoverflow.com/questions/17247900/…
codeObserver

9
onInit속성 ed이 정의되지 않은 자바 스크립트 오류가 발생 합니다. Unable to get property 'add' of undefined or null reference
Tim

35

이 문제를 직접 만났고 TinyMCE 3.4.2부터 간단하게 다음을 수행 할 수 있음을 발견했습니다.

paste_text_sticky: true,
paste_text_sticky_default: true

... 좋았습니다.


2
이 구성 옵션에 +1, 플러그인 배열에 붙여 넣기 플러그인을 추가하는 것을 잊지 마십시오!
Fredszaq

3
이 접근 방식을 사용할 때 편집기는 여전히 일반 텍스트 이외의 붙여 넣기를 허용합니다.
Tim

7

가장 쉬운 방법은 다음과 같습니다.

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

1

사용하는 것이 더 낫지 않습니까?

var ed = tinyMCE.activeEditor;

대신에:

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

나는 ( 'elm2로')를 GET 대신 activeEditor를 사용하여 내 스크립트 작업을 할 수 있었다, 동의, 나는 또한 코드 + 코드는 대답으로 받아 그것은 큰 노력하고 내 대답에 게시
GibboK

이것은 er-v의 대답에 대한 의견입니다 . 이것은 질문에 대한 답을 제공하지 않습니다. 충분한 평판얻으면 모든 게시물댓글 수 있습니다 .
모든 근로자는 필수입니다.

1

참고로 TinyMCE는 붙여 넣기 플러그인의 기본 옵션으로 구현하여이를 개선했습니다. 더 많은 정보 : http://www.tinymce.com/wiki.php/Plugin:paste

그러나 여전히 완벽하지는 않습니다. 따라서 여기에 모든 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', '');
            });

        },

출처 : http://www.tinymce.com/forum/viewtopic.php?pid=60121#p60121


1

플러그인없이 : 붙여 넣기 이벤트 듣기, 클립 보드 데이터 가져 오기

어떤 이유로 든 플러그인을 사용할 수 없거나 사용하지 않으려는 경우 다음과 같이 "일반 텍스트로 붙여 넣기"콜백 함수를 만들 수 있습니다.

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);
        });
    }
});

참고 : 이것은 TinyMCE 3.5.x 용으로 생성되었습니다. 호환성은 버전에 따라 다를 수 있습니다.


1
3.x를위한 우수한 솔루션 - 다른 응답의 아무도 내 사건에서 일하고 있었다
롤프 페드로 언 스트

1

.yml 파일을 사용하는 경우 플러그인을 추가 paste하고paste_as_text: true

default:
  plugins:
    - paste
  paste_as_text: true

-1

"일반 텍스트로 붙여 넣기"가 실제로 텍스트를 창에 추가하기 전에 정리를 수행하기 때문에 이것이 가능한지 확실하지 않습니다. 창에 데이터를 붙여 넣기 만하면 아무 작업도 수행 할 수 없습니다. ( onChange또는 무언가에 연결하지 않는 한 ) 그러나 이미 붙여 넣은 코드를 수정하여 '이중 수정'하게 될 수 있습니다.


-1

나는 다음과 같이했다.

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;
        });
    }
};

그리고:

tinyMCE.init({
    // ...
    plugins: "paste",
    oninit: pastePlainText // Note, without "
    // ...
})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.