Maison >interface Web >js tutoriel >Comment insérer du HTML au niveau du curseur dans un Div ContentEditable ?

Comment insérer du HTML au niveau du curseur dans un Div ContentEditable ?

DDD
DDDoriginal
2024-11-11 03:42:02730parcourir

How to Insert HTML at the Cursor in a ContentEditable Div?

Insérer du HTML au niveau du curseur dans un Div ContentEditable

Lorsque vous travaillez avec un div qui permet l'édition, vous souhaiterez peut-être insérer du HTML directement à le curseur. Alors que des méthodes telles que insertText() peuvent ajouter du texte brut, les navigateurs affichent généralement le HTML inséré de cette manière sous forme de texte plutôt que de l'exécuter.

Pour surmonter cette limitation, une approche plus élaborée est nécessaire. Une solution consiste à exploiter la méthode insertNode() de l’objet Range. Cependant, IE8 et versions antérieures s'appuient sur pasteHTML().

Implémentation

La fonction suivante gère l'insertion HTML dans les principaux navigateurs :

function pasteHtmlAtCaret(html) {
  // Obtain the selection range
  var sel, range;
  if (window.getSelection) {
    // For non-IE browsers
    sel = window.getSelection();
    range = sel.getRangeAt(0);
  } else if (document.selection) {
    // For IE8 and below
    range = document.selection.createRange();
  }

  // Delete existing content in the range
  range.deleteContents();

  // Create an element to hold the HTML
  var el = document.createElement("div");
  el.innerHTML = html;
  
  // Create a fragment to insert
  var frag = document.createDocumentFragment();

  // Loop through elements in the div
  while ((node = el.firstChild)) {
    frag.appendChild(node);
  }
  
  // Insert the fragment into the range
  range.insertNode(frag);

  // Position the caret after the inserted content
  range = range.cloneRange();
  range.setStartAfter(frag.lastChild);
  range.collapse(true);
  if (sel) sel.removeAllRanges();
  if (sel) sel.addRange(range);
}

Amélioration

Sur la base des demandes des utilisateurs, une version mise à jour avec un paramètre supplémentaire a été développé :

function pasteHtmlAtCaret(html, selectPastedContent) {
  // ... (same as before)

  // Modify based on parameter
  if (selectPastedContent) {
    range.setStartBefore(frag.firstChild);
  } else {
    range.collapse(true);
  }

  // Update the selection
  sel.removeAllRanges();
  sel.addRange(range);
}

Lorsqu'il est défini sur true, ce paramètre vous permet de sélectionner le contenu inséré lors de l'exécution.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn