Removing resize handlers on contentEditable div

前端 未结 7 1940
一整个雨季
一整个雨季 2020-12-06 02:46

I created a contentEditable div to use as a rich textarea. It has resize handlers around it that I\'d like to get rid of. Any idea how I\'d do this?

Edit: This app

相关标签:
7条回答
  • 2020-12-06 03:13

    Have you tried adding the style

    border: none;
    

    to the div?

    0 讨论(0)
  • 2020-12-06 03:14

    for IE11 (I havn't tested the older versions of IE, but I feel like it would work) you can add contenteditable="false" attribute to the img tag. This will prevent any re-sizing from being done while keeping drag and drop in place.

    0 讨论(0)
  • 2020-12-06 03:20

    In Chrome 39, these handles don't seem to exist, even if you wanted them to.

    In Firefox, one can simply use execCommand, like ZoogieZork answered.

    But in Internet Explorer this can't be turned off. It must be worked around.

    In WYMeditor development, here's what I've found.

    The following results in:

    • In IE, the resize UI shows up for a split second and then disappears. There seems to be no way for the user to use it.
    • Images are text selected on mouseup
    • Ability to drag images. In some browsers, they may have to be selected before dragging. As written in the previous item, a simple mouseup will result in an image being selected.
    • Images are selected using text selection and not "control selection" (that which provides the resize UI).

    This is the best I could come up with after hours of very deep breaths. I think it is good enough if you really want to get rid of those handles.

    In IE, Setting oncontrolselect to return false on the image, really does prevent those handles from appearing, and you can do it cleverly, by attaching the following handler to the mousedown event:

    function (evt) {
        var img;
    
        function returnFalse() {
            return false;
        }
    
        if (evt.tagName.toLowerCase() === "img") {
            img = evt.target;
            img.oncontrolselect = returnFalse;
        }
    }
    

    It actually doesn't work completely well. The reason that it didn't work very well is that in order to begin a drag and drop operation on the image, one had to press and hold the mouse, without moving it, for a split second, and only then begin moving it for the drag. If one pressed the mouse and immediately began dragging, the image would remain in its place and not be dragged.

    So I didn't do that.

    What I did is the following. In all browsers, I used mouseup to text select the target image exclusively. In non-IE and IE11, synchronously:

    function (evt) {
        if (evt.target.tagName.toLowerCase() === "img") {
            selectSingleNode(img); // In my case, I used Rangy
        }
    }
    

    In IE 7 through 10, asynchronously:

    function (evt) {
        if (evt.target.tagName.toLowerCase() !== "img") {
            return;
        }
    
        window.setTimeout(function () {
            selectSingleNode(img); // In my case, I used Rangy
        }, 0);
    }
    

    This made sure that after those handles show up, they disappear ASAP, because the image loses its "control selection" because that selection is replaced with a regular text selection.

    In Internet Explorer 7 through 11, I attached a handler to dragend that removes all selection:

    function (evt) {
        if (evt.target.tagName.toLowerCase() === "img") {
            deselect(); // I use Rangy for this, as well
        }
    }
    

    This makes the handles that show up after drag and drop, disappear.

    I hope this helps and I hope you can make it even better.

    0 讨论(0)
  • 2020-12-06 03:28

    I just face that problem. I tried document.execCommand("enableObjectResizing", false, false); but, the move icon was still appearing. What just fix my problem was just e.preventDefault() when onmousedown event occurs.

    element.onmousedown = function(e){
           e.preventDefault();
    }
    
    0 讨论(0)
  • 2020-12-06 03:32

    Just as a side note, you can disable Firefox's automatic resize handle feature by sending the (somewhat poorly-documented) enableObjectResizing command to the document:

    document.execCommand("enableObjectResizing", false, false);
    

    AFAIK, this can only safely be done once the document has loaded, and there's no way I know of to disable the grabber, which is a separate feature.

    0 讨论(0)
  • 2020-12-06 03:34

    ... just the best fix ever

    <div contenteditable="true">
        <label contenteditable="false"><input/></label>
    </div>
    

    or any html element that wraps your input/img

    Works on IE11 like a charm

    0 讨论(0)
提交回复
热议问题