我试图在JQuery中创建自定义事件,应该检测什么时候滚动条被点击1。
我知道有很多文本,但我的所有问题都是粗体,有一个 JSFiddle example,你可以直接工作。

因为我还没有找到任何内置的功能,
我不得不创建一个hasScroll函数,检查元素是否有一个滚动条,

$.fn.hasScroll = function(axis){
    var overflow = this.css("overflow"),overflowAxis;

    if(typeof axis == "undefined" || axis == "y") overflowAxis = this.css("overflow-y");
    else overflowAxis = this.css("overflow-x");

    var bShouldScroll = this.get(0).scrollHeight > this.innerHeight();

    var bAllowedScroll = (overflow == "auto" || overflow == "visible") ||
                         (overflowAxis == "auto" || overflowAxis == "visible");

    var bOverrideScroll = overflow == "scroll" || overflowAxis == "scroll";

    return (bShouldScroll && bAllowedScroll) || bOverrideScroll;
};

和inScrollRange函数,检查执行的点击是否在滚动范围内。

var scrollSize = 18;

function inScrollRange(event){
    var x = event.pageX,y = event.pageY,e = $(event.target),hasY = e.hasScroll(),hasX = e.hasScroll("x"),rX = null,rY = null,bInX = false,bInY = false

    if(hasY){
        rY = new RECT();
        rY.top = e.offset().top;
        rY.right = e.offset().left + e.width();
        rY.bottom = rY.top +e.height();
        rY.left = rY.right - scrollSize;

        //if(hasX) rY.bottom -= scrollSize;
        bInY = inRect(rY,x,y);
    }

    if(hasX){
        rX = new RECT();
        rX.bottom = e.offset().top + e.height();
        rX.left = e.offset().left;
        rX.top = rX.bottom - scrollSize;
        rX.right = rX.left + e.width();

        //if(hasY) rX.right -= scrollSize;
        bInX = inRect(rX,y);
    }

    return bInX || bInY;
}

所有滚动条大小是否统一?例如在Firefox和IE它的18px。
假设没有自定义滚动条,一些浏览器中是否有任何额外的填充或大小?

这些功能都是按预期执行的(从我可以看出来)。

做自定义事件有点棘手,但我得到它工作有点。唯一的问题是,如果被点击的元素有一个mousedown / up事件附加到它,也将被触发。

我似乎不能停止其他事件触发,而同时触发,我所说的mousedownScroll / mouseupScroll事件。

$.fn.mousedownScroll = function(fn,data){
    if(typeof fn == "undefined" && typeof data == "undefined"){
        $(this).trigger("mousedownScroll");
        return;
    }

    $(this).on("mousedownScroll",data,fn);
};

$.fn.mouseupScroll = function(fn,data){
    if(typeof fn == "undefined" && typeof data == "undefined"){
        $(this).trigger("mouseupScroll");
        return;
    }

    $(this).on("mouseupScroll",fn);
};

$(document).on("mousedown",function(e){
    if(inScrollRange(e)){
        $(e.target).trigger("mousedownScroll");
    }
});

$(document).on("mouseup",function(e){
    if(inScrollRange(e)){
        $(e.target).trigger("mouseupScroll");
    }
});

$("selector").mousedown(function(e){
    console.log("Clicked content."); //Fired when clicking scroller as well
});

$("selector").mousedownScroll(function(e){
    console.log("Clicked scroller.");
});

如何阻止其他“点击”事件触发?

虽然我问,请随时优化代码尽可能。

Here’s a JSFiddle to mess around with.

我这样做的原因是因为一个更大的插件,我正在开发。它有一个自定义上下文菜单,当我右键单击一个滚动条时显示。我不想要。所以我想我应该做一个事件,检查滚动点击(mouseup / downs),然后防止上下文菜单显示。为了做到这一点,我需要滚动点击在正常点击之前,如果可能,停止正常点击发射。

我只是在这里大声喧哗,但也许有一种方法来获得绑定到元素的所有功能,然后切换它们添加的顺序?我知道函数按它们添加的顺序执行(第一次添加第一次调用),因此,如果我可以进入该过程,也许整个“注册”事件到JQuery可以在点击事件之前插入。

