前端及开发文章及欣赏

我的 Input框 不可能这么可爱

seo达人

作者:陈大鱼头

github: KRISACHAN

<input /> 标签是我们日常开发中非常常见的替换元素了,但是最近在刷 whattwg 跟 MDN 的时候发现 跟 <input /> 有很多相关的属性,选择器都没怎么用过,所以就开篇文章来整理一下一些比较有趣或者实用的知识点。



本篇文章默认大家已经知道 <input /> 标签的基本用法,不会做过多的基础说明~







没想到,这些选择器居然跟 input …

到写文章为止,根据的 drafts 指出,一共有3大类,16种跟 input 相关的选择。其实都挺有用的,善用它们,会让我们的用户体验更加美好。



下面我们来分享一下这3大类选择器的作用:







第一类:控制系(Input Control States)

选择器 作用

:enabled 选择可使用状态的 <input /> 元素

:disabled 选择不可使用状态的 <input /> 元素

:read-only 选择不可编辑状态的元素(不仅仅是 <input /> )

:read-write 选择可编辑状态的元素(不仅仅是 <input /> )

:placeholder-shown 选择 placeholder text 显示时的元素

:default 选择在 <button>,<input type="checkbox" />, <input type="radio" />, 以及 <option> 上的默认状态

第二类:输出系(Input Value States)

选择器 作用

:checked 选择处于选中状态的 <input type="radio" />

:indeterminate 选择状态不确定的表单元素与 <progress>

第三类:侦查系(Input Value-checking)

选择器 作用

:blank 选择处于空值时的 <input>,暂未被浏览器支持

:valid 选择验证通过的表单元素

:invalid 选择验证不通过的表单元素

:in-range 选择处于指定范围内的 <input />

:out-of-range 选择不处于指定范围内的 <input />

:required 选择必填的表单元素

:optional 选择选填的表单元素

:user-invalid 选择用户输入但值非法时的 <input />,暂未被浏览器支持

可怕,除了选择器,居然还跟这些属性有关系

<input> 除了有很多相关的选择器,结合不同的type还有不同的属性可以供使用。他们的作用如下:



属性 作用

maxlength 可输入的最大长度

minlength 可输入的最小长度

size 输入框的长度

readonly 输入框是否只读

required 输入框是否必填

multiple 输入框是否可以多选

pattern 输入框验证规则

min 可输入的最小值

max 可输入的最大值

step 输入框每次的增量

list 输入框绑定的可选值数据

placeholder 输入框预选文字

实战

通过上面的三类说明,我们大致了解了 <input /> 标签的相关信息,但是你们以为我是来列list的吗?



当然不是,还有实操啊~







纯CSS实现表单提交功能

首先我们来看个效果图







上面的效果就是一个纯CSS实现的表单提交功能,这是怎么实现的呢?下面我们直接看源码,然后一步一步地来分拆(不想看的可以直接CV下面的源码自己做测试~)



<style>

    :root {

      --error-color: red;

    }

    .form > input {

      margin-bottom: 10px;

    }

    .form > .f-tips {

      color: var(--error-color);

      display: none;

    }

    input[type="text"]:invalid ~ input[type="submit"],

    input[type="password"]:invalid ~ input[type="submit"] {

      display: none;

    }

    input[required]:focus:invalid + span {

      display: inline;

    }

    input[required]:empty + span {

      display: none;

    }

    input[required]:invalid:not(:placeholder-shown) + span {

      display: inline;

    }

</style>

<form class="form" id="form" method="get" action="/api/form">

    账号:

    <input data-title="账号" placeholder="请输入正确的账号" pattern="\w{6,10}" name="account" type="text" required />

    <span class="f-tips">请输入正确的账号</span>

    <br />

    密码:

    <input data-title="密码" placeholder="请输入正确的密码" pattern="\w{6,10}" name="password" type="password" required />

    <span class="f-tips">请输入正确的密码</span>

    <br />

    <input name="button" type="submit" value="提交" />

</form>



第一步:写好基础结构

首先我们来把基础结构给写好,代码如下:



<style>

    :root {

      --error-color: red;

    }

    .form > input {

      margin-bottom: 10px;

    }

    .form > .f-tips {

      color: var(--error-color);

      display: none;

    }

