在 dom 树中的特定位置推送动态创建的删除元素

Posted

技术标签:

【中文标题】在 dom 树中的特定位置推送动态创建的删除元素【英文标题】:pushing dynamically created dropped elements at the particular position in the dom tree 【发布时间】:2018-03-24 00:12:41 【问题描述】:

大家好,我有一个关于拖放的问题。我正在创建一个仅通过使用拖放来创建网站的应用程序。我有点坚持实现一个功能,在该功能中,用户可以将元素放置在特定位置,并且该放置元素下方的元素会移动到下方。现在的问题是元素是动态生成的 例如。在右侧面板中有不同的图像形式的组件,当我拖动这些元素时,我传递了一些元数据,当元素被删除时,基于元数据创建一个 html 元素。

<div class="drop-zone">
   <div>
     <!--container 1-->
   </div>
     <!-- now i want to drop that element in between which is generated dynamically -->
   <div>
     <!--container 2-->
   </div>
</div>

**********************编辑************************************

在下面的代码头中放置的是将被拖动的指令,JSONfn与用于字符串化函数的JSON对象相同

(function()
define(['../../../../app','./../service/header.factory.js'],function(app)
    app.directive('headerDrop',['HeaderFactory',function(HeaderFactory)
        return 
            restrict: "E",
            replace: false,
            scope: ,
            link: function(scope,element,attrs) 
                element.on('dragstart',function(e)
                   e.originalEvent.dataTransfer.setData("data",JSONfn.stringify(HeaderFactory));
                );
            ,
            template: "<img id='header' draggable='true' src='/src/create_template/images/noimage.jpg' width='100' height='100'> </img>"
        
    ]);
    app.directive('dragContainer',function()
        return 
            restrict: "E",
            replace: false,
            scope: ,
            template: "<div id='elements-container'> <h1 style='text-align:center;'> All </h1><header-drop> </header-drop> </div>"
        
    );
);

)()

控制器内部

element.on('drop',function(event)
        console.log(event);
        if(event.target.className !== "drop-zone")
            event.preventDefault();
            return false;
        
        var data = JSONfn.parse(event.originalEvent.dataTransfer.getData("data"));
        if(data.type=="header")
            var heading = document.createElement("h1");
            console.log("client height" , heading.clientWidth);
            heading.innerHTML = data.textValue;
            //console.log("pageY",event.pageY);
            //console.log("pageX",event.pageX);
            heading.style.position = "relative";
            heading.style.top = ((event.pageY/window.innerHeight)*100)+ "%";
            heading.className = "editable";
            event.target.appendChild(heading);
            heading.style.top = event.clientY;
            addingEvents();
        
    );

【问题讨论】:

“元数据”是指评论节点吗? 元数据是指使用 dataTransfer 传递的数据,如果它是我必须创建的标头,那么我将传递一个字符串“标头”,并基于我传递的数据我从组件屏幕拖动一个元素我生成 html 元素 代码有什么问题? 就像我提到的用例有点通用,如果我有两个 div 并且我在这两个 div 之间放置一个元素,我希望 div 向下移动,但问题是我不知道放置元素的高度,直到它在 dom 上创建,所以我将如何确定需要移动多少元素。您可以看到它类似于通过拖放在数组中添加一个数字,然后用单词 dom 替换数组,用 html 元素替换数字 “那么我如何才能知道需要移动多少元素” 为什么在将元素附加到 DOM 时不执行 procudeure?跨度> 【参考方案1】:

虽然我后来找到了答案,但我实际上用一种天真的方法解决了这个问题。

我正在制作一个模板生成器,所以这种方法对我有用

天真的方法

我所做的是,每当我放下元素时,我在元素上方的高度为 5px 的设计器内又放下了一个块,有点像

<div class="adjacent-block"> </div> inside css .adjacent-block min-height: 5px; 
<div class="dropped-block"> </div>

然后将该元素放到相邻块内。

缺点:你还要跟踪相邻的块

上述方法非常可悲,我不建议任何人这样做

更简单更好的方法:

在 dragover 事件中,只需检查元素是否在另一个元素之上,然后根据鼠标从该元素中间的位置放置元素之前或之后的块。

我还没有实施这种方法,但我很确定这会奏效

【讨论】:

以上是关于在 dom 树中的特定位置推送动态创建的删除元素的主要内容,如果未能解决你的问题,请参考以下文章

元素在DOM树中的绝对位置

使用javascript在dom树中向上或向下移动一个元素

js···DOM2动态创建节点

如何用jquery创建一个dom元素?

JQuery动态创建删除DOM元素

jQuery动态创建的元素为啥不能绑定事件