javascript的兼容问题:bind()函数,getStyle()函数,事件对象event,scroll滚动距离查询的兼容性问题。

1.bind()函数。

兼容性:因为addEventListener()方法不支持IE8及以下浏览器,但是IE中有attachEvent这个方法,所以我们可以自己构造一个函数实现所有浏览器的兼容性问题。

第一个参数:表示要绑定事件的对象

第二个参数:事件类型(字符串类型,且不用加on)

第三个参数:回调函数

addEventListener与attachEvent的区别:

  1. addEventListener中第三个参数表示是否在捕获阶段触发事件爱你,是则true,反之false,一般都是在冒泡阶段触发事件,所以一般都是false。
  2. addEventListener中的回调函数中的是以对象的方法调用的,所以里面的this是我们的obj对象,但是attachEvent中的回调函数是以window的方法调用的,也就是我们常说的函数的方式调用的,所以我们的this是window,为了统一this,我们可以将attachEvent中的回调函数外面套一层函数,然后让浏览器间接调用,这样我们就可以通过我们的apply或call方法改变我们的this指向,统一我们的this指向了。
  3. addEventListener方法有三个参数,但是我们的attachEvent只有两个参数
  4. addEventListener第一个参数是事件类型(比如click,load),而attachEvent第一个参数指明的是事件处理函数名称(onclick,onload)
  5. 为一个事件添加多个事件处理程序时,执行顺序不同,addEventListener添加会按照添加顺序执行,而attachEvent添加多个事件处理 程序时顺序无规律(添加的方法少的时候大多是按添加顺序的反顺序执行的,但是添加的多了就无规律了),所以添加多个的时候,不依赖执行顺序的还好,若是依 赖于函数执行顺序,最好自己处理,不要指望浏览器

        function bind(obj, eventStr, callback) {
            if (obj.addEventListener) {
                // 这里的这个第三个参数表示是否需要在捕获阶段就触发事件
                obj.addEventListener(eventStr, callback, false)
            } else {
                //只能在冒泡阶段发生
                obj.attachEvent('on'+eventStr,function(){
                    // 这一步是为了解决this的不同指向问题,上面一个事件添加中的this是指向我们的obj,而我们这个是指向我们的window
                    //浏览器怎么调用我们官不着,但是我们可以通过外面套一层函数的方式,将其变成我们自己调用的,然后就可以修改其this指向了
                    callback.call(obj)
                })
            }
        }

2.getStyle()函数。

兼容性:IE8及以下浏览器只有currentStyle属性,而IE8以上和其他的浏览器有getComputedStyle方法,所以我们也可以自己造一个函数,实现所有浏览器的兼容。

第一个参数:获取样式的对象

第二个参数:获取样式的名字

区别:

  1. getComputedStyle方法是window的方法,所以我们可以直接使用。而我们的currentStyle属性是对象的,不是window的。
  2. getComputedStyle方法支持伪元素,其第二个参数就是我们的伪元素,如果要使用,我们可以传一个伪元素进来,但是一般用不到伪元素,所以我们直接传一个null就可以了。而我们的currentStyle属性不支持伪元素的。
function getStyle(obj,name) {
    if(window.getComputedStyle){
        return window.getComputedStyle(obj,null)[name]
    }else{
        return obj.currentStyle[name]
    }
}

3.event事件对象的兼容性。

事件对象:当事件的响应函数被触发时,浏览器每次都会将一个事件对象传递进函数,在事件对象中封装了当前事件相关的一切信息。比如:鼠标坐标,键盘哪个键按下,鼠标滚轮的滚动方向等等。

兼容性:在IE中我们event是作为window的属性对象的,而不是直接通过浏览器调用回调函数时穿进去的事件对象,在其他的浏览器中,都是通过调用回调函数的时候直接将事件对象传递给函数的,所以在这里我们也统一一下兼容性的问题。

event=event||window.event

4.scrollTop与scrollLeftt的兼容性问题。

兼容性:chrome浏览器认为,滚动条是body的,而我们的火狐等浏览器认为,滚动条是html的。所以由此就出现了兼容性问题。

这里document.body为获取body对象的方法,而这里document.documentElement为获取我们html对象的方法,如果有不懂可以去查看我的javascript中DOM对象查的方法及属性。

const top=document.body.scrollTop||document.documentElement.scrollTop
const left=document.body.scrollLeft||document.documentElement.scrollleft

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
std::bind函数可以将可调用对象和其参数进行绑定,并返回一个绑定后的函数对象。绑定的结果可以使用std::function保存。它可以用于绑定普通函数、成员函数以及函数对象,并且可以通过占位符来指定参数的位置。 当绑定普通函数时,std::bind的第一个参数是函数名,普通函数做实参时会隐式转换成函数指针。例如,std::bind(my_divide,_1,2)等价于std::bind(&my_divide,_1,2),其中_1表示占位符,位于std::placeholders中。调用绑定后的函数对象时,传入的参数将替换占位符的位置,实现参数的绑定。 而当绑定成员函数时,std::bind的第一个参数是成员函数的地址,后续参数是成员函数调用时需要传入的参数。通过占位符来指定参数的位置。调用绑定后的函数对象时,传入的参数将替换占位符的位置,实现参数的绑定。 总结而言,std::bind函数可以将可调用对象和其参数进行绑定,以创建一个新的函数对象。这个新的函数对象可以方便地进行参数的绑定,减少传入参数的个数,使得代码更加灵活和易读。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++11 std::bind](https://blog.csdn.net/mayue_web/article/details/87915389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [C++11中的std::bind 简单易懂](https://blog.csdn.net/Jxianxu/article/details/107382049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值