</style>

<form class="form" id="form" method="get" action="/api/form">

    账号:

    <input data-title="账号" placeholder="请输入正确的账号" pattern="\w{6,10}" name="account" type="text" required />

    <span class="f-tips">请输入正确的账号</span>

    <br />

    密码:

    <input data-title="密码" placeholder="请输入正确的密码" pattern="\w{6,10}" name="password" type="password" required />

    <span class="f-tips">请输入正确的密码</span>

    <br />

    <input name="button" type="submit" value="提交" />

</form>



扫一眼,嗯,挺简单的,都是常用的东西。咦,不对,这个 pattern 是什么东西?



在这里我们重点分享下 pattern 这个属性,这是一个用来验证 input[value] 是否合法的属性,里面的内容就是匹配value的,语法便是正则的语法,例子如下:



<label>

    <!--

当前pattern的内容就是验证input[name="part"]的value的,其规则如同里面的正则一样,匹配input[name="part"]的value是否是一个数字+3个大写字母

-->

    <input pattern="[0-9][A-Z]{3}" name="part" />

</label>



当然,不同的 input[type] 也会默认带有相应的 pattern ,例如 input[type="email"] 就是默认匹配了以下规则:



/^[a-zA-Z0-9.!#$%&'+\/=?^_`{|}~-]+@a-zA-Z0-9?(?:.a-zA-Z0-9?)$/

1

第二步:重点功能

input[type="text"]:invalid ~ input[type="submit"],

input[type="password"]:invalid ~ input[type="submit"] {

    display: none;

}

input[required]:focus:invalid + span {

    display: inline;

}

input[required]:empty + span {

    display: none;

}

input[required]:invalid:not(:placeholder-shown) + span {

    display: inline;

}



上面便是核心交互的实现。



首先第一个class就是保证了在两个输入框不通过的时候隐藏,就是当输入框值为空或者不符合验证规则,则隐藏提交按钮。



第二个,第三个class则是控制当用户在输入框输入内容时,如果不符合验证规则,则显示错误信息,否则则隐藏。



第四个class则是用过 placeholder 是否存在来控制错误信息的显隐,如果 placeholder 不显示,则证明用户正在输入,错误信息则根据用户输入的值来判断是否显隐,否则则隐藏。



状态切换

上面我们有提到一个选择器 :indeterminate ,这个是用于选择状态不确定的表单元素与 <progress> ,玩过扫雷的人都知道,右击除了可以选择红旗,还可以选择问号,就是选中,但不确定;又跟 promise 的 pending 状态类型,介于 resolve 与 reject 之间。



多了 :indeterminate 会给我们带来很多很有趣的体验。



首先我们来看看它的使用案例。



基础使用法

先看效果







代码如下:



<style>

    body {

        background: #333;

        color: #fff;

        padding: 20px;

        text-align: center;

    }

    input {

        margin-right: .25em;

        width: 30px;

        height: 30px;

    }

    label {

        position: relative;

        top: 1px;

        font-size: 30px;

    }

</style>

<form>

    <input type="checkbox" id="checkbox">

    <label for="option">点击左边</label>

</form>

<script>

      'use strict';

      checkbox.addEventListener('click', ev => {

        if (ev.target.readOnly) {

          ev.target.checked = ev.target.readOnly = false;

        } else if (!ev.target.checked) {

          ev.target.readOnly = ev.target.indeterminate = true;

        };

      });

</script>



这里面其实没有什么复杂的实现,只是做了个中间态的判断,就非常轻松的实现了radio的三种状态切换。



秀到头皮发麻法

先看效果







(此天秀效果来自于 Ben Szabo 的 codepen,有兴趣的可以仔细研究下,我何时才能有大佬这么优秀,嘤嘤嘤~)



输入框绑定的可选值

先看效果







其实代码很简单:



<input type="text" list="names" multiple />

<datalist id="names">

    <option value="kris">

    <option value="陈大鱼头">

    <option value="深圳金城武">

</datalist>



<input type="email" list="emails" multiple />

<datalist id="emails">

    <option value="chenjinwen77@foxmail.com" label="kris">

    <option value="chenjinwen77@gmail.com" label="kris">

</datalist>



<input type="date" list="dates" />

<datalist id="dates">

    <option value="2019-09-03">

</datalist>



这里原理就是通过 <input list="dates" /> 来绑定需要下拉显示的数据列表 <datalist id="dates"> 。



那么当我们要实现输入联想的时候,也可以通过修改 <datalist id="dates"> 的子元素来实现,而不是再写一大堆的操作函数来实现。



总结


JS----预编译及变量提升详解

seo达人

JS----预编译及变量提升详解

JS属于解释型语言,在执行过程中顺序执行,但是会分块先预编译然后才执行。因此在JS中存在一种变量提升的现象。搞懂预编译环节,变量提升自然而然也就懂了。本文讲围绕以下几点进行介绍(变量提升会穿插在其中讲解):



预编译执行步骤

示例演示



预编译执行步骤

预编译发生在函数执行的前一刻,过程如下:



创建AO对象,执行期上下文(后面更新关于执行期上下文详解)。

寻找函数的形参和变量声明,将变量和形参名作为AO对象的属性名,值设定为undefined.

将形参和实参相统一,即更改形参后的undefined为具体的形参值。

寻找函数中的函数声明,将函数名作为AO属性名,值为函数体。



至此,预编译环节结束,函数中咯变量按照最终AO对象中的值开始执行。接下来,结合示例演示就会更加清晰。



作者:北海北方

链接:https://juejin.im/post/5aa6693df265da23884cb571

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



示例演示

我们先来看下面这段代码:

function fn(a){

console.log(a);

var a = 123;

console.log(a);



    function a(){};

    console.log(a);

    

    var b = function(){};

    console.log(b);

    

    function d(){};

 }

 

 //调用函数

 fn(1);



作者:北海北方

链接:https://juejin.im/post/5aa6693df265da23884cb571

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

接下来我们来按照前面的步骤详细分析它的预编译执行过程:



创建AO对象



AO{

    //空对象    

}

复制代码

找形参和变量声明



AO{

    a : undefined,

    b : undefined

}

复制代码

形参和实参相统一



AO{

    a : 1,

    b : undefined

}

复制代码

找函数声明



AO{

    a : function a(){},

    b : undefined,

    d : function d(){}

}

复制代码预编译环节就此结束,此时的AO对象已经更新为:

AO{

    a : function a(){},

    b : undefined,

    d : function d(){}

}

复制代码函数开始逐行顺序执行:

 function fn(a){

    console.log(a);// 输出functiona(){}

    var a = 123;//执行到这里重新对a赋,AO对象再一次更新

    console.log(a);// 输出123

    

    function a(){};//预编译环节已经进行了变量提升,故执行时不在看这行代码

    console.log(a);// 输出123

    

    var b = function(){};//这个是函数表达式不是函数声明,故不能提升,会对AO中的b重新赋值

    console.log(b);//输出function(){}

    

    function d(){};

 }

复制代码至此,函数执行完毕,销毁AO对象。

我们再来看几个例子,熟悉函数的预编译过程。

示例一:

function test (a,b){

    console.log(a);

    c = 0;

    var c;

    a = 3;

    b = 2;

    console.log(b);

    function b(){};

    function d(){};

    console.log(b);



//调用函数

test(1);

复制代码它的AO创建过程如下(此处省略创建空AO对象的部分,下文同):

AO1{

    a : undefined,

    b : undefined,

    c : undefined

}



AO2{

    a : 1,

    b : undefined,

    c : undefined

}



AO3{

    a : 1,

    b : function b(){},

    c : undefined,

    d : function d(){}

}

复制代码至此预编译环节完成,开始执行:

function test (a,b){

    console.log(a); //输出1

    c = 0; //给AO对象中的c重新赋值0

    var c;//预编译环节变量提升,不再读此行代码

    a = 3;//给AO对象中的a重新赋值3

    b = 2;//给AO对象中的b重新赋值2

    console.log(b);//输出2

    function b(){};//预编译环节变量提升,执行时不再读这行代码

    function d(){};//预编译环节变量提升,执行时不再读这行代码

    console.log(b);//输出2



//调用函数

test(1);



复制代码示例二:

这个例子中我们引入全局对象GO。GO与AO的过程类似

function test(){

var a = b = 123;

}

test();

复制代码此函数的执行过程:先把123赋给b,再声明a,再把b赋给a。此时变量b未经声明就赋值,为全局变量。预编译环节如下:

GO1{

b : undefined

}

AO1{

a : undefined

}



GO2{

    b : 123;

}

AO2{

    a : 123;

}

复制代码示例三 :

console.log(test);

function test(test){

   console.log(test);

   var test = 234;

   console.log(test);

   function test(){};

}

test(1);

var test = 123;

复制代码我们来看它的预编译过程:

//执行前(页面加载完成时)生成GO对象

GO1{

    test : undefined

}

GO2{

    test : function(){}

}



//输出 function test(){...}



//执行test()前生成它的AO对象

AO1{

    test : undefined

}

AO2{

    test : 1

}

AO3{

    test : function test(){}

}



//预编译结束开始执行test(1);

AO4{

    test : 234

}

//输出234

复制代码示例四:

function demo(){

    console.log(b);

    if(a){

        var b = 100;

    }

    console.log(b);

    c = 234;

    console.log(c);

}

var a;

demo();

a = 10;

console.log(c);

复制代码我们来看它的预编译过程:

//首先是全局对象GO 

GO1{

    a : undefined

}

G02{

    a : undefined,

    demo : function demo(){}

}

//执行demo()前预编译,由于demo中的c未声明就使用故为全局对象



//输出undefined

GO3{

    a : undefined,

    demo : function demo(){}

    c : undefined

}

//此时a还是undefined,故不执行if()代码块

//输出还是undefined

GO4{

    a : undefined,

    demo : function demo(){}

    c : 234;

}

//输出234

GO5{

    a : 10,

    demo : function demo(){}

    c : 234;

}

//输出234


解决nodejs koa express以及vue,nuxt项目中使用别名映射vscode不提示的问题,兼容webpack的@和best-require 的:xxx 别名映射

seo达人

nodejs中使用别名映射,兼容webpack的@和best-require 的:xxx 别名映射

项目地址: https://github.com/langyuxiansheng/biu-server-admin



写在前面

研究了很久,找了很多资料发现都没有,只好自己去想办法,查资料.才弄好的,凌晨发布的,转载请注明出处.

在做nodejs项目开发的时候,你是不是也在为

require('./posts');

require('./controllers/posts');

require('../controllers/posts');

require('../../controllers/posts');

require('../../../apis/controllers/posts');



或者



require(ROOT_PATH + '/application/apis/controllers/posts');

// other require()...

require(ROOT_PATH + '/application/apis/controllers/users');

require(ROOT_PATH + '/application/apis/controllers/products');

require(ROOT_PATH + '/application/apis/services/rest');

require(ROOT_PATH + '/application/apis/config');



这样的写法而困扰;



那看完这篇文章,从此之后就可以告别这个烦恼了;



感谢一下 best-require 这个模块包的作者,不然还需要自己去写这个

npmjs 链接 https://www.npmjs.com/package/best-require

github 链接 https://github.com/yuezhihan/best-require



不废话了,进入正题 往下看:

  1. 安装库 best-require 进行别名映射





    npm i best-require --save


  2. 映射别名. 实例在本项目中 server/index.js 中





    const path = require('path');

    const ROOT_PATH = process.cwd();

    const SRC_PATH = path.join(ROOT_PATH, /server/src);

    console.log(ROOT_PATH, SRC_PATH);

    //映射目录别名

    require('best-require')(ROOT_PATH, {

        root: ROOT_PATH,

        src: SRC_PATH,

        controllers: path.join(SRC_PATH, '/controllers'),

        models: path.join(SRC_PATH, '/models'),

        routes: path.join(SRC_PATH, '/routes'),

        crawlers: path.join(SRC_PATH, '/crawlers'),

        services: path.join(SRC_PATH, '/services'),

        middleware: path.join(SRC_PATH, '/middleware'),

        lib: path.join(SRC_PATH, '/lib'),

        config: path.join(SRC_PATH, '/config'),

        logs: path.join(SRC_PATH, '/logs')

    });



    //运行服务

    require('./src/bin/Server').run();


  3. 设置 jsconfig.json





    {

        "compilerOptions": {

            "allowSyntheticDefaultImports": true,

            "baseUrl": "./",

            "paths": {

                "@/": ["client/"],

                ":root/": [""],

                ":config/": ["server/src/config/"],

                ":lib/": ["server/src/lib/"],

                ":services/": ["server/src/services/"],

                ":controllers/":["server/src/controllers/"],

                ":models/": ["server/src/models/"],

                ":routes/": ["server/src/routes/"],

                ":crawlers/": ["server/src/crawlers/"],

                ":middleware/": ["server/src/middleware/"],

                ":logs/": ["server/src/logs/"]

            }

        },

        "include": ["server/*/","client/*/"],

        "exclude": [

            "node_modules",

            "nuxt-dist",

            "server-dist"

        ]

    }


  4. vscode要安装 path-intellisense 插件 并在设置中配置setting.json



    vscode 中的设置,setting.json



    workspaceRoot 是当前的工作空间,就是当前编辑器打开的目录.



    配置如下





    {

        "path-intellisense.mappings": {

            "@": "${workspaceRoot}/client",

            ":root": "${workspaceRoot}",

            ":lib": "${workspaceRoot}/server/src/lib",

            ":controllers": "${workspaceRoot}/server/src/controllers",

            ":models": "${workspaceRoot}/server/src/models",

            ":routes": "${workspaceRoot}/server/src/routes",

            ":crawlers": "${workspaceRoot}/server/src/crawlers",

            ":services": "${workspaceRoot}/server/src/services",

            ":middleware": "${workspaceRoot}/server/src/middleware",

            ":config": "${workspaceRoot}/server/src/config",

            ":logs": "${workspaceRoot}/server/src/logs",

        }

    }


  5. 重启vscode,试试看吧!

    作者的目录结构









    vue中使用







    后续更新

    nodejs中使用sequelize的model映射,这样就解决了没得提示的烦恼了,让你的效率提升2个档次

    写在后面

    如果你遇到难题或者有疑问,有好的建议请留言反馈.

    这种提示以及Ctrl + 鼠标左键的跳转,只针对 .js 的文件, .vue的没试过.这个也只是为了解决 js方法映射后没提示的问题.


vue生命周期过程简单叙述

seo达人

vue 生命周期

每个 Vue 实例在被创建时都要经过一系列的初始化过程。设置数据监听、编译模板、挂载等等。vue生命周期还是不太容易理解,这里就简单地说一下它的整个过程。

1创建一个vue实例



new vue({

data () {

return {

}

    }

})



2 初始化事件和生命周期 beforeCreate 创建实例之前执行的钩子函数

3 初始化·注入和校验 created 实例创建完成后执行的钩子



new vue ({

data () {

return {

a: 1

}

},

created: function () {

console.log('created')

}

})



4 渲染页面 编译 beforeMount 将编译完成的html挂载在虚拟dom时执行的钩子

5 mouted钩子 挂载完毕对数据进行渲染 会做一些ajax情求初始化数据 mounted整个实例过程中只执行一次



new vue ({

data () {

return {

a: 1

}

},

created: function () {

console.log('created')

},

// 一些钩子函数

mouted: function () {

console.log('mounted')

}

})



6 修改数据 beforeUpdate 更新之前的钩子

7 updated 修改完成重新渲染

8 准备解除绑定子组件以及事件监听器 beforeDestroy

9 销毁完成 destroyed


图片切换简易版

seo达人

css:

*{margin:0;padding:0;}

tu{margin: 50px auto;padding: 10px;width: 500px;

background: rgb(201, 230, 128);text-align: center;}



html:



<body>

    <div id="tu">

        <P id="info"></P>

        <img src="jiao.jpg" alt="冰棒">

        <input type="button" id="yi" value="第一张">

        <input type="button" id="er" value="第二张">

    </div>

</body>



javascript:

window.onload = function(){

var yi = document.getElementById(“yi”);

var er = document.getElementById(“er”);

var img = document.getElementsByTagName(“img”)[0];

var imgArr = [ “jiao.jpg”,“san.jpg”,“bao.jpg”,“hua.jpg”,“pei.jpg”,“tu.jpg”,“xin.jpg”,“niu.jpg”]

var index = 0 ;

var info = document.getElementById(“info”);



    info.innerHTML = "一共" + imgArr.length + "张图片,当前第"+(index+1)+"张";

    yi.onclick = function(){

        index--;

        if(index < 0){

            index = imgArr.length - 1; 

        }

        img.src = imgArr[index];

        info.innerHTML = "一共" + imgArr.length + "张图片,当前第"+(index+1)+"张";

    }



    er.onclick = function(){

        index++;

         if(index > imgArr.length - 1){               

            index = 0; 

        }

        img.src = imgArr[index];

        info.innerHTML = "一共" + imgArr.length + "张图片,当前第"+(index+1)+"张";

    }

}


递推和递归的区别

seo达人

1,从程序上看,递归表现为自己调用自己,递推则没有这样的形式。



2,递归是从问题的最终目标出发,逐渐将复杂问题化为简单问题,最终求得问题



是逆向的。递推是从简单问题出发,一步步的向前发展,最终求得问题。是正向的。



3,递归中,问题的n要求是计算之前就知道的,而递推可以在计算中确定,不要求计算前就知道n。



4,一般来说,递推的效率高于递归(当然是递推可以计算的情况下)



最容易理解就是结合一个经典的例子:斐波那契数列



递归求解





int fib(n){

    return n < 2 ? 1 : fib(n-1)+f(n-2);

}



递推求解



int fib(int n){

    int fn   = 1;

    int fn_1 = 0;

    for(int i=0; i<n; i++) {

       int t = fn

       fn    = fn + fn_1;

       fn_1  = t;

    }

    return fn;

}



递推 Inductive 是从1 往 n推(未知)



递归Recursive是从n(未知)往1推, 再层层返回


HTML第一课

seo达人

HTML基本概况





HTML文档基本格式

样式如下:



注意:文章以下出现的“《》”书名号仅代表大于号“>”和小于号“<”。

主要包括:<!DOCTYPE>文档类型声明、《html》根标记、《head》头部标记、《bady》主题标记。

1.<!DOCTYPE>标记

标记位于文档的最前面,用于向浏览器说明 当前文档使用哪种 HTML 或 XHTML 标准规范。

2.《html》标记

《html》标记位于<!DOCTYPE>标记之后,也称根标记。用于告知浏览器其本身是一个HTML文档。《html》标记标志着HTML文档的开始,《/html》标记标志着HTML文档的结束,在他们之间的是文档的头部和主体内容。

3.《head》标记

《head》标记用于定义HTML文档的头部信息,也称头部信息。紧跟在《html》标记之后,主要用来封存其他位于文档头部的标记,一个HTML文档只能有一对《head》标记。

4.《body》标记

《body》标记用于定义HTML文档所要显示的内容,也称主体标记。浏览器中所要显示的所有文本、图像、音频、和视频等信息都必须位于《body》标记内。一个HTML文档只能有一对《body》标记。



HTML标记

所谓标记就是放在”<>"标记中表示 某个功能的编码命令,也称为HTML标签或HTML元素。

1.单标记和双标记

双标记:也称体标记,是指由开始和结束两个标记符组成的标记。基本语法格式如下:

<标记名>内容</标记名>

单标记:也称空标记,是指用一个标记符号即可完整的描述某个功能的标记。基本语法格式如下:

<标记名/>

2.注释标记



注意:注释标记中不能嵌套注释标记



标记属性

《h1 align = center》标题文本《h1》其中align为属性名,center位属性值,表示“标题文本”居中对齐,对于标题标记还可以设置文本左对齐、右对齐,对应的属性值是left和right。

在镶嵌结构中,HTML 元素总是遵循“就近原则”。



HTML文档头部相关标记

1.设置页面标题标记

《title》标记用于定义HTML页面的标题,必须位于《head》标记之内。一个HTML文档只能有一对《title》《/title》标记,《title》《/title》之间的内容将显示在浏览器窗口的标题栏中,基本语法格式如下:

《title》网页标题名称《/title》

2.定义页面元信息标记《meta/》

《meta/》标记用于定义页面的元信息,可重复在《head》头部标记中,在HTML中是一个单标记。

基本语法格式:

1.1《meta name=“名称” content="值“/》

(1)设置网页关键字

《meta name=“keywords” content="…"》

content属性的值用于定义关键字的具体内容,多个关键字内容之间可以用“,”分隔。

(2)设置网页描述

《meta name=“description” content=“…"》

content属性的值是用于定义描述的具体内容。需要注意的是网页描述的文字不必过多。

(3)设置网页作者

《meta name=“auther” content=“…”》

content属性的值是用于定义具体的作者信息。

2.1《meta http-equiv=“名称“ content=”值“

(1)设置字符集

《meta http-equiv=“Content-Type” content=“text/html;charset=utf-8“/》

(2)设置页面自动刷新与跳转

《meta http-equiv=“refresh” content=“10;url=http;//www.itcast.cn“/》



HTML文本控制标记

1.标题和段落标记

(1)标题标记

HTML提供了6个等级的标题,即《h1》《h2》《h3》《h4》《h5》《h6》.基本语法格式如下:

《hn align=“对齐方式“》标题文本《/hn》

(2)段落标记

段落的标记就是《/p》基本语法格式如下:

《p align=“对齐方式”》段落文本《/p》

(3)水平线标记《hr/》



含义 属性值

属性名:align,设置水平线的对齐方式 可选择left、right、center三种值,默认为center,居中对齐

属性名:size,设置水平线的粗细 以像素为单位,默认为2像素

属性名:color,设置水平线的颜色 可用颜色名称、十六进制#RGB、right(r,g,b)

属性名:width,设置水平线的宽度 可以是确定的像素值,也可以是浏览器窗口的百分比,默认为100%

(4)换行标记《br/》

使用Enter键换行的段落在浏览器中实际上并没有换行,只是多出来了一个字符的空格,而使用换行标记的段落却实现了强制换行的效果。

2.文本样式标记

文本样式标记《font》,用来控制网页中的字体、字号和颜色。基本语法格式如下:

《font 属性=“属性值”》文本内容《/font》



属性名 含义

face 设置文字的字体,例如微软雅黑、黑体、宋体等

size 设置文字的大小,可以取1~7之间的整数值

color 设置文字的颜色

注意:XHTML中不赞同使用《font》标记,可使用CSS样式代替《font》来定义文本的字体、大小和颜色。

3.文本格式化标记



标记 显示效果

《i》《/b》 字体以粗体方式显示

《i》《/i》 字体以斜体方式显示

《s》《/s》 字体以加删除线方式显示

《u》《/u》 字体以加下划线方式显示

4.特殊字符标记






关于 XSS攻击

seo达人

XSS攻击是什么

简介

攻击原理

例子

防御方法

简介

XSS(Cross Site Scripting, 跨站脚本攻击)又称是 CSS, 在 Web攻击中比较常见的方式, 通过此攻击可以控制用户终端做一系列的恶意操作, 如 可以盗取, 篡改, 添加用户的数据或诱导到钓鱼网站等

攻击原理

比较常见的方式是利用未做好过滤的参数传入一些脚本语言代码块通常是 JavaScript, PHP, Java, ASP, Flash, ActiveX等等, 直接传入到页面或直接存入数据库通过用户浏览器阅读此数据时可以修改当前页面的一些信息或窃取会话和 Cookie等, 这样完成一次 XSS攻击

例子

http://example.com/list?memo=&lt;script&gt;alert(“Javascript代码块”)&lt;/script&gt;

http://example.com/list?memo=&lt;strong οnclick=‘alert(“惊喜不断”)’>诱惑点击语句</strong>

http://example.com/list?memo=&lt;img src=’./logo.jpg’ οnclick=‘location.href=“https://blog.csdn.net/qcl108”;’/&gt;

以上例子只是大概描述了方式, 在实际攻击时代码不会如此简单

防御方法

防止 XSS安全漏洞主要依靠程序员较高的编程能力和安全意识

去掉任何对远程内容的引用 如 样式或 JavaScript等

Cookie内不要存重要信息为了避免 Cookie被盗, 最好 Cookie设置 HttpOnly属性防止 JavaScript脚本读取 Cookie信息

不要信任用户的输入, 必须对每一个参数值做好过滤或转译: (& 转译后 &amp;), (< 转译后 &lt;), (> 转译后 &gt;), (" 转译后 &quot;), (\ 转译后 &#x27;), (/ 转译后 &#x2F;), (;)等


网页设计基础之HTML(一)

seo达人

网页设计基础之HTML(一)

1.Web的基本概念

web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。

主要包含结构,表现和行三个方面



2.HTML简介

<!DOCTYPE html> 声明为 HTML5 文档

<html> 元素是 HTML 页面的根元素

<head> 元素包含了文档的元(meta)数据

<title> 元素描述了文档的标题

<body> 元素包含了可见的页面内容

<h1> 元素定义一个大标题

<p> 元素定义一个段落

<标记名>内容</标记名> 双标记,也称标记体

<标记名/> 单标记,也称空标记

<!--注释内容--> 注释标记

<标记名 属性1="属性值1" 属性2="属性值2">内容<//标记名>

<title>网页标题名</title> 设置页面标题标记

<meta/> 定义页面原信息

<link> 引用外部文件标记

1

2

3

4

5

6

7

8

9

10

11

12

13

14

注意元素的就近原则

补充:link的属性 请参考此网址



3.HTML入门

①HTML的概念:HTML 是用来描述网页的一种语言。

②HTML的文本控制标记

1.标题标记:

标题(Heading)是通过<h1> - <h6>标签进行定义的。



对齐方式:

left:设置标题文字左对齐

center:设置标题文字居中

ringt: 设置标题文字右对齐

使用方法 <h2 align="left">二级标题 左对齐</h2>



2.段落标记

段落是通过 <p>标签定义的;其他同标题标记一致。



3.水平线标记<hr/>

相关属性

使用方法<hr color="red" align="left" size="5" width"600"/>



4.换行标记<br/>

1.1文本样式标记

font的属性



1.2文本格式化标记

详情请点我



1.3特殊字符标记

详情请点我,并查看HTML字符实体部分



4.附上本节课的脑图





注:本文参考自菜鸟教程


字面量方式和new方式的区别及用法

seo达人

一 - 字面量方式和new方式

☛每次创建数组或对象的时候,都能用以下两种方法创建:咦?有什么区别呢?还有哪些可以有这两种方法呢?我到底用哪一种呢?



var arr = [];//字面量方法创建数组

var arr = new Array();//实例化构造函数方法创建数组



var obj = {};//字面量方法创建对象

var obj = new Object();//实例化构造函数方法创建对象



二 - 哪些对象可以new?

☛只要存在构造函数的都可以new出来。



var num = new Number();

var boo = new Boolean(); 

var str = new String(); 

var arr = new Array(); 

var obj = new Object(); 

var fn = new Function();

var reg = new RegExp();

var date = new Date();



基本上来说 js中对象,除了null ,undefined,其他的都是可以用new出来的。



三 - 字面量是什么?

字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量。



JavaScript支持字面量,允许使用一种简洁而可读的记法来创建对象、数组



字面量分为:字符串字面量(string literal )、数组字面量(array literal)和对象字面量(object literal),另外还有函数字面量(function literal)等等。



var num = 1;

var boo = true;

var str = "a";

var arr = [];

var obj = {};

var fn = function(){};

var reg = /\s/g;



四 - 两种的区别

字面量语法简单,直接,优雅

也没有必要去使用new去调用构造方法,减少代码,减少代码运算量。

那new这个操作符到底做了什么?

var arr = new Array();

/

new:

       1:var obj = {};

       2:obj.proto = Array.prototype;

       3:Array.call(obj);

/



五 - 使用哪一种?

字面量比new

比如:{}是字面量,可以立即求值



而new Object()本质上是方法(只不过这个方法是内置的)调用, 既然是方法调用,就涉及到在proto链中遍历该方法,当找到该方法后,又会生产方法调用必须的堆栈信息,方法调用结束后,还要释放该堆栈。

————————————————


日历

链接

blogger

蓝蓝 http://www.lanlanwork.com

存档