如何用普通的javascript“鼠标滑动”?

时间:2014-01-15 02:52:28

标签: javascript html5 css3 javascript-events mouseevent

我是javascript的新手,我想以某种方式“掌握”它,为了让我这样做,我不想使用任何库[如jQuery]。

话虽如此,我已经找到了几种方法来实现“鼠标滑动”,只需使用javascript:Simulate swipe with mouse in javascript。 但是我发现的帖子中答案总是很浅。

即便如此,所有解决方案都指向:mousedown - > mousemove - >鼠标事件。这就是我正在做的事情。

我为自己设置了一个“掌握”javascript基础的练习:我必须创建一个平面和跨浏览器兼容的界面,这样我就可以保存笔记(在本地存储中)使用只有javascript ,css3和html5(困难的部分是跨浏览器兼容性)。

所以我想到了一个包含2列的简单表:保存注释的标题(第一列)和注释(第二列)。即。

enter image description here

fyi:我试图发布图片,但似乎我对stackoverflow不够流行:“你需要至少10个声望来发布图片”所以我把它设置为普通链接,我希望它很好。

最重要的是桌子。我希望能够“鼠标滑动”表格的行。

这就是我所要做的(我不会把所有的代码,只是我得到的基础知识):

首先:表是一组通过CSS的类;

/*CSS*/
div.table {
    display: table;
}
div.table .row{
    display: table-row;
}
div.table .row .col, div.table .row .col-2{
    display: table-cell;
}

第二:html;

<div id="savedNotesTable" class="table">
    <div class="row">
        <div class="col">Testing</div>
        <div class="col-2">This is a test</div>
    </div>
    <div class="row">
        <div class="col">Testing</div>
        <div class="col-2">This is a test</div>
    </div>
    <div class="row">
        <div class="col">Testing</div>
        <div class="col-2">This is a test</div>
    </div>
</div>

最后但并非最不重要:javascript

function addEvent(element, type, fn){ 
    // custom add event function that cares about compatibility
    // returns fn
}

function removeEvent(element, type, fn){ /*custom remove event function that cares about compatibility and removes only the specific handler*/ }

function addSwipe(element, parent){
    addEvent(element, "mousedown", function(e){
        var mouseupHandler = addEvent(document, "mouseup", mouseUpHandler);
        var mousemoveHandler = addEvent(document, "mousemove", function(e){
            // element.style.position = "static";
            // parent.style.left = e.pageX + 'px';
            // add transition and blur to the element
            // mouseSwipe = absolute value of(originalPosition of mouse - e.pageX)
        });

        function mouseUpHandler(e){
            // pseudocode:
            // if mouseSwipe >= 50%(div size) = delete from the parent which is the "table"
            //  transition and blur OUT to 100% and delete
            // if mouseSwipe < 50%(div size) = don't delete
            //  transition back to 0% and unblur.

            removeEvent(document, "mousemove", mousemoveHandler);
            removeEvent(document, "mouseup", mouseupHandler);
        };
    });     
};

// this is just to add them to the test notes on the html
// The real thing is going to add the swipe when I save the new element
var table = document.getElementById("savedNotesTable");
var notes = table ? table.childNodes : undefined;
for(var prop in notes){
    if(prop != "length" && notes.hasOwnProperty(prop)){
        if(notes[prop].nodeName != "#text"){
            addSwipe(notes[prop], table);
        };
    };
};

我做得对吗?或者还有另一种我没有看到的方式? 我能够在onmousedown事件中找到像div =“absolute”这样的div的位置,但这与表行的宽度和长度相混淆。

我也在寻找最佳实践。

1 个答案:

答案 0 :(得分:1)

关于事件处理程序动态归因的评论

只要您的元素没有被销毁,就不需要删除附加到它的事件处理程序(除非您想完全更改元素的行为,但这种情况相当罕见)。

添加和删除事件处理程序相对昂贵,并且在某些情况下可能导致小内存泄漏。将处理程序保留在原位并稍微修改它们(稍微)以便在所有情况下都能正常工作通常更简单,更安全。

我还认为通过将所有事件绑定放在一个位置,并强制处理程序在所有情况下都能正常运行,它使代码更具可读性。但这是个人品味的问题。

这里的问题是使用mousemove,即使你没有拖动也会触发(即没有按下鼠标按钮时)。

你可以像这样处理(简化代码只是为了证明原理):

function onMouseDown () {
    dragging = true;
}

function onMouseMove () {
    if (!dragging) return; // skip dragging action if mouse button not depressed
    // do your dragging stuff
}

function onMouseUp () {
   dragging = false;
   // do your end of dragging stuff
}

// handlers bound to the element only once
addEvent (element, 'mousedown', onMouseDown);
addEvent (element, 'mousemove', onMouseMove);
addEvent (element, 'mouseup'  , onMouseUp);