【问题标题】:Change jQuery click handler functionality更改 jQuery 点击处理程序功能
【发布时间】:2012-05-31 15:00:31
【问题描述】:

我在我的页面中使用拖动和滚动,它与 3 个简单的处理程序 mousedown、mousemove 和 mouseup 一起使用。

现在我有 2 个问题:

  1. 我所有的.on('click'.click( 事件都有点损坏,因为由于 div 是用鼠标滚动的,所以光标停留在同一个对象上并触发事件。如何更改处理程序,使其仅在 mousedown 和 mouseup 之间的 mousemove 距离小于固定值时触发?甚至有可能还是我必须创建一个自己的并更改所有代码? ---已解决---
  2. 我在此拖动和滚动过程中使用event.preventDefault(); 来防止选择。这导致用户无法单击表单字段。有没有简单的方法来解决这个问题,还是我必须以另一种方式停止选择? ---通过变通方法解决---

任何想法都会有所帮助。

这些是用于滚动的 3 个处理程序:

    mouseDownHandler : function(event) {

        if (!$(event.target).closest('.stopscroll').length) {

            event.data.lastCoord = {left: event.clientX, top: event.clientY}; 

            $.event.add( document, "mouseup", dragscroll.mouseUpHandler, event.data );
            $.event.add( document, "mousemove", dragscroll.mouseMoveHandler, event.data );

            $('body').addClass('dragcursor'); //// Add Move Cursor

            if (!$(event.target).closest('.noformelement').length) {
                event.preventDefault();
                return false;
            }
        }

    },

    mouseMoveHandler : function(event) { 
        var delta = {left: (event.clientX - event.data.lastCoord.left), top: (event.clientY - event.data.lastCoord.top)};

        event.data.scrollable.scrollLeft(event.data.scrollable.scrollLeft() - delta.left);

        $('.th-header').css('margin-left', -event.data.scrollable.scrollLeft()); //// Scrollsync with header

        event.data.scrollable.scrollTop(event.data.scrollable.scrollTop() - delta.top);

        event.data.lastCoord={left: event.clientX, top: event.clientY}

        if (!$(event.target).closest('.noformelement').length) {
            event.preventDefault();
            return false;
        }

    },

    mouseUpHandler : function(event) {
        $.event.remove( document, "mousemove", dragscroll.mouseMoveHandler);
        $.event.remove( document, "mouseup", dragscroll.mouseUpHandler);

        $('body').removeClass('dragcursor');

        if (!$(event.target).closest('.noformelement').length) {
            event.preventDefault();
            return false;
        }
    }

Update/Bump:我猜只需一次禁用每个点击事件就可以解决问题。我试过$(document).on('click', '*', function() {return false;});,但它不起作用......

【问题讨论】:

  • 向我们展示您尝试过的代码,然后 v 才能提供帮助
  • 添加了拖动和滚动的 3 个处理程序。
  • 好吧,对于问题 2,您可以使用 event.target 来检查它是否不是表单元素(输入/选择/文本区域),然后使用 preventDefault()
  • 我可以检查 event.target 是否是一个表单字段还是我必须为每个表单元素添加一个类?

标签: javascript jquery html


【解决方案1】:

解决了

mouseDownHandler : function(event) {

    if (!$(event.target).closest('.stopscroll').length) {

        event.data.lastCoord = {left: event.clientX, top: event.clientY}; 
        event.data.startCoord = {left: event.clientX, top: event.clientY};
        event.data.allowClick = true;
        $('*').off('click.stop');

        $.event.add( document, "mouseup", dragscroll.mouseUpHandler, event.data );
        $.event.add( document, "mousemove", dragscroll.mouseMoveHandler, event.data );

        if (!$(event.target).closest('.noformelement').length) {
            event.preventDefault();
            return false;
        }
    }

},

mouseMoveHandler : function(event) { 
    var delta = {left: (event.clientX - event.data.lastCoord.left), top: (event.clientY - event.data.lastCoord.top)};
    var range = {left: (event.clientX - event.data.startCoord.left), top: (event.clientY - event.data.startCoord.top)};
    if (event.data.allowClick && (Math.abs(range.left)>=5 || Math.abs(range.top)>=5)) {
        event.data.allowClick = false;
        $('*').on('click.stop', function() {return false;});
        $('body').addClass('dragcursor'); //// Add Move Cursor
    }

    event.data.scrollable.scrollLeft(event.data.scrollable.scrollLeft() - delta.left);

    $('.th-header').css('margin-left', -event.data.scrollable.scrollLeft()); //// Scrollsync with header

    event.data.scrollable.scrollTop(event.data.scrollable.scrollTop() - delta.top);

    event.data.lastCoord={left: event.clientX, top: event.clientY}

    if (!$(event.target).closest('.noformelement').length) {
        event.preventDefault();
        return false;
    }

}

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多