当其内容超过x高度时,如何将节点从contentEditable div动态移动到另一个?

我正在尝试制作一个简单的wyswyg原型,该原型使用contentEditable div来模仿A4页面的概念。 所以我当前的代码是这样的:

HTML:

<div id="editor">
            <div contenteditable="true" class="page" id="page-1">
                <b>hello</b>
            </div>
        </div>

CSS:

#editor{
                background-color: gray;
                border: 1px black;
                padding: 1em 2em;
            }
            .page{
                background-color: white;
                border: solid black;
                padding: 1em 2em; 
                width:595px;
                height:841px;
                word-wrap: break-word;
                overflow-wrap: break-word;
                white-space: normal;
            }

JS:

//force br
document.execCommand("DefaultParagraphSeparator",false,"br");
const a4 = {
    height: 841,width: 595
};
document.getElementById('editor').addEventListener('input',function(e) {
    let getchildrenHeight = function(element) {
        total = 0;
        if (element.childNodes) {
            for (let child of element.childNodes) {
                switch (child.nodeType) {
                    case Node.ELEMENT_NODE:
                        total += child.offsetHeight;
                        break;
                    case Node.TEXT_NODE:
                        let range = document.createRange();
                        range.selectNodeContents(child);
                        rect = range.getBoundingClientRect();
                        total += (rect.bottom - rect.top);
                        break;
                }
            }
        }
        return total;
    };
    let pages = document.getElementsByClassname('page');
    for (let i in pages) {
        let page = pages[i];
        //remove empty page    
        if (page.offsetHeight == 0 && i > 1) {
            page.remove();
        }
        let childrenHeight = getchildrenHeight(page);
        while (childrenHeight > a4.height) {
            //recursively try to fit elements on max size 
            //removing/pushing excedents elements to the next div (aka page)
            let excedents = [];
            let children = page.childNodes;
            let children_length = children.length - 1;
            let backup = children[children_length].cloneNode(true);
            children[children_length].remove();
            if (pages.item(i + 1) === null) {
                var newPage = page.cloneNode(true);
                newPage.innerHTML = '';
                newPage.appendChild(backup);
                page.parentNode.appendChild(newPage);
            } else {
                page.item(i + 1).insertBefore(backup,page.item(i + 1).childNodes[0]);
            }
            //console.log(children[i].innerHTML);
        }
    }
});

不幸的是,结果与我预期的不同。 当超过一页的高度时,首页上的所有内容都会被删除,而不是我想要的:

  1. 多余的部分将移至下一页。
  2. 并且当某个页面没有孩子时,该页面将被删除。

类似于非常原始的microsoft Word多页编辑器。

该怎么做? 提前致谢 塞尔索(Celso)

mzpywen 回答:当其内容超过x高度时,如何将节点从contentEditable div动态移动到另一个?

您的代码是一个好的开始,但是还有一些需要解决的问题:

  • 您正在尝试使用for..in循环遍历HTMLCollection,这将访问集合中的lengthitemnamedItem(只需尝试{{1} })
  • 您正在尝试在for(let i in document.getElementsByClassName('page')) console.log(i);为0时删除空白页,而是尝试offsetHeight

  • 您可以与if语句交换while循环

  • 您还必须检查当前页面上是否有足够的空白,以便从下一页退回行
  • 此外,您还必须手动处理分页符上的光标位置

我做了codepen来演示我建议的更改。它远非完美,但可以处理页面删除和多余的删除。

本文链接:https://www.f2er.com/3169974.html

大家都在问