分类: 技术

  • 总结伪类与伪元素

    熟悉前端的人都会听过css的伪类与伪元素,然而大多数的人都会将这两者混淆。本文从解析伪类与伪元素的含义出发,区分这两者的区别,并且列出大部分伪类与伪元素的具体用法,即使你有用过伪类与伪元素,但里面总有一两个你没见过的吧。

    1.伪类与伪元素

    先说一说为什么css要引入伪元素和伪类,以下是css2.1 Selectors章节中对伪类与伪元素的描述

    CSS introduces the concepts of pseudo-elements and pseudo-classes  to permit formatting based on information that lies outside the document tree.

     

    直译过来就是:css引入伪类和伪元素概念是为了格式化文档树以外的信息。也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句话中的第一个字母,或者是列表中的第一个元素。下面分别对伪类和伪元素进行解释:

    伪类用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的元素时,我们可以通过:hover来描述这个元素的状态。虽然它和普通的css类相似,可以为已有的元素添加样式,但是它只有处于dom树无法描述的状态下才能为元素添加样式,所以将其称为伪类。

    伪元素用于创建一些不在文档树中的元素,并为其添加样式。比如说,我们可以通过:before来在一个元素前增加一些文本,并为这些文本添加样式。虽然用户可以看到这些文本,但是这些文本实际上不在文档树中。

     

    2.伪类与伪元素的区别

    这里通过两个例子来说明两者的区别。

    下面是一个简单的html列表片段:

    如果想要给第一项添加样式,可以在为第一个<li>添加一个类,并在该类中定义对应样式:

    HTML:

    CSS:

    如果不用添加类的方法,我们可以通过给设置第一个<li>的:first-child伪类来为其添加样式。这个时候,被修饰的<li>元素依然处于文档树中。

    HTML:

    CSS:

    下面是另一个简单的html段落片段:

    如果想要给该段落的第一个字母添加样式,可以在第一个字母中包裹一个<span>元素,并设置该span元素的样式:

    HTML:

    CSS:

    如果不创建一个<span>元素,我们可以通过设置<p>的:first-letter伪元素来为其添加样式。这个时候,看起来好像是创建了一个虚拟的<span>元素并添加了样式,但实际上文档树中并不存在这个<span>元素。

    HTML:

    CSS:

     

    从上述例子中可以看出,伪类的操作对象是文档树中已有的元素,而伪元素则创建了一个文档数外的元素。因此,伪类与伪元素的区别在于:有没有创建一个文档树之外的元素。

     

    3.伪元素是使用单冒号还是双冒号?

    CSS3规范中的要求使用双冒号(::)表示伪元素,以此来区分伪元素和伪类,比如::before和::after等伪元素使用双冒号(::),:hover和:active等伪类使用单冒号(:)。除了一些低于IE8版本的浏览器外,大部分浏览器都支持伪元素的双冒号(::)表示方法。

    然而,除了少部分伪元素,如::backdrop必须使用双冒号,大部分伪元素都支持单冒号和双冒号的写法,比如::after,写成:after也可以正确运行。

    对于伪元素是使用单冒号还是双冒号的问题,w3c标准中的描述如下:

    Please note that the new CSS3 way of writing pseudo-elements is to use a double colon, eg a::after { … }, to set them apart from pseudo-classes. You may see this sometimes in CSS. CSS3 however also still allows for single colon pseudo-elements, for the sake of backwards compatibility, and we would advise that you stick with this syntax for the time being.

    大概的意思就是:虽然CSS3标准要求伪元素使用双冒号的写法,但也依然支持单冒号的写法。为了向后兼容,我们建议你在目前还是使用单冒号的写法。

    实际上,伪元素使用单冒号还是双冒号很难说得清谁对谁错,你可以按照个人的喜好来选择某一种写法。

     

    4.伪类与伪元素的具体用法

    这一章以含义解析和例子的方式列出大部分的伪类和伪元素的具体用法。下面是根据用途分类的伪类总结图和根据冒号分类的伪元素总结图:

    伪类

    伪元素

    某些伪类或伪元素仍然处于试验阶段,在使用前建议先在Can I Use等网站查一查其浏览器兼容性。处于试验阶段的伪类或伪元素会在标题中标注。

     

    伪类

    状态

    由于状态伪类的用法大家都十分熟悉,这里就不用例子说明了。

    1 :link

    选择未访问的链接

    2 :visited

    选择已访问的链接

    3 :hover

    选择鼠标指针浮动在其上的元素

    4 :active

    选择活动的链接

    5 :focus

    选择获取焦点的输入字段

     

    结构化

    1 :not

    一个否定伪类,用于匹配不符合参数选择器的元素。

    如下例,除了第一个<li>元素外,其他<li>元素的文本都会变为橙色。

    HTML:

    CSS:

    2 :first-child

    匹配元素的第一个子元素。

    如下例,第一个<li>元素的文本会变为橙色。

    HTML:

    CSS:

    3 : last-child

    匹配元素的最后一个子元素。

    如下例,最后一个<li>元素的文本会变为橙色。

    HTML:

    CSS:

    4 first-of-type

    匹配属于其父元素的首个特定类型的子元素的每个元素。

    如下例,第一个<li>元素和第一个<span>元素的文本会变为橙色。

    HTML:

    CSS:

    5 :last-of-type

    匹配元素的最后一个子元素。

    如下例,最后一个<li>元素的文本会变为橙色。

    HTML:

    CSS:

    6 :nth-child

    :nth-child根据元素的位置匹配一个或者多个元素,它接受一个an+b形式的参数,an+b匹配到的元素示例如下:

    • 1n+0,或n,匹配每一个子元素。
    • 2n+0,或2n,匹配位置为2、4、6、8…的子元素,该表达式与关键字even等价。
    • 2n+1匹配位置为1、3、5、7…的子元素、该表达式与关键字odd等价。
    • 3n+4匹配位置为4、7、10、13…的子元素。

    如下例,有以下HTML列表:

    CSS:

    选择第二个元素,”Beta”会变成橙色:

    选择位置序号是2的倍数的元素,”Beta”, “Delta”, “Zeta”, “kappa”会变成橙色:

    选择位置序号为偶数的元素:

    选择从第6个开始,位置序号是2的倍数的元素,”Zeta”, “Theta”, “Kappa”会变成橙色:

    7 :nth-last-child

    :nth-last-child与:nth-child相似,不同之处在于它是从最后一个子元素开始计数的。

    8 :nth-of-type

    :nth-of-type与nth-child相似,不同之处在于它是只匹配特定类型的元素。

    如下例,第二个<p>元素会变为橙色。

    HTML:

    CSS:

    9 :nth-last-type

    :nth-last-of-type与nth-of-type相似,不同之处在于它是从最后一个子元素开始计数的。

    10 :only-child

    当元素是其父元素中唯一一个子元素时,:only-child匹配该元素。

    HTML:

    CSS:

    11 :only-of-type

    当元素是其父元素中唯一一个特定类型的子元素时,:only-child匹配该元素。

    如下例,第一个ul元素只有一个li类型的元素,该li元素的文本会变为橙色。

    HTML:

    CSS:

    12 :target

    当URL带有锚名称,指向文档内某个具体的元素时,:target匹配该元素。

    如下例,url中的target命中id值为target的article元素,article元素的背景会变为黄色。

    URL:

    http://example.com/#target

    HTML:

    CSS:

    表单相关

    1 :checked

    :checked匹配被选中的input元素,这个input元素包括radio和checkbox。

    如下例,当复选框被选中时,与其相邻的<label>元素的背景会变成黄色。

    HTML:

    CSS:

    2 :default

    :default匹配默认选中的元素,例如:提交按钮总是表单的默认按钮。

    如下例,只有提交按钮的背景变成了黄色。

    HTML:

    CSS:

    3 :disabled

    :disabled匹配禁用的表单元素。

    如下例,被禁用input输入框的透明度会变成50%。

    HTML:

    CSS:

    4 :empty

    :empty匹配没有子元素的元素。如果元素中含有文本节点、HTML元素或者一个空格,则:empty不能匹配这个元素。

    如下例,:empty能匹配的元素会变为黄色。

    第一个元素中有文本节点,所以其背景不会变成黄色;

    第二个元素中有一个空格,有空格则该元素不为空,所以其背景不会变成黄色;

    第三个元素中没有任何内容,所以其背景会变成黄色;

    第四个元素中只有一个注释,此时该元素是空的,所以其背景会变成黄色;

    HTML:

    CSS:

    5 :enabled

    :enabled匹配没有设置disabled属性的表单元素。

    6 :in-range

    :in-range匹配在指定区域内元素。

    如下例,当数字选择器的数字在5到10是,数字选择器的边框会设为绿色。

    HTML:

    CSS:

    7 :out-of-range

    :out-of-range与:in-range相反,它匹配不在指定区域内的元素。

    8 :indeterminate

    indeterminate的英文意思是“不确定的”。当某组中的单选框或复选框还没有选取状态时,:indeterminate匹配该组中所有的单选框或复选框。

    如下例,当下面的一组单选框没有一个处于被选中时,与input相邻的label元素的背景会被设为橙色。

    HTML:

    CSS:

    9 :valid

    :valid匹配条件验证正确的表单元素。

    如下例,当email输入框内的值符合email格式时,输入框的边框会被设为绿色。

    HTML:

    CSS:

    10 :invalid

    :invalid与:valid相反,匹配条件验证错误的表单元素。

    11 :optional

    :optional匹配是具有optional属性的表单元素。当表单元素没有设置为required时,即为optional属性。

    如下例,第一个input的背景不会被设为黄色,第二个input的背景会被设为黄色。

    HTML:

    CSS:

    12 :required

    :required与:optional相反匹配设置了required属性的表单元素。

    13 :read-only

    :read-only匹配设置了只读属性的元素,表单元素可以通过设置“readonly”属性来定义元素只读。

    如下例,input元素的背景会被设为黄色。

    HTML:

    CSS:

    14 :read-write

    :read-write匹配处于编辑状态的元素。input,textarea和设置了contenteditable的HTML元素获取焦点时即处于编辑状态。

    如下例,input输入框和富文本框获取焦点时,背景变成黄色。

    HTML:

    CSS:

    15 :scope(处于试验阶段)

    :scope匹配处于style作用域下的元素。当style没有设置scope属性时,style内的样式会对整个html起作用。

    如下例,第二个section中的元素的文本会变为斜体。

    HTML:

    注:目前支持这个伪类的浏览器只有火狐。

    语言相关

    1 :dir(处于实验阶段)

    :dir匹配指定阅读方向的元素,当HTML元素中设置了dir属性时该伪类才能生效。现时支持的阅读方向有两种:ltr(从左往右)和rtl(从右往左)。目前,只有火狐浏览器支持:dir伪类,并在火狐浏览器中使用时需要添加前缀( -moz-dir() )。

    如下例,p元素中的阿拉伯语(阿拉伯语是从右往左阅读的)文本会变成橙色。

    HTML:

    CSS:

    如下例,p元素中的英语文本会变成蓝色

    HTML:

    CSS:

    2 :lang

    :lang匹配设置了特定语言的元素,设置特定语言可以通过为了HTML元素设置lang=””属性,设置meta元素的charset=””属性,或者是在http头部上设置语言属性。

    实际上,lang=””属性不只可以在html标签上设置,也可以在其他的元素上设置。

    如下例,分别给不同的语言设置不同的引用样式:

    HTML:

    CSS:

    其他

    1 :root

    :root匹配文档的根元素。一般的html文件的根元素是html元素,而SVG或XML文件的根元素则可能是其他元素。

    如下例,将html元素的背景设置为橙色

    2.:fullscreen

    :fullscreen匹配处于全屏模式下的元素。全屏模式不是通过按F11来打开的全屏模式,而是通过Javascript的Fullscreen API来打开的,不同的浏览器有不同的Fullscreen API。目前,:fullscreen需要添加前缀才能使用。

    如下例,当处于全屏模式时,h1元素的背景会变成橙色

    HTML:

    JAVASCRIPT:

    CSS:

     

    伪元素

    1 ::before/:before

    :before在被选元素前插入内容。需要使用content属性来指定要插入的内容。被插入的内容实际上不在文档树中。

    HTML:

    CSS:

    2 ::after/:after

    :after在被元素后插入内容,其用法和特性与:before相似。

    3 ::first-letter/:first-letter

    :first-letter匹配元素中文本的首字母。被修饰的首字母不在文档树中。

    CSS:

    4 ::first-line/:first-line

    :first-line匹配元素中第一行的文本。这个伪元素只能用在块元素中,不能用在内联元素中。

    CSS:

    5 ::selection

    ::selection匹配用户被用户选中或者处于高亮状态的部分。在火狐浏览器使用时需要添加-moz前缀。该伪元素只支持双冒号的形式。

    CSS:

    6 ::placeholder

    ::placeholder匹配占位符的文本,只有元素设置了placeholder属性时,该伪元素才能生效。

    该伪元素不是CSS的标准,它的实现可能在将来会有所改变,所以要决定使用时必须谨慎。

    在一些浏览器中(IE10和Firefox18及其以下版本)会使用单冒号的形式。

    HTML:

    CSS:

    7 ::backdrop(处于试验阶段)

    ::backdrop用于改变全屏模式下的背景颜色,全屏模式的默认颜色为黑色。该伪元素只支持双冒号的形式

    HTML:

    CSS:

    参考文章

    1. An Ultimate Guide To CSS Pseudo-Classes And Pseudo-Elements

    2. CSS伪类与CSS伪元素的区别及由来

    原创文章转载请注明:

    转载自AlloyTeam:http://www.alloyteam.com/2016/05/summary-of-pseudo-classes-and-pseudo-elements/

     
  • wordpress 中英文判断

    在主题文件functions.php中加入

    function is_lang($lang) {

       return (ICL_LANGUAGE_CODE == $lang) ? true : false;

    }

    2
    在相应位置处调用方式:

    [cc lang=”php”]

    //英文状态下显示内容,is_lang()里面填写语言标识fr(法语),de(德语)等等···

     

    //非英文下显示内容


    [/cc]

    jquery代码在wordpress中不起作用,需要做的修改
    [cc lang=”比如原来的代码是: $(document).ready(function(){ $(“p”).after(“Hello“); }); 需要改为: jQuery(document).ready(function(){ jQuery(“p”).after(“Hello“); });”]

  • npm

    english  throw away  by a way  wonder

  • npm 安装出现 UNMET DEPENDENCY 的解决方案

     
    npm install express -g
    ...
    npm list -g
    D:UsersLsAppDataRoamingnpm
    └─┬ express@3.4.8
      ├── buffer-crc32@0.2.1
      ├─┬ commander@1.3.2
      │ └── keypress@0.1.0
      ├─┬ connect@2.12.0
      │ ├── UNMET DEPENDENCY batch 0.5.0
      │ ├── UNMET DEPENDENCY bytes 0.2.1
      │ ├── UNMET DEPENDENCY multiparty 2.2.0
      │ ├── UNMET DEPENDENCY negotiator 0.3.0
      │ ├── UNMET DEPENDENCY pause 0.0.1
      │ ├── UNMET DEPENDENCY qs 0.6.6
      │ ├── UNMET DEPENDENCY raw-body 1.1.2
      │ └── UNMET DEPENDENCY uid2 0.0.3
      ├── cookie@0.1.0
      ├── cookie-signature@1.0.1
      ├── debug@0.7.4
      ├── fresh@0.2.0
      ├── merge-descriptors@0.0.1
      ├── methods@0.1.0
      ├── mkdirp@0.3.5
      ├── range-parser@0.0.4
      └─┬ send@0.1.4
        └── mime@1.2.11
     
    npm ERR! missing: batch@0.5.0, required by connect@2.12.0
    npm ERR! missing: bytes@0.2.1, required by connect@2.12.0
    npm ERR! missing: pause@0.0.1, required by connect@2.12.0
    ...
    npm ERR! not ok code 0

     

    今天安装一些模块的时候发现 npm install 到了一个点之后就卡住了一样等了半天一直不动,接着中断看了下出现安装出现了 UNMET DEPENDENCY 的 模块,这个时候如果重新 install 一便的话,又会重头开始,如果又碰到卡壳就很烦。

    查了一下发现是跟旧版 npm 有关的问题: https://github.com/isaacs/npm/issues/1341#issuecomment-20634338

    方案一

    1
    2
    3
    rm -rf node_modules/    # 删除已安装的模块
    npm cache clean         # 清除 npm 内部缓存
    npm install             # 重新安装

    方案二

    1
    2
    3
    rm -rf node_modules/    # 删除已安装的模块
    sudo npm update -g npm  # 更新 npm
    npm install             # 重新安装

    方案三

    npm list 命令查看之后跑到缺失模块的目录下, 手动修复部分出错的模块:

    $ npm list -g
    D:UsersLsAppDataRoamingnpm
    └─┬ express@3.4.8
      ├── buffer-crc32@0.2.1
      ├─┬ commander@1.3.2
      │ └── keypress@0.1.0
      ├─┬ connect@2.12.0
      │ ├── UNMET DEPENDENCY batch 0.5.0
      │ ├── UNMET DEPENDENCY bytes 0.2.1
      │ ├── UNMET DEPENDENCY multiparty 2.2.0
      │ ├── UNMET DEPENDENCY negotiator 0.3.0
      │ ├── UNMET DEPENDENCY pause 0.0.1
      │ ├── UNMET DEPENDENCY qs 0.6.6
      │ ├── UNMET DEPENDENCY raw-body 1.1.2
      │ └── uid2@0.0.3
      ├── cookie@0.1.0
      ├── cookie-signature@1.0.1
      ├── debug@0.7.4
      ├── fresh@0.2.0
      ├── merge-descriptors@0.0.1
      ├── methods@0.1.0
      ├── mkdirp@0.3.5
      ├── range-parser@0.0.4
      └─┬ send@0.1.4
        └── mime@1.2.11
     
    npm ERR! missing: batch@0.5.0, required by connect@2.12.0
    npm ERR! missing: qs@0.6.6, required by connect@2.12.0
    npm ERR! missing: bytes@0.2.1, required by connect@2.12.0
    npm ERR! missing: pause@0.0.1, required by connect@2.12.0
    npm ERR! missing: raw-body@1.1.2, required by connect@2.12.0
    npm ERR! missing: negotiator@0.3.0, required by connect@2.12.0
    npm ERR! missing: multiparty@2.2.0, required by connect@2.12.0
    npm ERR! not ok code 0

     

    可以 cd 到具体出问题的模块目录下手动 npm install 重新安装也可以解决.

  • wordpress 修改数据库密码后 找不到后台登录密码时

    修改数据库密码后,wordpress网站打不开

    当你觉得数据库密码不够安全,想更改,可以在你的空间提供商网站的个人中心的数据库管理里面去修改。不过,当你修改了网站数据库的密码后,会导致网站打不开,提示“数据库连接错误”。如何在修改数据库密码后,不影响网站的正常访问呢?
    这里我用自己的wordpress建好的前端开发站做了一次实验,当修改数据库密码后,对网站后台程序不做任何修改的话,访问网站会提示“数据库连接错误”。这是由于网站搭建之初就为网站程序设置了一个连接数据库的密码,所以在你修改了网站数据库密码后,还需要对网站程序重新给定数据库的新密码。
    WordPress网站后台数据库修改密码后,网站打不开,提示“数据库连接错误”时,做如下修改:找到wordpress的wp-config.php文件,用notepad++打开,修改数据库密码为你空间数据库的最新密码。
    // ** MySQL 设置 – 具体信息来自您正在使用的主机 ** //
    /** WordPress 数据库的名称 */
    define(‘DB_NAME’, ‘空间数据库名称’);/** MySQL 数据库用户名 */
    define(‘DB_USER’, ‘空间数据库帐户’);

    /** MySQL 数据库密码 */
    define(‘DB_PASSWORD’, ‘空间数据库最新密码’);

    /** MySQL 主机 */
    define(‘DB_HOST’, ‘空间数据库连接地址’);

    /** 创建数据表时默认的文字编码 */
    define(‘DB_CHARSET’, ‘utf8’);

    /** 数据库整理类型。如不确定请勿更改 */
    define(‘DB_COLLATE’, ”);
    将修改好的wp-config.php文件重新上传覆盖原来的文件,然后重新访问站点就可以了。
    如果是其他后台cms搭建的网站在修改数据库密码后网站无法访问,这里你可以留言一下,我将根据具体的后台cms给您回复。

     
     
     

    WordPress忘记密码找回登录密码的四种行之有效的方法

     

    WordPress忘记密码找回登录密码的四种行之有效的方法

    PS:20170214更新,感谢SuperDoge同学提供的方法,登入phpMyAdmin后,先从左边选自己的数据库,然后点上面的 SQL 标签页,执行下面命令:

    1
    
    UPDATE `wp_users` SET `user_pass`='$P$BWZhQxx/R9UCBgECUhxsV0EKfqfEh31' WHERE `user_login`='freehao123'

    然后使用用户名:freehao123,密码:admin 登入。注意如果你的用户名是其它的,请在上面的命令中替换,登录时使用这个用户名登录。

    一、最简单的找回Wordpress密码:后台用邮件直接找回

    1、忘记了Wordpress登录密码,直接使用Wordpress登录后台的“找回密码”,输入你的管理员邮箱,就会收到重置密码的邮件了,点击重置链接,设置新的密码即可。

    Wordpress忘记密码后台直接找回

    2、不过,使用后台直接找回密码有两个前提:一是你当初安装Wordpress时填写的是自己的邮箱,二是你的主机可以发送重置密码的邮件,二者缺一,则会导致找回密码失败。

    二、最直接的重置Wordpress密码:PhpMyAdmin修改MD5

    1、进入到主机的PhpMyAdmin管理界面,这是老版本的Godaddy空间管理SQL数据库的地方。

    Wordpress忘记密码进入SQL地址

    2、注意现在新购买的Godaddy主机都是采用Cpanel面板了,数据库中有PhpMyAdmin管理链接。

    Wordpress忘记密码查看Cpanel地址

    3、进入到PhpMyAdmin后,点击wp_users这个表。

    Wordpress忘记密码找到表

    4、再点击修改用户参数。(注意:user_login是登录名,默认的是admin,如果你这之前改过用户名,则显示的是其它的)。

    Wordpress忘记密码编辑参数

    5、在这里将user_pass值改成:5d41402abc4b2a76b9719d911017c592,执行,保存。

    Wordpress忘记密码执行保存

    6、完成后,你就可以使用密码:hello 来登录你的Wordpress了,登录到Wordpress后台后要记得马上修改密码。

    Wordpress忘记密码使用新的登录

    三、最快捷的修改Wordpress密码:执行SQL命令

    1、进入到PhpMyAdmin的SQL执行命令页面,执行以下命令:

    
    update wp_users set user_pass=md5("123456") where user_login='admin';
    

    2、123456是你的Wordpress新密码,admin是管理员账号。执行完了命令后,你就可以用新的密码来登录Wordpress了。

    Wordpress忘记密码执行SQL命令

    四、最方便的设置Wordpress新密码:用PHP文件重置密码

    PS:2014年3月7日更新,感谢 arefly.com 博主提供了新的重置Wordpress密码的PHP文件:WordPress恢复密码PHP文件下载地址。将此文件上传到你的网站根目录,然后输入所有关于你站点的MYSQL信息和需要更改的WordPress帐号及密码,点击“重新设定密码”就行了。该PHP工具在使用后会尝试自动删除,但是如果删除失败,记得自己删除这个文件来确保网站的安全。

    新的重置Wordpress密码的PHP文件

    1、如果你没有权限进入数据库管理系统,或者不想去那么麻烦地使用PhpMyAdmin,则可以试试用PHP文件重置Wordpress密码的方法。

    2、将以下代码复制,保存为wppw.php文件。(代码来自:https://www.yiduqiang.com/wordpress-password-changes.html

    
    <?php
    /*你的数据库服务器地址,一般保持默认*/
    $servername = "localhost:3306";
    /*数据库用户名*/
    $phpMyadminUser = "root";
    /*数据库密码*/
    $phpMyadminKey = "yiduqiang";
    /*数据库名称*/
    $phpMyadminName = "test";
    /*wordpress数据表格前缀*/
    $QZ = "wp_";
    /*你要设置的wordpress新密码*/
    $NewKey = "yiduqiang";
    /*你要设置新密码的用户名*/
    $wordpress_User = "yiduqiang";
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="https://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>wordpress密码找回工具</title>
    </head>
    <body>
    <?php
    error_reporting(0);
    if(!mysql_connect($servername,$phpMyadminUser,$phpMyadminKey))
    {
        echo "对不起,数据库链接出错。<br />";
    }
    else
    {
        echo "数据库链接成功。<br />";
        mysql_select_db($phpMyadminName,mysql_connect($servername,$phpMyadminUser,$phpMyadminKey));
        if (!mysql_query("update ".$QZ."users set user_pass='".md5($NewKey)."' where user_login='".$wordpress_User."'"))
        {
            echo "对不起,修改密码失败。";
        }
        else
        {
            echo "修改密码成功。";
        }
    }
    ?>
    </body>
    </html>
    

    3、或者直接下载我已经保存好的wppw.php文件:WordPress重置密码PHP文件。打开wppw.php文件,将数据库用户名、密码、名称等改成你的,还有WP的新密码。

    Wordpress忘记密码修改连接数据库

    4、特别注意:有些主机的数据库Host地址可能不是默认的Localhost,例如Godaddy的主机就是一连串的URL地址。

    Wordpress忘记密码注意数据库主机

    4、将wppw.php文件用FTP的方式上传到你的网站的根目录下。

    Wordpress忘记密码上传到根目录

    5、然后打开:https://域名/wppw.php,页面会提示你密码修改成功。如果有提示你数据库连接错误,请返回仔细检查wppw.php中的数据库部分信息有没有错误。

    Wordpress忘记密码修改成功

    五、Wordpress找回密码方法小结

    1、使用Wordpress自带的找回密码功能是最简单最方便的,如果主机不支持php mail()函数,可以使用SMTP来代替,方法:WordPress评论回复邮件通知

    2、Wordpress上传重置密码的PHP文件在使用完了之后要记得删除,以免出现安全隐患。在使用PhpMyAdmin执行SQL命令前要记得备份数据,以免失败导致数据丢失。

     
  • vue elementUI项目中遇到的问题整理ing

    1、本地json数据调用

    ①思路:有直接调用路径的方式

    ②思路:可以在export JS文件中建立变量,然后在VUE页面文件中export。之后设置为变量值。

    例如新建一个表单里面的,国家货币,数据选项调用本地json货币数据

    expor JS文件中 定义数组

    vue页面中,先导入,再引用变量
    <el-select v-model=”form.currency” filterable placeholder=”货币类型” class=”inputW”>
    <el-option v-for=”money in moneys” :key=”money” :label=”money.label” :value=”money.value“>
    </el-option>
    </el-select>

    moneys:数据池

    money.label:选项展示数据

    money.value:传入后台数据

    2、select for循环option,报错“Avoid using non-primitive value as key, use string/number value instead.”

    <el-select v-model=”form.Name” filterable placeholder=”供应商销售层”>
    <el-option v-for=”carrier in carriers” :key=”carrier.id” :label=”carrier.name” :value=”carrier.id”>
    </el-option>
    </el-select>

    key:设置时候,选择value内值

    Vue在渲染元素时,处于效率考虑,会尽可能的复用已有的元素而非重新渲染。如以下举例,虽DOM变了,但是之前输入的内容并没有改变,说明被复用了,使用vue提供的key属性,可以让你I及决定是否要复用元素,key值必须是唯一的。

    https://blog.csdn.net/xukongjing1/article/details/81587549

    https://blog.csdn.net/wangjiaohome/article/details/79865575

    3、[Vue warn]: Invalid prop: custom validator check failed for prop “name”. 
    (found in component <icon> at /var/www/html/vueApp/node_modules/vue-awesome/components/Icon.vue)

    查询是否有icon名字写错!

  • 好用的数据接口模拟工具easymock和好用的数据接口测试工具postman

    数据接口之福音,现在才发现,扶额……

    easymock可以模拟接口数据,就不用受限制于后台接口程序员啦(适合前端开发快速,接口还没完善)

    http://easy-mock.com/

    postman可以看真实的接口返回数据,和应该接收前端数据,就可以看看接口是否返回正确。(适合后台程序员检测接口返回值,接收值)

    详细介绍和教程

    API自动化测试利器——Postman

  • ATOM快捷键

    文件切换

    ctrl-shift-s 保存所有打开的文件
    cmd-shift-o 打开目录
    cmd-\ 显示或隐藏目录树
    ctrl-0 焦点移到目录树
    目录树下,使用a,m,delete来增加,修改和删除
    cmd-tcmd-p 查找文件
    cmd-b 在打开的文件之间切换
    cmd-shift-b 只搜索从上次git commit后修改或者新增的文件

    导航

    (等价于上下左右)
    ctrl-p 前一行
    ctrl-n 后一行
    ctrl-f 前一个字符
    ctrl-b 后一个字符

    alt-Balt-left 移动到单词开始
    alt-Falt-right 移动到单词末尾

    cmd-rightctrl-E 移动到一行结束
    cmd-leftctrl-A 移动到一行开始

    cmd-up 移动到文件开始
    cmd-down 移动到文件结束

    ctrl-g 移动到指定行 row:column 处

    cmd-r 在方法之间跳转

    目录树操作

    cmd-\ 或者 cmd-k cmd-b 显示(隐藏)目录树
    ctrl-0 焦点切换到目录树(再按一次或者Esc退出目录树)
    a 添加文件
    d 将当前文件另存为(duplicate)
    i 显示(隐藏)版本控制忽略的文件
    alt-right 和 alt-left 展开(隐藏)所有目录
    ctrl-al-] 和 ctrl-al-[ 同上
    ctrl-[ 和 ctrl-] 展开(隐藏)当前目录
    ctrl-f 和 ctrl-b 同上
    cmd-k h 或者 cmd-k left 在左半视图中打开文件
    cmd-k j 或者 cmd-k down 在下半视图中打开文件
    cmd-k k 或者 cmd-k up 在上半视图中打开文件
    cmd-k l 或者 cmd-k right 在右半视图中打开文件
    ctrl-shift-C 复制当前文件绝对路径

    书签

    cmd-F2 在本行增加书签
    F2 跳到当前文件的下一条书签
    shift-F2 跳到当前文件的上一条书签
    ctrl-F2 列出当前工程所有书签

    选取

    大部分和导航一致,只不过加上shift

    ctrl-shift-P 选取至上一行
    ctrl-shift-N 选取至下一样
    ctrl-shift-B 选取至前一个字符
    ctrl-shift-F 选取至后一个字符
    alt-shift-Balt-shift-left 选取至字符开始
    alt-shift-Falt-shift-right 选取至字符结束
    ctrl-shift-Ecmd-shift-right 选取至本行结束
    ctrl-shift-Acmd-shift-left 选取至本行开始
    cmd-shift-up 选取至文件开始
    cmd-shift-down 选取至文件结尾
    cmd-A 全选
    cmd-L 选取一行,继续按回选取下一行
    ctrl-shift-W 选取当前单词

    编辑和删除文本

    基本操作

    ctrl-T 使光标前后字符交换
    cmd-J 将下一行与当前行合并
    ctrl-cmd-upctrl-cmd-down 使当前行向上或者向下移动
    cmd-shift-D 复制当前行到下一行
    cmd-Kcmd-U 使当前字符大写
    cmd-Kcmd-L 使当前字符小写
    cmd-shift-P 搜索命令

    删除和剪切

    ctrl-shift-K 删除当前行
    cmd-backspace 删除到当前行开始
    cmd-fn-backspace 删除到当前行结束
    ctrl-K 剪切到当前行结束
    alt-backspace 或 alt-H 删除到当前单词开始
    alt-delete 或 alt-D 删除到当前单词结束

    多光标和多处选取

    cmd-click 增加新光标
    cmd-shift-L 将多行选取改为多行光标
    ctrl-shift-upctrl-shift-down 增加上(下)一行光标
    cmd-D 选取文档中和当前单词相同的下一处
    ctrl-cmd-G 选取文档中所有和当前光标单词相同的位置

    括号跳转

    ctrl-m 相应括号之间,html tag之间等跳转
    ctrl-cmd-m 括号(tag)之间文本选取
    alt-cmd-. 关闭当前XML/HTML tag

    编码方式

    ctrl-shift-U 调出切换编码选项

    查找和替换

    cmd-F 在buffer中查找
    cmd-shift-f 在整个工程中查找

    代码片段

    alt-shift-S 查看当前可用代码片段

    ~/.atom目录下snippets.cson文件中存放了你定制的snippets

    定制说明

    自动补全

    ctrl-space 提示补全信息

    折叠

    alt-cmd-[ 折叠
    alt-cmd-] 展开
    alt-cmd-shift-{ 折叠全部
    alt-cmd-shift-} 展开全部
    cmd-k cmd-N 指定折叠层级 N为层级数

    文件语法高亮

    ctrl-shift-L 选择文本类型

    使用Atom进行写作

    ctrl-shift-M Markdown预览
    可用代码片段

    b, legal, img, l, i, code, t, table

    git操作

    cmd-alt-Z checkout HEAD 版本
    cmd-shift-B 弹出untracked 和 modified文件列表
    alt-g down alt-g up 在修改处跳转
    alt-G D 弹出diff列表
    alt-G O 在github上打开文件
    alt-G G 在github上打开项目地址
    alt-G B 在github上打开文件blame
    alt-G H 在github上打开文件history
    alt-G I 在github上打开issues
    alt-G R 在github打开分支比较
    alt-G C 拷贝当前文件在gihub上的网址

    推荐一些好用的插件

  • 点击弹出li的索引值

    有个面试题,是点击一个li,弹出此li的索引值

    • content content 1
    • content content 2
    • content content 3
    • content content 4
    • content content 5

    // *用闭包解决索引值,变量,穿透作用域链*

    var oUl = document.getElementById(“oList”);
    var oLi = oUl.getElementsByTagName(“li”);
    alert(oLi.length);
    for(var i = 0;i <oLi.length;i++){
    (function(){
    var n = i;
    oLi[i].onclick = function(){
    alert(n+1);
    }
    })(i)
    }
    // 利用事件绑定,给ul绑定进行捕获。
    // 浏览器的事件模型分为三个阶段 1、捕获阶段 2、目标阶段 3、冒泡阶段
    var oUl = document.getElementById(“oList”);
    oUl.onclick = function(event){
    var tg = event.target;
    var oLi = oUl.getElementsByTagName(“li”);
    for(var i = 0;i<oLi.length;i++){
    if(oLi[i]===tg){
    alert(i+1);
    }
    }
    }

  • js获取不到div.style.left,解决方案

    element.style.left 只能获得element的行内样式,一般写在style或css文件内的left就无法获得。

    解决方案,通过字符串截取和隐式转换

    var oBox=$(“box”);
    document.onkeydown=function(evt){
    var e = evt||window.event;
    var addNum = 10;
    var _left = strToNum(oBox.style.left);
    var _top = strToNum(oBox.style.top);
    if(e.keyCode==37){
    oBox.style.left=(_left-addNum)+”px”
    }
    if(e.keyCode==38){
    oBox.style.top=(_top-addNum)+”px”;
    }
    if(e.keyCode==39){
    oBox.style.left=(_left+addNum)+”px”;
    }
    if(e.keyCode==40){
    oBox.style.top=(_top+addNum)+”px”;
    }
    }
    }
    function $(id){
    return document.getElementById(id);
    }
    function strToNum(str){
    var index = str.indexOf(“px”);
    return str.substring(0,index)-0;

    }