1
+ <!DOCTYPE html>
2
+ < html lang ="en ">
3
+
4
+ < head >
5
+ < meta charset ="UTF-8 ">
6
+ < meta name ="viewport " content ="width=device-width, initial-scale=1.0 ">
7
+ < title > Clipboard Format Checker</ title >
8
+ < script >
9
+ const isClipboardChangeEventAvailable = true ;
10
+
11
+ async function checkClipboard ( ) {
12
+ try {
13
+ console . log ( "Clipboard changed!" ) ;
14
+ const clipboardItems = await navigator . clipboard . read ( ) ;
15
+ let formats = { } ;
16
+
17
+ for ( const item of clipboardItems ) {
18
+ if ( item . types . includes ( 'text/plain' ) ) {
19
+ const textBlob = await item . getType ( 'text/plain' ) ;
20
+ const text = await textBlob . text ( ) ;
21
+ document . getElementById ( 'clipboardText' ) . innerText = text ;
22
+ formats . text = true ;
23
+ }
24
+ else {
25
+ document . getElementById ( 'clipboardText' ) . innerText = "N/A" ;
26
+ }
27
+ if ( item . types . includes ( 'image/png' ) || item . types . includes ( 'image/jpeg' ) ) {
28
+ const imgBlob = await item . getType ( item . types . find ( type => type . startsWith ( 'image/' ) ) ) ;
29
+ const imgUrl = URL . createObjectURL ( imgBlob ) ;
30
+ document . getElementById ( 'clipboardImg' ) . innerHTML = `<img src="${ imgUrl } " alt="Clipboard Image" width="150">` ;
31
+ formats . img = true ;
32
+ }
33
+ else {
34
+ document . getElementById ( 'clipboardImg' ) . innerText = "N/A" ;
35
+ }
36
+ if ( item . types . includes ( 'text/html' ) ) {
37
+ const htmlBlob = await item . getType ( 'text/html' ) ;
38
+ const html = await htmlBlob . text ( ) ;
39
+ document . getElementById ( 'clipboardHtml' ) . innerText = html ;
40
+ formats . html = true ;
41
+ }
42
+ else {
43
+ document . getElementById ( 'clipboardHtml' ) . innerText = "N/A" ;
44
+ }
45
+ }
46
+
47
+ document . getElementById ( 'pasteText' ) . disabled = ! formats . text ;
48
+ document . getElementById ( 'pasteImg' ) . disabled = ! formats . img ;
49
+ document . getElementById ( 'pasteHtml' ) . disabled = ! formats . html ;
50
+ } catch ( err ) {
51
+ console . error ( 'Failed to read clipboard contents: ' , err ) ;
52
+ }
53
+ }
54
+
55
+
56
+ if ( isClipboardChangeEventAvailable ) {
57
+
58
+ // Try to read the clipboard to trigger a permissions prompt if required.
59
+ navigator . clipboard . readText ( ) . then ( ( ) => {
60
+
61
+ console . log ( "Clipboard read permission granted" ) ;
62
+
63
+ // Invoke the on clipboardchange handler on page load to initialize current UI state
64
+ checkClipboard ( ) ;
65
+
66
+ // Start listening to the clipboardchange event
67
+ navigator . clipboard . addEventListener ( "clipboardchange" , checkClipboard ) ;
68
+ } ) ;
69
+
70
+ }
71
+ else {
72
+ // Invoke the on clipboardchange handler on page load to initialize current UI state
73
+ checkClipboard ( ) ;
74
+ // Since clipboardchange event is not available, fallback to polling
75
+ setInterval ( checkClipboard , 2000 ) ;
76
+ }
77
+ </ script >
78
+ </ head >
79
+
80
+ < body >
81
+ < h1 > Clipboardchange event demo app - Paste formats viewer</ h1 >
82
+ < p >
83
+ This HTML application demonstrates the use of the clipboardchange event to monitor
84
+ and display clipboard data in various formats. The app listens for changes to the
85
+ clipboard using the clipboardchange event. It then displays the clipboard data in a table
86
+ with columns for Text, Image, and HTML formats.
87
+ < br />
88
+ When the clipboard content changes, the app updates the table to show the current clipboard data.
89
+ The app includes buttons for pasting clipboard data as Text, Image, and HTML.
90
+ These buttons are initially disabled and are enabled based on the available clipboard formats.
91
+
92
+ </ p >
93
+ < hr />
94
+ < button id ="pasteText " disabled > Paste as Text</ button >
95
+ < button id ="pasteImg " disabled > Paste as Image</ button >
96
+ < button id ="pasteHtml " disabled > Paste as HTML</ button >
97
+ < br />
98
+ < hr />
99
+ < table border ="1 ">
100
+ < thead >
101
+ < tr >
102
+ < th > Text</ th >
103
+ < th > Image</ th >
104
+ < th > HTML</ th >
105
+ </ tr >
106
+ </ thead >
107
+ < tbody >
108
+ < tr >
109
+ < td id ="clipboardText "> N/A</ td >
110
+ < td id ="clipboardImg "> N/A</ td >
111
+ < td id ="clipboardHtml "> N/A</ td >
112
+ </ tr >
113
+ </ tbody >
114
+ </ table >
115
+ </ body >
116
+
117
+ </ html >
0 commit comments