Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定位的类型确实影响了我的JavaScript_Javascript_Html_Css_Drag And Drop_Position - Fatal编程技术网

定位的类型确实影响了我的JavaScript

定位的类型确实影响了我的JavaScript,javascript,html,css,drag-and-drop,position,Javascript,Html,Css,Drag And Drop,Position,我目前正在制作一个拖放JavaScript引擎。我目前正在制作一个“边界”功能,以便拖动对象由类为.bound的容器边界。当我创建拖动对象时,我还会发现它是否有边界: function makeObj(e) { obj = new Object(); obj.element = e; obj.boundX = e.parentNode.offsetWidth - e.offsetWidth; obj.boundY = e.parentNode.offsetHei

我目前正在制作一个拖放JavaScript引擎。我目前正在制作一个“边界”功能,以便拖动对象由类为
.bound
的容器边界。当我创建拖动对象时,我还会发现它是否有边界:

function makeObj(e) {
    obj = new Object();
    obj.element = e;

    obj.boundX = e.parentNode.offsetWidth - e.offsetWidth;
    obj.boundY = e.parentNode.offsetHeight - e.offsetHeight;

    obj.posX = event.clientX - e.offsetLeft;
    obj.posY = event.clientY - e.offsetTop;

    var curleft = curtop = 0;
    if (e.offsetParent) {
        do {
            curleft += e.offsetLeft;
            curtop += e.offsetTop;
            //alert(e.id + ":" + e.innerHTML);
            if(~e.className.search(/bound/)) {
                obj.boundX = curleft - obj.element.offsetLeft;
                obj.boundY = curtop - obj.element.offsetTop;
                return obj;
            }

        } while (e = e.offsetParent);
    }

    return obj;
}
我的循环可以工作,但是设置边界却不行

我希望此html影响函数:

<div id="center" class="bound">
    <h1>Hello World! <hr /></h1>
    <div id="box" class="bound">
        <p class="drag square" id="one"> One </p>
        <p class="drag square" id="two"> Two </p>
    </div>
</div>
如何使
位置:
属性不影响引擎的工作方式-以便任何位置都可以工作。绝对、相对、静态等?如何使我的
.drag
对象具有绝对位置以外的任何位置?

我将在下面发布整个引擎(以及一个JSFIDLE链接),以防它有用:

非常感谢您的阅读和帮助

while (e = e.offsetParent);
应该是

while (e == e.offsetParent); //alternatively, use ===
在类似C语言(如JavaScript)中,=表示“将右侧变量的值放到左侧变量上”。然而,==表示“两侧的值是否匹配?”

JavaScript将除少数内容(如0、空字符串、null和未定义)之外的任何内容视为false,其他内容视为true。因此,表达式
e=e.offsetParent
将始终返回true。
对它进行了测试,并在您发送的JSFIDLE示例上运行。

事实上,我认为他可能需要“=”在那里,因为他正在沿着“offsetParent”元素链前进。他希望它是一个更新“e”的赋值,并且在没有偏移父项(即
e.offsetParent
为空)时作为终止条件。不,
while(e=e.offsetParent)
在这里是正确的
e
被设置为
offsetParent
直到
offsetParent
undefined
如果我错了,请纠正我,但是e在while语句中没有改变,所以它保持不变,offsetParent也是如此。当表达式“e=e.offsetParent”被计算时,@Zirak肯定会改变:-)facepalm duh。很抱歉…现在我更想知道为什么改变它能让它工作。不是那个家伙,但不要重新发明轮子,除非你试图学习一些东西:学习轮子,嗯?在
makeObj
函数中,您使用的
event
未传入,也未传入undefined@Tom,谢谢你成为“那个家伙”——这表明你确实关心帮助。然而,这是我学习JavaScript的第一周(有史以来),所以我正在尝试在进入库之前学习该语言@你说得对。我是否应该添加另一个参数并在其中粘贴事件?尽管如此,它似乎仍然有效。。。
// JavaScript Document

var dragObj;

document.addEventListener("mousedown", down, false);

function down(event) {
    if(~event.target.className.search(/drag/)) {
        dragObj = makeObj(event.target);
        dragObj.element.style.zIndex="100";
        document.addEventListener("mousemove", freeMovement, false);
    }
}

function freeMovement(event) {

    if (typeof(dragObj.element.mouseup) == "undefined")
        document.addEventListener("mouseup", drop, false);
    //Prevents redundantly adding the same event handler repeatedly

dragObj.element.style.left = Math.max(0, Math.min(event.clientX - dragObj.posX, dragObj.boundX)) + "px";
    dragObj.element.style.top = Math.max(0, Math.min(event.clientY - dragObj.posY, dragObj.boundY)) + "px";
}

function drop() {
    dragObj.element.style.zIndex="1";

    document.removeEventListener("mousemove", freeMovement, false);
    document.removeEventListener("mouseup", drop, false);
    //alert("DEBUG_DROP");
}

function makeBoundlessObj(e) {
    obj = new Object();
    obj.element = e;

    obj.boundX = e.parentNode.offsetWidth - e.offsetWidth;
    obj.boundY = e.parentNode.offsetHeight - e.offsetHeight;

    obj.posX = event.clientX - e.offsetLeft;
    obj.posY = event.clientY - e.offsetTop;

    return obj;
}

function makeObj(e) {
    obj = new Object();
    obj.element = e;

    obj.boundX = e.parentNode.offsetWidth - e.offsetWidth;
    obj.boundY = e.parentNode.offsetHeight - e.offsetHeight;

    obj.posX = event.clientX - e.offsetLeft;
    obj.posY = event.clientY - e.offsetTop;

    var curleft = curtop = 0;
    if (e.offsetParent) {
        do {
            curleft += e.offsetLeft;
            curtop += e.offsetTop;
            //alert(e.id + ":" + e.innerHTML);
            if(~e.className.search(/bound/)) {
                obj.boundX = curleft - obj.element.offsetLeft;
                obj.boundY = curtop - obj.element.offsetTop;
                return obj;
            }

        } while (e = e.offsetParent);
    }

    return obj;
}

function findPos(obj) { // Donated by `lwburk` on StackOverflow
    var curleft = curtop = 0;
    if (obj.offsetParent) {
        do {
            curleft += obj.offsetLeft;
            curtop += obj.offsetTop;
        } while (obj = obj.offsetParent);
        return { x: curleft, y: curtop };
    }
}
while (e = e.offsetParent);
while (e == e.offsetParent); //alternatively, use ===