AnnLior commited on
Commit
ee0f2e8
·
verified ·
1 Parent(s): 8e6f06f

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +41 -5
index.html CHANGED
@@ -262,21 +262,57 @@ function plainToHtml(text) {
262
  .map(l => l ? '<div>' + esc(l) + '</div>' : '<div><br></div>').join('');
263
  }
264
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
265
  function insertFromData(dt) {
266
  const html = dt.getData('text/html');
267
  const text = dt.getData('text/plain');
268
- const clean = html ? sanitizeHtml(html) : plainToHtml(text);
269
- document.execCommand('insertHTML', false, clean || plainToHtml(text));
 
 
 
 
 
270
  }
271
 
272
  input.addEventListener('paste', e => {
273
  e.preventDefault();
274
- insertFromData(e.clipboardData);
 
 
 
 
 
275
  });
276
  input.addEventListener('drop', e => {
277
  e.preventDefault();
278
- input.focus();
279
- insertFromData(e.dataTransfer);
280
  });
281
 
282
  /* ================== Извлечение текста + форматирования из редактора ================== */
 
262
  .map(l => l ? '<div>' + esc(l) + '</div>' : '<div><br></div>').join('');
263
  }
264
 
265
+ // Вставка HTML в позицию курсора без execCommand (он в ряде браузеров молча ничего не делает)
266
+ function insertHtmlAtCursor(html) {
267
+ input.focus();
268
+ const sel = window.getSelection();
269
+ let range;
270
+ if (sel.rangeCount && input.contains(sel.getRangeAt(0).commonAncestorContainer)) {
271
+ range = sel.getRangeAt(0);
272
+ } else {
273
+ range = document.createRange();
274
+ range.selectNodeContents(input);
275
+ range.collapse(false);
276
+ }
277
+ range.deleteContents();
278
+ const tpl = document.createElement('template');
279
+ tpl.innerHTML = html;
280
+ const frag = tpl.content;
281
+ const last = frag.lastChild;
282
+ range.insertNode(frag);
283
+ if (last) {
284
+ const r = document.createRange();
285
+ r.setStartAfter(last);
286
+ r.collapse(true);
287
+ sel.removeAllRanges();
288
+ sel.addRange(r);
289
+ }
290
+ }
291
+
292
  function insertFromData(dt) {
293
  const html = dt.getData('text/html');
294
  const text = dt.getData('text/plain');
295
+ let clean = '';
296
+ if (html) {
297
+ try { clean = sanitizeHtml(html); }
298
+ catch (err) { console.error('Ошибка очистки HTML, вставляю как простой текст', err); }
299
+ }
300
+ if (!clean) clean = plainToHtml(text);
301
+ insertHtmlAtCursor(clean);
302
  }
303
 
304
  input.addEventListener('paste', e => {
305
  e.preventDefault();
306
+ try {
307
+ insertFromData(e.clipboardData);
308
+ } catch (err) {
309
+ console.error('Ошибка вставки', err);
310
+ try { insertHtmlAtCursor(plainToHtml(e.clipboardData.getData('text/plain'))); } catch (_) {}
311
+ }
312
  });
313
  input.addEventListener('drop', e => {
314
  e.preventDefault();
315
+ try { insertFromData(e.dataTransfer); } catch (err) { console.error(err); }
 
316
  });
317
 
318
  /* ================== Извлечение текста + форматирования из редактора ================== */