JS兼容IE和非IE浏览器事件绑定的代码

原标题<addEventListener()和attachEvent()的区别和兼容写法>

addEventListener()是标准的绑定事件监听函数的方法,是W3C所支持的,Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持该函数;但是,IE8.0及其以下版本不支持该方法,它使用attachEvent()来绑定事件监听函数。所以,这种绑定事件的方法必须要处理浏览器兼容问题。

addEventListener共有3个参数,如下所示:
element.addEventListener(type,listener,useCapture);
参数 参数说明
element 要绑定事件的对象,及HTML节点。
type 事件名称,注意去掉事件前边的“on”,比如“onclick”要写 成“click”,“onmouseover”要写成“mouseover”。
listener 要绑定的事件监听函数,注意只写函数名,不要带括号。

attachEvent共有2个参数,如下所示:
element.attachEvent(type,listener);

参数 参数说明
element 要绑定事件的对象,及HTML节点。
type 事件名称,注意加上事件前边的“on”,比如“onclick”和“onmouseover”,这是与addEventListener的区别。
listener 要绑定的事件监听函数,注意只写函数名,不要带括号。

兼容IE和非IE浏览器事件绑定的代码:

function on(element, type, callback) {
    if (element.addEventListener) { // 支持使用 addEventListener()
        // 判断 type 是否以 "on" 开头
        if (type.slice(0,2) === "on") // 以 "on" 开头,不需要,则去掉
            type = type.slice(2);
        element.addEventListener(type, callback);
    } else { // 不支持使用 addEventListener()
        // 判断 type 是否以 "on" 开头
        if (type.slice(0, 2) !== "on") // 没有以 "on" 开头,需要,则加上
            type = "on" + type;
        element.attachEvent(type, callback);
    }
}

————————————————
版权声明:本文为CSDN博主「我想吃烤香蕉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37321858/article/details/82429516

离线查询IP所属区域信息,国内精确到城市.国外精确到省份.

离线查询IP所属区域信息,国内精确到城市.国外精确到省份.

IP数据库来自ipip.net IPv4 数据库试用版,最后更新时间:20190703 试用版数据不含运营商,国外只具体到国家试用版不能作为正式商业用途

完整实例代码网盘下载:  http://share.menglei.net/file/16922972-449182665

IP数据库官方下载网址: https://www.ipip.net/product/client.html

PHP版解析源码: https://github.com/ipipdotnet/ipdb-php

