Как да получите елемента на изображението след вмъкване с помощта на execCommand?

Има ли някакъв начин да получим елемента на изображението, след като вмъкнем изображението с помощта на execCommand? например

e.execCommand('insertimage',0,'ronaldo.png')

person Najib Razak    schedule 20.09.2012    source източник


Отговори (3)


Не използвайте insertimage, използвайте обикновен стар insertHTML и дайте ID на елемента, който вмъквате, за да можете да го препратите по-късно. т.е.

function insertHTML(img) {
  var id = "rand" + Math.random();
  var doc = document.getElementById("editor");
  doc = doc.document ? doc.document : doc.contentWindow.document;
  img = "<img src='" + img + "' id=" + id + ">";

  if(document.all) {
    var range = doc.selection.createRange();
    range.pasteHTML(img);
    range.collapse(false);
    range.select();
  } else {
    doc.execCommand("insertHTML", false, img);
  }
  return doc.getElementById(id);
};
person Kernel James    schedule 03.07.2013
comment
Добро предложение, въпреки че бих се отклонил от използването на document.all. - person Tim Down; 03.07.2013
comment
Но това ще работи ли в IE? В документацията за execCommand се казва, че insertHTML не работи в IE. - person Abhishek; 14.10.2015
comment
проблемът с тази техника е, че потребителят ще трябва да ИЗБЕРЕ част от текста, преди insertHTML да може да бъде изпълнен... - person oldboy; 13.11.2017
comment
Това решение е уязвимо към XSS - person Alvaro Montoro; 27.01.2018
comment
@AlvaroMontoro, можеш ли да обясниш как е уязвим към XSS? - person David Frick; 07.10.2020

Можете да използвате факта, че браузърите поставят каретката веднага след вмъкнатото изображение и да работите обратно от там. Следното изисква DOM Range и поддръжка за избор, което изключва IE ‹= 8, но ако това е важно, можете да използвате библиотека като моята собствена Rangy, за да запълни тази празнина.

Демо: http://jsfiddle.net/xJkuj/

Код:

function previousNode(node) {
    var previous = node.previousSibling;
    if (previous) {
        node = previous;
        while (node.hasChildNodes()) {
            node = node.lastChild;
        }
        return node;
    }
    var parent = node.parentNode;
    if (parent && parent.nodeType.hasChildNodes()) {
        return parent;
    }
    return null;
}

document.execCommand("InsertImage", false, "http://placekitten.com/200/300");

// Get the current selection
var sel = window.getSelection();
if (sel.rangeCount > 0) {
    var range = sel.getRangeAt(0);
    var node = range.startContainer;
    if (node.hasChildNodes() && range.startOffset > 0) {
        node = node.childNodes[range.startOffset - 1];
    }

    // Walk backwards through the DOM until we find an image
    while (node) {
        if (node.nodeType == 1 && node.tagName.toLowerCase()  == "img") {
            alert("Found inserted image with src " + node.src);
            break;
        }
        node = previousNode(node);
    }
}
person Tim Down    schedule 27.06.2013
comment
Добър отговор, но има ли по-просто решение? - person frogatto; 28.06.2013
comment

За да изпълните самостоятелно приложение в Java, не е необходимо да има война. Един буркан е достатъчен. Войната съдържа информация за това как уеб архив/приложение трябва да бъде внедрено в J2EE контейнер. Когато го стартирате самостоятелно, това не е необходимо. Основният метод ще бъде достатъчен. Можете да разгледате приставката за нюанс на maven. Ще ви помогне да изградите течащ буркан.

(Като странична бележка - изпълняваемият буркан е доста просто нещо. Файлът на манифеста на файла буркан трябва да съдържа ключа MainClass и това е.)

- person Tim Down; 28.06.2013
comment
@ABFORCE: Мисля, че отговорът на Kernel James е по-добър. - person Tim Down; 03.07.2013

Това е моят начин:

e.execCommand('insertimage', 0, URI) // image's URI
image=$('img[src="'+URI+'"]').not('.handled').addClass('.handled');

//.not('.handled').addClass('.handled') is needed if there are many images with the same URI
person user3076450    schedule 23.01.2017