首页
关于
友人
留言
更多
壁纸
直播
视频
疫情图
推荐
开往
图床
图标库
阿里图标库
Search
1
最新最全Markdown语法大全
12,329 阅读
2
分享几个免费申请SSL证书的网站
2,890 阅读
3
用JS判断用户来路域名,实现不同来路展现不同界面
1,364 阅读
4
网友因cos痛哭流泪
946 阅读
5
发起一次网络攻击要花多少钱?
604 阅读
生活笔记
折腾笔记
代码笔记
Search
标签搜索
Typecho
PHP
A站
评论
头像
互赞宝
富豪刑警
JS
CDN
PHP代码
Pandownload
Vue
网站源码
轻量级
源码
Markdown
开往-Travelling
Redis
网络攻击
黑客攻击
白鸽
累计撰写
28
篇文章
累计收到
64
条评论
首页
栏目
生活笔记
折腾笔记
代码笔记
页面
关于
友人
留言
壁纸
直播
视频
疫情图
推荐
开往
图床
图标库
阿里图标库
搜索到
14
篇与
代码笔记
的结果
2021-02-23
Object.defineProperty的使用
这个方法的主要用处是用来做数据劫持的,在vue2.x主要使用这个方法,在3.0中换成了proxy做数据劫持,数据劫持就是监听到数据的变化,然后可以做什么等/* 随便定义一个对象 */ let obj = { name: 'hello', age: 18, child: { sex: '女' } } observer(obj) function observer(obj) { /* 判断传入进来的是否是对象 */ if (obj.constructor === Object) { /* 循环对象 */ for (let key in obj) { /* 如果值不是对象,则做劫持 */ if (obj[key].constructor !== Object) { /* 定义一个临时变量,用于return出去 */ let _value = obj[key] Object.defineProperty(obj, key, { /* 设置属性可以被删除,可以被修改 */ configurable: true, /* 设置属性可以被遍历 */ enumerable: true, get() { console.log('触发读取') return _value }, set(newVal) { console.log('触发修改') _value = newVal } }) } else { /* 否则进行递归,再次判断 */ observer(obj[key]) } } } }
2021年02月23日
15 阅读
0 评论
1 点赞
2021-02-17
网站顶部的跑马灯特效代码
放置说明放在头部head里即可。代码<!-- 顶部跑马灯特效 --> <style> #top-grrk{ background:url(https://external-30160.picsz.qpic.cn/e94ff0137dfb6cc51925d4ccf61d2541); height:2px; position:fixed; width:100%; Z-index:10000; } </style> <div id="top-grrk"></div> <!-- 顶部跑马灯特效 -->
2021年02月17日
29 阅读
0 评论
1 点赞
2021-02-17
jQuery中Ajax事件及各参数含义
Ajax会触发很多事件。有两种事件,一种是局部事件,一种是全局事件:局部事件:通过$.ajax来调用并且分配。$.ajax({ beforeSend: function () { }, complete: function () { } });全局事件,可以用bind来绑定,用unbind来取消绑定。这个跟click/mousedown/keyup等事件类似。但他可以传递到每一个DOM元素上。$("#loading").bind("ajaxSend", function () { //使用bind $(this).show(); }).ajaxComplete(function () { //直接使用ajaxComplete $(this).hide(); });事件的顺序如下:ajaxStart 全局事件 开始新的Ajax请求,并且此时没有其他ajax请求正在进行。 beforeSend 局部事件 当一个Ajax请求开始时触发。如果需要,你可以在这里设置XHR对象。 ajaxSend 全局事件 请求开始前触发的全局事件 success 局部事件 请求成功时触发。即服务器没有返回错误,返回的数据也没有错误。 ajaxSuccess 全局事件 全局的请求成功 error 局部事件 仅当发生错误时触发。你无法同时执行success和error两个回调函数。 ajaxError 全局事件 全局的发生错误时触发 complete 局部事件 不管你请求成功还是失败,即便是同步请求,你都能在请求完成时触发这个事件。 ajaxComplete 全局事件 全局的请求完成时触发 ajaxStop 全局事件 当没有Ajax正在进行中的时候,触发。局部事件回调的参数在文档中写的很清楚了,这里就不累述了。全局事件中,除了ajaxStart和ajaxStop之外,其他的事件都有3个参数event, XMLHttpRequest, ajaxOptions第一个是事件,第二个是XHR对象,第三个参数最有用,是当时调用这个ajax的时候的参数。对于ajaxError,还有第四个参数thrownError,只有当异常发生时才会被传递。我们可以利用ajaxOptions来写一个全局的ajax事件。$("#msg").beforeSend(function (e, xhr, o) { $(this).html("正在请求" + o.url); }).ajaxSuccess(function (e, xhr, o) { $(this).html(o.url + "请求成功"); }).ajaxError(function (e, xhr, o) { $(this).html(o.url + "请求失败"); });对于这个例子,这样我们就可以很方便的全局地在某个地方显示当前的ajax状态。当然,之前说了,第三个参数实际上是传递给ajax的参数。get/post/load/getScript/getJSON等方法本质上都是调用ajax方法的,所以ajaxOptions.url属性总是有效的。还有更丰富的例子。如果你用ajax调用,还可以传递自定义参数。下面的例子我就自定义了一个msg参数给了ajax调用//自定义参数msg $.ajax({url: "test1.html", type: "get", msg: "页面一"}); $.ajax({url: "test2.html", type: "get", msg: "页面二"}); $.ajax({url: "test3.html", type: "get", msg: "页面三"}); $.ajax({url: "test4.html", type: "get", msg: "页面四"}); //这里就能获取到自定义参数msg。 //这可以用来区别对待不同的ajax请求。 $("#msg").beforeSend(function (e, xhr, o) { $(this).html("正在请求" + o.msg); }).ajaxSuccess(function (e, xhr, o) { $(this).html(o.msg + "请求成功"); }).ajaxError(function (e, xhr, o) { $(this).html(o.msg + "请求失败"); });最后对于load方法,还有话说。其他的简易ajax方法,比如get,post,getJSON等,他们的回调函数都是设置了success回调。而只有load设置的其实是complete回调。所以,load里设置的回调函数的参数应该有2个。XMLHttpRequest和textStatus但实际上也并非如此。load的回调有三个参数XMLHttpRequest.responseText, textStatus, XMLHttpRequest所以,你可以在load的回调里通过textStatus==”success”或者textStatus==”error”来判断是否调用成功。或者用XMLHttpRequest.status属性判断是200还是404或者其他的。这点上,我认为比普通的get/post等方法更先进。如果要单数设置每get的error是不可能的。但是设置一个全局的ajaxError其实也是不错的选择。API:http://api.jquery.com/Ajax_Events/
2021年02月17日
24 阅读
0 评论
0 点赞
2021-02-12
Typecho实现评论显示操作系统和评论来源
首先打开 functions.php 文件,粘贴下面的代码// 获取浏览器信息 function getBrowser($agent) { if (preg_match('/MSIE\s([^\s|;]+)/i', $agent, $regs)) { $outputer = 'Internet Explore'; } else if (preg_match('/FireFox\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('Firefox/', $regs[0]); $FireFox_vern = explode('.', $str1[1]); $outputer = 'FireFox'; } else if (preg_match('/Maxthon([\d]*)\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('Maxthon/', $agent); $Maxthon_vern = explode('.', $str1[1]); $outputer = 'MicroSoft Edge'; } else if (preg_match('#360([a-zA-Z0-9.]+)#i', $agent, $regs)) { $outputer = '360 Fast Browser'; } else if (preg_match('/Edge([\d]*)\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('Edge/', $regs[0]); $Edge_vern = explode('.', $str1[1]); $outputer = 'MicroSoft Edge'; } else if (preg_match('/UC/i', $agent)) { $str1 = explode('rowser/', $agent); $UCBrowser_vern = explode('.', $str1[1]); $outputer = 'UC Browser'; } else if (preg_match('/QQ/i', $agent, $regs)||preg_match('/QQ Browser\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('rowser/', $agent); $QQ_vern = explode('.', $str1[1]); $outputer = 'QQ Browser'; } else if (preg_match('/UBrowser/i', $agent, $regs)) { $str1 = explode('rowser/', $agent); $UCBrowser_vern = explode('.', $str1[1]); $outputer = 'UC Browser'; } else if (preg_match('/Opera[\s|\/]([^\s]+)/i', $agent, $regs)) { $outputer = 'Opera'; } else if (preg_match('/Chrome([\d]*)\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('Chrome/', $agent); $chrome_vern = explode('.', $str1[1]); $outputer = 'Google Chrome'; } else if (preg_match('/safari\/([^\s]+)/i', $agent, $regs)) { $str1 = explode('Version/', $agent); $safari_vern = explode('.', $str1[1]); $outputer = 'Safari'; } else{ $outputer = 'Google Chrome'; } echo $outputer; } // 获取操作系统信息 function getOs($agent) { $os = false; if (preg_match('/win/i', $agent)) { if (preg_match('/nt 6.0/i', $agent)) { $os = 'Windows Vista · '; } else if (preg_match('/nt 6.1/i', $agent)) { $os = 'Windows 7 · '; } else if (preg_match('/nt 6.2/i', $agent)) { $os = 'Windows 8 · '; } else if(preg_match('/nt 6.3/i', $agent)) { $os = 'Windows 8.1 · '; } else if(preg_match('/nt 5.1/i', $agent)) { $os = 'Windows XP · '; } else if (preg_match('/nt 10.0/i', $agent)) { $os = 'Windows 10 · '; } else{ $os = 'Windows X64 · '; } } else if (preg_match('/android/i', $agent)) { if (preg_match('/android 9/i', $agent)) { $os = 'Android Pie · '; } else if (preg_match('/android 8/i', $agent)) { $os = 'Android Oreo · '; } else{ $os = 'Android · '; } } else if (preg_match('/ubuntu/i', $agent)) { $os = 'Ubuntu · '; } else if (preg_match('/linux/i', $agent)) { $os = 'Linux · '; } else if (preg_match('/iPhone/i', $agent)) { $os = 'iPhone · '; } else if (preg_match('/mac/i', $agent)) { $os = 'MacOS · '; }else if (preg_match('/fusion/i', $agent)) { $os = 'Android · '; } else { $os = 'Linux · '; } echo $os; }comments.php 中找到合适位置(比如评论作者的后面)添加以下代码<?php getOs($comments->agent); ?><?php getBrowser($comments->agent); ?>
2021年02月12日
30 阅读
0 评论
1 点赞
2021-02-08
ThinkPHP实现邮件发送功能
前言ThinkPHP 本身没有支持发送邮件功能,我们可以自己封装一个就行了,下面给我的实现方法分享一下。实现首先 ThinkPHP 是支持 Composer 的,我们直接安装 PHPMailer 即可composer require phpmailer/phpmailer接着在应用公共文件添加发送邮件的函数,说一下web_config这个是读取的全局中间价的网站配置,我懒得改了,大家自行修改一下就行。use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; /** * 系统邮件发送函数 * @param string $to 接收邮件者邮箱 * @param string $subject 邮件主题 * @param string $body 邮件内容 * @param bool $form_name 发件人昵称 * @param string $attachment 附件列表 * @return boolean */ function send_mail($to, $subject = '', $body = '', $form_name = false, $attachment = null) { $mail = new PHPMailer(true); $mail_config = Request::param('web_config'); //服务器配置 $mail->CharSet = "UTF-8"; $mail->SMTPDebug = 0; $mail->isSMTP(); $mail->Host = $mail_config['mail_stmp']; $mail->SMTPAuth = true; if ($mail_config['mail_ssl']) { $mail->SMTPSecure = 'ssl'; } else { $mail->SMTPAutoTLS = false; $mail->SMTPSecure = false; } $mail->Username = $mail_config['mail_name']; $mail->Password = $mail_config['mail_pwd']; $mail->Port = $mail_config['mail_port']; $mail->setFrom($mail_config['mail_name'], $form_name ? $form_name : $mail_config['mail_form']); $mail->addAddress($to, 'Joe'); $mail->addReplyTo($mail_config['mail_name'], $form_name ? $form_name : $mail_config['mail_form']); $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = $body; if (is_array($attachment)) { foreach ($attachment as $file) { is_file($file) && $mail->AddAttachment($file); } } return $mail->Send() ? true : $mail->ErrorInfo; }使用send_mail('1090370813@qq.com', '标题', '内容', '白鸽大人');参数为收件人邮箱地址,邮件标题,邮件内容,发件人昵称(此处可不填写,但是要保证函数里面配置的有默认的发件人昵称)最后有问题可在下方评论,一起探讨。
2021年02月08日
22 阅读
0 评论
0 点赞
2020-04-20
Typecho安装Redis加速内容
引入当你知道了高速的好,你必定想追求速度的极致。opcache 扩展的脚本加速、对象存储图片、动静分离成绩已然无法满足部分站长对速度的极致要求,难道没有更极致的速度么?答案是是有。Redis,一个可以缓存网站内容的扩展,可以解决你国外服务器延迟的痛苦。ps:文章内的步骤为宝塔用户步骤,部分非宝塔面板的用户可以参考并更换为自己的步骤。步骤准备如果有使用的话,暂时关闭宝塔防篡改插件、暂时关闭宝塔加固插件或云锁等应用。进入 php 设置,选择安装扩展,并安装 redis 扩展。服务器在软件商店搜索并安装 Redis,确认 Redis 正常运行。然后在配置文件内配置好适合自己服务器的值。插件下载Tpcache插件,上传至/usr/plugins并解压,修改文件夹名为TpCachehttps://github.com/phpgao/TpCache进入后台插件设置,将端口号修改为6379缓存驱动选择Redis结束至此,步骤就都完成了,此时只需尝试刷新缓存,访问自己的网站,即可体验到加速的效果。温馨提示:Redis 一时爽,网站报错两行泪,遇到评论错误、访问错误,建议先关闭 Redis 插件,然后重新开启试试。Redis 有概率把错误缓存,导致某个目录所有未登录用户访问全部都错误,无法评论等问题。你也可以选择安装宝塔面板第三方插件 “redis 数据管理工具”,查找错误的 Redis,并删除。补充说明使用 Redis 加速后容易出现诸如 “错误被缓存、评论者信息被缓存、登录密码信息被缓存” 等问题,请谨慎使用。
2020年04月20日
420 阅读
0 评论
0 点赞
1
2
3