PHP使用例子(来自wdja网站内容管理系统: https://github.com/shadoweb/wdja)

如果有兴趣,也可以集成纯真IP库会更精确一些,网上有现成的资源,可以自行测试.

function mm_ip_map($ip,$type=0){
  //离线查询IP所属区域信息,国内精确到城市.国外精确到省份.
  ini_set('memory_limit', '1G');
  spl_autoload_register(function ($class)
                        {
                          $class = str_replace("","/",$class);
                          if (strpos($class, 'ipip/db') !== FALSE)
                          {
                            require __DIR__.'/ip/'.$class.'.php';
                          }
                        }, true, true);
  $city = new ipipdbCity(__DIR__.'/ip/ipipfree.ipdb');
  if(ii_isnull($ip)) $ip = ii_get_client_ip();
  $ip = ii_get_lrstr($ip, ',', 'leftr');
  $ip_array = $city->findMap($ip, 'CN');
  $country = $ip_array['country_name'];
  $region = $ip_array['region_name'];
  $city = $ip_array['city_name'];
  $int = '';
  switch ($type)
  {
    case 0:
      $int = '';
      break;
    case 1:
      $int = '-';
      break;
    case 2:
      $int = '|';
      break;
    case 3:
      $int = '/';
      break;
    case 4:
      $int = '·';
      break;
    default:
      $int = '-';
      break;
  }
  if(ii_isnull($country)) {
    $res = '';
  }elseif(ii_isnull($region)){
    $res = $country;
  }elseif(ii_isnull($city)){
    $res = $country .$int .$region;
  }else{
    $res = $country .$int .$region .$int .$city;
  }
  return $res;
}
function ii_get_client_ip()
{
  $tclient_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  if(ii_isnull($tclient_ip))
  {
    $tclient_ip = $_SERVER['HTTP_CLIENT_IP'];
    if(ii_isnull($tclient_ip)) $tclient_ip = $_SERVER['REMOTE_ADDR'];
  }
  $tclient_ip = ii_get_safecode($tclient_ip);
  return $tclient_ip;
}
function ii_isnull($strers)
{
  if (trim($strers) == '') return true;
  else return false;
}
function ii_get_safecode($strers)
{
  if (!ii_isnull($strers))
  {
    $tstrers = $strers;
    $tstrers = str_replace(''', '', $tstrers);
    $tstrers = str_replace(';', '', $tstrers);
    $tstrers = str_replace('--', '', $tstrers);
    return $tstrers;
  }
}

 

 

 

 

 

Bootstrap笔记

来源:https://www.runoob.com/bootstrap/bootstrap-tutorial.html

开头包含下面的代码段

<!DOCTYPE html>
<html>
....
</html>

为了让 Bootstrap 开发的网站对移动设备友好,确保适当的绘制和触屏缩放,需要在网页的 head 之中添加 viewport meta 标签,如下所示:

<meta name="viewport" content="width=device-width, initial-scale=1.0">

响应式图像

<img src="..." class="img-responsive" alt="响应式图像">

避免跨浏览器的不一致

Bootstrap 使用 Normalize 来建立跨浏览器的一致性。

Normalize.css 是一个很小的 CSS 文件,在 HTML 元素的默认样式中提供了更好的跨浏览器一致性。

容器(Container)

<div class="container">
...
</div>

Bootstrap 3 的 container class 用于包裹页面上的内容。

Bootstrap 网格的基本结构

<div class="container">
<div class="row">
<div class="col-*-*"></div>
<div class="col-*-*"></div>
</div>
<div class="row">...</div>
</div>
<div class="container">....

网格系统是通过指定您想要横跨的12个可用的列来创建的。

Bootstrap 网格系统如何跨多个设备工作:

超小设备手机(<768px) 小型设备平板电脑(≥768px) 中型设备台式电脑(≥992px) 大型设备台式电脑(≥1200px)
网格行为 一直是水平的 以折叠开始,断点以上是水平的 以折叠开始,断点以上是水平的 以折叠开始,断点以上是水平的
最大容器宽度 None (auto) 750px 970px 1170px
Class 前缀 .col-xs- .col-sm- .col-md- .col-lg-
列数量和 12 12 12 12
最大列宽 Auto 60px 78px 95px
间隙宽度 30px
(一个列的每边分别 15px)
30px
(一个列的每边分别 15px)
30px
(一个列的每边分别 15px)
30px
(一个列的每边分别 15px)
可嵌套 Yes Yes Yes Yes
偏移量 Yes Yes Yes Yes
列排序 Yes Yes Yes Yes

为了在大屏幕显示器上使用偏移,请使用 .col-md-offset-* 类。这些类会把一个列的左外边距(margin)增加 * 列,其中 * 范围是从 1 到 11。

为了在内容中嵌套默认的网格,请添加一个新的 .row,并在一个已有的 .col-md-* 列内添加一组 .col-md-* 列。被嵌套的行应包含一组列,这组列个数不能超过12(其实,没有要求你必须占满12列)。

Bootstrap 网格系统另一个完美的特性,就是您可以很容易地以一种顺序编写列,然后以另一种顺序显示列。

您可以很轻易地改变带有 .col-md-push-* 和 .col-md-pull-* 类的内置网格列的顺序,其中 * 范围是从 1 到 11。

col-md-offset-3(在左侧补充3列)
col-md-push-8(从左侧往右侧推8列)
col-md-pull-2(往左侧拉2列)

 

 

 

 

 

 

 

 

 

 

FRP实现https访问内网网站的方法

通过服务端配置nginx即可。

需提前申请好对应的域名证书(可以用宝塔申请好,然后把对应的文件拷贝出来使用)

其中yun.domain.com为域名

 

nginx配置

server
{
listen 80;
listen 443 ssl http2;
server_name yun.domain.com;
location / {
proxy_pass http://$host:8080;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_hide_header X-Powered-By;
}

#代码拷贝自宝塔面板部署证书后的网站配置

ssl_certificate /frps/yun.domain.com/fullchain.pem;
ssl_certificate_key /frps/yun.domain.com/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;

#SSL-END

#代码拷贝自宝塔面板部署证书后的网站配置

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
proxy_pass http://$host:8080;#添加这一行
expires 30d;
}

location ~ .*.(js|css)?$
{
proxy_pass http://$host:8080;#添加这一行
expires 12h;
}
location ~ /.
{
deny all;
}
}

frps中配置不变。

其中vhost_http_port = 8080

frpc中配置http即可。

 

如果是nextcloud通过这种方式进行配置https的话,需要在nextcloud的配置文件中进行两项配置

'overwriteprotocol' => 'https',
'overwritehost' =>'域名',

这样配置后,可以解决一些小问题,我遇到了在APP登录时会无限循环无法登录。

CRMEB公众号H5前端修改nodejs打包教程

下载安装nodejs

WIN系统中

1. Win+R调出运行,输入cmd进入dos命令窗口

2. 然后复制解压后CRMEB源码中h5的路径

例如:C:UsersadminDesktopCRMEB_DT_v3.2.3h5

3. 在dos命令窗口中进入以上路径

输入cd C:UsersadminDesktopCRMEB_DT_v3.2.3h5

4.进行源码解压

输入命令

npm install

 

5.等解压完成后,

进行源码修改

6.进行源码压缩
如果已经关闭dos窗口,请重复以上1-3步,进入h5所以路径

输入命令

npm run build

7.拷贝打包后的文件

打开源码位置 h5/dist 复制目录下所有文件

C:UsersadminDesktopCRMEB_DT_v3.2.3h5dist

替换掉原来的即可。

8.然后如需修改logo和标题:

首页logo:h5publiclive-logo.gif

加载logo:h5srcassetsimageslive-logo.gif

首页标题:h5.env.production

[转载]nginx 之$proxy_host|$host|$http_host区别

proxy_set_header 允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。 当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:

proxy_set_header Host $proxy_host;

proxy_set_header Connection close;

nginx对于upstream默认使用的是基于IP的转发,因此对于以下配置:

upstream web {

server abc.com;

}

server {

listen 80;

server_name www.hehe.com;

location /front {

proxy_pass http://web;

proxy_set_header Host $proxy_host;

}

}

当匹配到/front时,使用web处理,到upstream就匹配到abc.com,这里直接转换成IP进行转发。假如abc.com是在另一台nginx下配置的,ip为10.10.10.10,则$proxy_host则对应为10.10.10.10。此时相当于设置了Host为10.10.10.10。如果想让Host是abc.com,则进行如下设置:

proxy_set_header Host abc.com;

如果不想改变请求头“Host”的值,可以这样来设置:

proxy_set_header Host $http_host;

但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。 这种情况下,更好的方式是使用$host变量——它的值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名:

proxy_set_header Host $host;

此外,服务器名可以和后端服务器的端口一起传送:

proxy_set_header Host $host:$proxy_port;

如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:

proxy_set_header Accept-Encoding "";

来源:https://blog.51cto.com/gyj110/2079981

 

nginx配置中$http_host、$host、$host:$proxy_port 简单区别

1、 proxy_set_header Host $http_host;
不改变请求头 。
2、proxy_set_header Host host;如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,使用host;如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。 这种情况下,使用host;如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,使用host变量它 的值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名;
3、proxy_set_header Host host:host:host:proxy_port;
服务器名可以和后端服务器的端口一起传送:
4、如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:
proxy_set_header Accept-Encoding “”;
5、用户真实的ip地址转发给后端服务器
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;

来源:https://blog.csdn.net/Sw_Pro/java/article/details/99679534

 

mysql排序过滤特定值或范围

有一个网站需要进行排序,添加了一个字段,在未设置排序序号的情况下,默认设置为0,在进行排序时要把序号为0的排到后面,这样就可以通过序号进行升序或降序排序。

相应的SQL语句可以这样写

SELECT * FROM wdja_product ORDER BY p_order=0, p_order ASC

这里的p_order=0是排除值为0的数据,然后再进行排序操作。

相应的也可以设置p_order>=0或p_order<=0或p_order>99等

 

 

Nextcloud通过FRP搭建私有网盘进行Joplin同步笔记的配置

正常情况下可以使用FRP绑定过的域名进行配置。

但在使用Joplin通过webdav进行配置时,使用域名则会一直报403错误(只有同步时才会报错,配置中检查同步配置时则不会)。

后经过测试发现。需要带上frp配置的服务器端的端口才可以。

正常情况下:

http://域名/remote.php/dav/files/用户名/Joplin

而Joplin同步则需要:

http://域名:8080/remote.php/dav/files/用户名/Joplin

其中8080为FRP服务器端的端口,在服务端已经通过nginx进行了配置,实现直接通过80端口(http://域名/)进行访问nextcloud.

而Joplin配置webdav则需要带上端口。不然Joplin则会一直报403错误。

如果情况同我的一样,则可以尝试进行操作,Joplin进行同步403报错,也有可能是其它原因,请自查。

 

[转载]socks4/5和http代理有什么区别

代理服务器的类型很多,如HTTP代理、FTP代理、SOCKS代理等,每种代理对应其自身的功能。
HTTP代理:能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80、8080、3128等;
FTP代理:能够代理客户机上的FTP软件访问FTP服务器,它的端口一般为21、2121;
RTSP代理:代理客户机上的Realplayer访问Real流媒体服务器的代理,其端口一般为554;
POP3代理:代理客户机上的邮件软件用POP3方式收发邮件,端口一般为110;
SOCKS代理:SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心是何种应用协议,既可以是HTTP请求,所以SOCKS代理服务器比其他类型的代理服务器速度要快得多。SOCKS代理又分为SOCKS4和SOCKS5,二者不同的是SOCKS4代理只支持TCP协议(即传输控制协议),而SOCKS5代理则既支持TCP协议又支持UDP协议(即用户数据包协议),还支持各种身份验证机制、服务器端域名解析等。SOCK4能做到的SOCKS5都可得到,但SOCKS5能够做到的SOCKS则不一定能做到,比如我们常用的聊天工具QQ在使用代理时就要求用SOCKS5代理,因为它需要使用UDP协议来传输数据。
从另一个角度来说,代理可以分为三种,即全匿名代理、普通匿名代理和透明代理。全匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理;普通匿名代理能隐藏客户机的真实IP,但会改编我们的请求信息,服务器端有可能会认为我们使用了代理(仅仅是可能而已,一般说来是没问题的),但其实这种代理的安全性可能比全匿名代理更高,有的代理甚至会剥离客户机发送信息中的一部分,这样服务器端就根本探测不到我们所用的操作系统版本和浏览器版本;第三种是透明代理,也叫简单代理,它不但改编我们的请求信息,还会传送真实的IP地址。

出处:https://www.cnblogs.com/zkliuym/archive/2010/05/04/1726979.html
https://blog.csdn.net/watson2017/article/details/79897693

来源:https://blog.csdn.net/watson2017/article/details/79897693