質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2687閲覧

contenteditableなdivのpaste処理において、コピー元を判別する方法

h_daido

総合スコア824

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/09/06 07:05

実装したい要件

<div contenteditable="true" id="editor"></div>な要素内でのペースト処理について、以下のような仕様としたいと思っています。

・貼り付け元が同じdiv内の場合 -> そのままhtml形式で貼り付け
・貼り付け元が他のwebサイトなど、異なる場合 -> テキスト形式での貼り付け

理由としては、外部サイトからの貼り付けでスタイルが崩れたりすることが多く、テキスト貼り付けのほうがむしろ便利という声があがっているためです。

その際の「貼り付け元が同じdiv内かどうか?」を判定する方法がわからずに困っています。

試したこと

当初は、以下のようにいけるのでは?とかんがえていました。

javascript

1$('#editor').on('copy', function(event){ 2 // clipboardData(DataTransferオブジェクト)にフラグかなにか持たせようとトライ 3 var clipboardData = window.clipboardData || event.originalEvent.clipboardData; 4 clipboardData.setData('allowOriginalPaste', '1'); // <= ここでセットできなかった 5}); 6 7$('#editor').on('paste', function(event){ 8 // 上記フラグのうむを判別して処理をわけようとトライ 9 var clipboardData = window.clipboardData || event.originalEvent.clipboardData; 10 if(clipboardData.getData('allowOriginalPaste')){ return; } 11 // 以下text形式でのペースト処理 12 ... 13});

ですが、コメントにあるとおり、copyイベントではsetData処理がうまくワークしません。

どなたか知見をお持ちの方がいらっしゃいましたら、ご教示いただけないでしょうか?

参考

外部ライブラリですが、ckEditorなどではこのあたりの処理がワークできているようですが、
訳あってCKEditorが導入できません。(CKEDITOR.DATA_TRANSFER_INTERNALの値で判断している模様)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

完璧でなくていいのであれば(コピー→いったん枠から外れる→貼り付け、とするとテキストになる)、

  • oncopy時にフラグ変数を立てる
  • onblurでそのフラグを落とす
  • onpasteでフラグが「なければ」テキストとして処理

というような流れにすればできるかと思います。

投稿2017/09/06 07:16

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h_daido

2017/09/06 10:01

ありがとうございます。やはりそうなりますよね....。 dataTransfer関連のAPIはもう少し柔軟になってくれたらなぁと思う今日この頃です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問