こんな感じでアプリケーション独自のコピー処理を実装していました。
document.addEventListener('copy', (clipboardEvent) => { // アプリケーション独自の情報をクリップボードに書き込む clipboardEvent.clipboardData.setData('text/plain', 'こんにちわ') clipboardEvent.preventDefault() })
すると、ふつうのinput type="text" で文字列がコピペ出来なくなるんですよ。 なので、次のようなガード条件を追加して、input type="text"を対象から除外します。
if(clipboardEvent.target instanceof HTMLInputElement) { return; }
例えば下の例です。 input type="text"の文字列をコピーすると普通にコピーできます。 textareaの文字列をコピーすると決まった文字しかコピー出来ません。
See the Pen コピーイベントのハンドリング by shigeru.nakajima (@ledsun) on CodePen.
実際にクリップボードイベントを扱うときはinput type="text"とtexteareaを両方除外したくなります。 このグループを表す良い名前を探します。
最初はcontentEditableがそれっぽいかな?と思いました。 contentEditableはinputやtexteareaには適用出来ません。 つまり、これは背反したグループです。
で、考え出したのがText Fieldsという名前です。 こんな感じの関数を作ってガード条件に使えばいいな、と思いました。
function isTextFields(htmlElement) { return ( htmlElement instanceof HTMLInputElement || htmlElement instanceof HTMLTextAreaElement ) }