ma 发布的文章

当前360浏览器使用chorme浏览器内核,其useragent的查询结果是:
Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
明显在useragent中无法找到360的任何痕迹。相应comodo使用firefox内核的ice dragon是:
Mozilla/5.0 (Windows NT 6.2; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0 IceDragon/25.0.0.1

网上搜索了一下,找到识别360浏览器的代码

try {
    if (window.external && window.external.twGetRunPath) {               
        var r = external.twGetRunPath();
        if (r && (r.toLowerCase().indexOf("360se") > -1 )) {
            ret = true;
        }
    }
} catch (ign) {
    ret = false;
}

这个代码没有使用useragent,使用window.external.twGetRunPath来识别浏览器运行目录,如果运行目录中包含360se字符,则表明所使用为360浏览器。

例如在windows 8.1下,360浏览器默认安装目录为:
C:\Users***\AppData\Roaming\360se6\Application\360se.exe

<script language="javascript" type="text/javascript">

        var g_bRunIn360se = false;
        var g_strSecurityId = null;
        try{
                g_strSecurityId = external.twGetSecurityID(window);
                g_bRunIn360se = true;
        }
 
        catch(e){
                if (g_bRunIn360se==false){g_bRunIn360se=navigator.userAgent.toLowerCase().indexOf("360chrome");}
        }
        if (g_bRunIn360se==true){
                alert("系统检测出来你使用了360流氓浏览器,请先卸载或改用IE、Chrome或firefox 等再行访问本站,谢谢合作!");
                document.execCommand("stop");
        }
</script>

PHP版代码如下:

<?php
$useragent = $_SERVER['HTTP_USER_AGENT'];
if(strstr($useragent,"360")) {die("系统检测出来你使用了360流氓浏览器,请先卸载或改用IE、Chrome或firefox 等再行访问本站,谢谢合作!");} ?> 

先说 ===,这个比较简单:
1、如果类型不同,就[不相等]
2、如果两个都是数值,并且是同一个值,那么[相等]。
3、如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
4、如果两个值都是true,或者都是false,那么[相等]。
5、如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
6、如果两个值都是null,或者都是undefined,那么[相等]。
再说 ==,根据以下规则:
1、如果两个值类型相同,进行 === 比较。
2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
3、如果一个是null、一个是undefined,那么[相等]。
4、如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
5、如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
6、任何其他组合,都[不相等]。

scrollTop为滚动条在Y轴上的滚动距离。
clientHeight为内容可视区域的高度。
scrollHeight为内容可视区域的高度加上溢出(滚动)的距离(当前可滚动的页面的总高度)
这个三个属性的介绍就可以看出来,滚动条到底部的条件即为scrollTop + clientHeight == scrollHeight。

$(window).scroll(function(){
  var scrollTop = $(this).scrollTop();
  var scrollHeight = $(document).height();
  var windowHeight = $(this).height();
  if(scrollHeight-scrollTop-windowHeight <=300){
  }else{
}
});

window.addEventListener('scroll', scroll)
function scroll() {
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
      const clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
      const scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;

      if (scrollTop === 0) {
        console.log('滚动到顶了');
      }

 if (scrollTop + clientHeight >= scrollHeight) {
        console.log('滚动到底了');
      }

}

window.removeEventListener('scroll', scroll) // 移除滚动事件

在部分浏览器上,到底部时,触发不了
可以考虑:
1.用offsetHeight代替clientHeight ,多计算边框的距离
2.scrollTop的实时监听值可能是小数,采用Math.ceil(scrollTop),向上取整,避免少那个零点几的距离

何为回弹问题?
回弹问题是指在ios设备上,用户向上或向下滑动内容到达边界时,屏幕会出现弹性回弹的效果。
这种效果在一些情况下可能导致应用的交互不够流畅,用户体验受到影响。特别是一些需要滑动的元素(如长列表、图片轮播等),回弹会分散用户的注意力。

回弹机制的原理
在ios中,回弹效果由内部的ScrollView组件管理。ScrollView会在用户滑动到边界时触发“回弹”行为,这是一个默认的视觉反馈。虽然这种效果在某些情况下新颖独特,但在Web应用中,开发者往往需要根据业务需求来控制这些事件。

禁用回弹的基本方法
我们可以通过css和javascript共同作用来避免ios的回弹效果。

使用css禁止回弹
最简单的方法之一是通过css来禁止回弹。在页面的样式表中,我们可以设置overflow属性和-webkit-overflow-scrolling属性,来消除回弹效果。
body{
height:100%;
margin:0;
overflow:hidden;/禁用全局滚动/
}

.scroll-container{
width:100%;
height:100%;
overflow-y:scroll;/允许纵向滚动/
-webkit-overflow-scrolling:touch;/使用touch滚动/
position:absolute;
top:0;
}
在这个实例中,我们使用了.scroll-container类来包裹需要滚动的内容区域,并禁用了body的全局滚动,避免页面
整体的滚动引起的回弹。

使用javascript处理触摸事件
除了css方法外,我们还可以通过javascript来更精细地控制页面的滚动行为。可以监听触摸事件,并阻止默认行为。
const scrollContainer = document.querySelector('.scroll-container');
//阻止触摸事件的默认行为
scrollContainer.addEventListener('touchstart',function(event){
//Do something on touch start
},{passive:false});

scrollContainer.addEventListener('touchmove',function(event){
event.preventDefault();//禁止默认滚动行为
},{passive:false});

在此代码中,我们通过监听一个touchmove事件,在事件触发时执行event.preventDefault()来阻止默认的滚动行为。
注意,这里需要监听器的passive选项设置为false,以确保event.preventDefault()生效。

在类Unix操作系统中,文件权限是通过一组三位数的八进制数来表示的,通常被称为“755权限”或“777权限”等。每一位数字代表不同用户类别(所有者、组用户、其他用户)的权限。
chmod是Linux下设置文件夹权限的命令,后面一般跟三个数字,代表不同用户群体在该文件夹上的权限设置。具体解释如下:

第一个数字表示文件所有者的权限。
第二个数字表示与文件所有者同属一个用户组的其他用户在该文件夹上的权限。
第三个数字表示其他用户组在该文件夹上的权限。

权限分为三种:读(r=4)、写(w=2)、执行(x=1)。
根据不同的权限组合方式,可以得到以下模式和对应的数字:

可读+可执行(rx=5)对应数字5,
可读+可写(rw=6)对应数字6,
可读+可写+可执行(rwx=7)对应数字7。

所以,chmod 755设置用户的权限为:
文件所有者的权限为可读、可写、可执行(模式7)
与文件所有者同属一个用户组的其他用户的权限为可读、可执行(模式5)
其他用户组的权限为可读、可执行(模式5)
所以,755权限意味着:
文件所有者可以读取、写入以及执行该文件。
文件所属组成员和其他用户可以读取和执行该文件,但不能修改(写入)该文件。
总结:三个权限有8种组合方式,按照打分的方式给不同的权限模式编号。每个编号对应的模式组合是唯一的。