1只能使用mousedown / mouseup,因为在单击滚动条时不会触发点击。如果这是假的,请提供一个工作示例/代码

解决方法

你可能使用这个黑客。

你可以尝试劫持mousedown和mouseup事件,并避免他们点击滚动条与您的自定义供电功能。

$.fn.mousedown = function(data,fn) {
    if ( fn == null ) {
        fn = data;
        data = null;
    }    
    var o = fn;
    fn = function(e){
        if(!inScrollRange(e)) {
            return o.apply(this,arguments);
        }
        return;
    };
    if ( arguments.length > 0 ) {
        return this.bind( "mousedown",fn );
    } 
    return this.trigger( "mousedown" );
};

和mousedownScroll和mouseupScroll事件的逆。

$.fn.mousedownScroll = function(data,fn) {
    if ( fn == null ) {
        fn = data;
        data = null;
    }    
    var o = fn;
    fn = function(e){
        if(inScrollRange(e)) {
            e.type = "mousedownscroll";
            return o.apply(this,fn );
    } 
    return this.trigger( "mousedown" );
};

顺便说一句,我认为滚动条宽度是一个操作系统设置。

事件 – 确定用户是否单击滚动条或内容(onclick for native scroll bar)的更多相关文章

  1. h5页面背景图很长要有滚动条滑动效果的实现

    这篇文章主要介绍了h5页面背景图很长要有滚动条滑动效果的实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – UIScrollView自动滚动64点

    我正在将UIScrollView添加到UIViewControllers视图中.出于某种原因,在将滚动视图添加到视图并显示之间,contentOffset设置为{0,-64},64是状态栏的20加上导航栏的44点(我猜).下面是一些重现问题的代码和图像.如何阻止iOS设置contentOffset?

  3. ios – 如何在UICollectionView上始终显示滚动条

    我在我正在处理的应用程序中添加了一个UICollectionView到UIView.在UICollectionView中显示我有一组从CoreData中提取的图像.垂直滚动工作正常但滚动条不会显示,直到用户触摸UICollectionView.如何确保右侧的滚动条始终可见,以便向用户指示它是否可滚动?

  4. swift UI专项训练38 用代码实现滚屏ScrollView

    有时候我们在一个页面中放不下所有内容,就需要用到ScrollView,多余的内容可以通过滚动来获取。然后在viewDidLoad中初始化一个scrollView:要想实现滚屏,pagingEnabled必须设为true。我们先把它设为true看看效果,别忘了把这个scrollView显示到页面中:然后我们把需要的内容加到这个scrollView中,例如增加一个标题:运行一下看看效果因为我们把scrollView的尺寸设定为高800,超出屏幕的高度,我们向下拖动,注意右侧出现的滚动条:然后继续添加需要的内容

  5. swift 中如何定义接口

    匿名接口,swift比java更随意,连接口名字也不用,直接定义直接传递,一门牛哄哄的语言

  6. swift详解之十八------------ScrollView

    ScrollView注:本小节详细介绍scrollView的用法UIScrollView是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以通过滚动查看所有的内容UIScrollView的用法,将需要展示的内容添加到UIScrollView中设置UIScrollView的contentView属性,告诉UIScrollView所有内容的尺寸这里我创建了一个scrollview并设置的一些属性,然后添加了四个小狗的图片。下面看看uiscrollviewdelegate中的一些其他的事件这里面都清楚的记

  7. 添加按钮(swift)

    添加按钮1.定义button2.使用

  8. Swift - 将表格UITableView滚动条移动到底部

    有时我们需要通过代码自动将表格UITableView滚动条移动到尾部,只需要使用scrollToRowAtIndexPath方法即可,代码如下:12345varsecon=1//最后一个分组的索引(0开始,如果没有分组则为0)rows=5//最后一个分组最后一条项目的索引indexPath=NSIndexPath(forRow:rows,inSection:secon)self.tableView

  9. 《从零开始学Swift》学习笔记Day 65――Cocoa Touch设计模式及应用之选择器

    在C语言在提供一种函数指针技术,Objective-C和Swift语言都提供选择器类型,它是C语言函数指针的面向对象替代技术。选择器在Cocoa和CocoaTouch中的目标动作、通知和委托等模式中方法的调用实现的关键。穷其根本是源自于Objective-C多重参数方法命名规律。

  10. 使用SnapKit约束label、scrollview和tableview

    解决的方法是,在其中加一个viewContainer,让scrollview的contentSize.height自适应viewContainer,而viewContainer的高度自适应与其中的各个控件。重点内容都在代码里:三、约束UITableViewCell基于上面的方法,这个就比较简单了,以前苦逼的计算每个cell的高度/(ㄒoㄒ)/~~在这里可以直接把Cell当做上面的viewContainer就好了。重点是UITableView的属性设置:内容大概就这么多吧,别急着赶路,把路填平了,才能跑起来

随机推荐

  1. jquery-plugins – 是否可以使用猫头鹰旋转木马实现循环/无限轮播?

    我正在使用猫头鹰旋转木马,它的工作完美,除了它不支持循环/无限滚动.我没有搜索google和stackoverflow的想法,没有运气.有没有人在猫头鹰旋转木马上实现圆形/无限滚动?

  2. jQuery动态输入字段焦点

    我想使用以下jQuery向我的页面动态添加一个输入字段:在这样做之后,我希望输入字段具有闪烁的文本光标的焦点,所以我想在创建后立即输入.有人可以告诉我我该怎么办?

  3. jquery – 为什么$(window).height()这样错了?

    我试图获取当前浏览器的视口高度,使用但我得到的价值观太低了.当视口高度高达850px时,我从height()获取大约350或400像素的值.这是怎么回事?

  4. jquery – 如果在此div之外和其他draggables内部(使用无效和有效的还原选项),则可拖动恢复

    例如这样但是由于明显的原因,这不行.我可以说这个吗?

  5. 创建一个jQueryUI 1.8按钮菜单

    现在jQueryUI1.8已经出来了,我正在浏览更新,并且遇到了新的Buttonwidget,特别是SplitButtonwithadropdown的演示之一.这个演示似乎表明Buttonwidget可以在这里创建一个下拉菜单.作为讨论的问题,我想知道使用这个新的Button小部件来创建一个下拉菜单有什么方法.干杯.解决方法您必须在按钮下方列出一个列表,方式类似于此处为自动完成提供的演示:http

  6. 灰色divs使用JQuery

    我试图使用这个代码:为了淡出一大堆名为MySelectorDiv的div,唯一的是,它只会淡出第一个而不是所有的div,为什么呢?

  7. 使用jQuery动态插入到列表中

    我有两个订单列表在彼此旁边.当我从一个列表中选出一个节点时,我想按照字母顺序插入到另一个列表中.抓住的是我想要把一个元素放在另一个列表中,而不刷新整个列表.奇怪的是,当我插入到右边的列表中,它工作正常,但是当我插入到左边的列表中时,顺序永远不会出来.我也尝试将所有内容读入数组,并将其排序在一起,以防止children()方法没有按照显示顺序返回任何东西,但是我仍然得到相同的结果.这是我的jQuer

  8. 没有回应MediaWiki API使用jQuery

    我试图从维基百科获取一些内容作为JSON:但我没有回应.如果我粘贴到浏览器的地址栏,就像我得到预期的内容.怎么了?解决方法您需要通过添加&callback=?来触发具有$.getJSON()的JSONP行为?在querystring上,像这样:Youcantestithere.没有使用JSONP,你正在击中same-originpolicy,阻止XmlHttpRequest获取任何数据.

  9. jQuery Ajax请求每30秒

    我有这段代码,但是有些人在我的网站上的值可能会改变.我需要每30秒钟更新一次#financediv.这可以做吗解决方法您可以将代码放在单独的函数中,如下所示:然后每30秒建立一个定时器调用该函数:祝你好运!总结以上是DEVMAX为你收集整理的jQueryAjax请求每30秒全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  10. jquery – keypress事件在IE和Chrome中不工作,但在FF工作

    任何想法为什么会这样发生?我通常认为Chrome会更加宽容代码?这是我的按键键.我错过了什么吗?右图();和leftimage();是应该工作的功能,因为我在其他地方使用这些功能谢谢您的帮助!

返回
顶部