js 相关知识

昨日回顾

1.隐藏:  
 display:none;
 opacity: 0;
2.阴影:
  box-shadow: x轴偏移 y轴偏移 虚化 阴影宽度 red;x轴偏移 y轴偏移 虚化 阴影宽度 red;
  注:可多个阴影
3.过度:
  transition: 0.2s
4.定位:
  position: relative| absolute | fixed
  1.四个定位方位打开
  2.盒子四边参考参考系四边布局
  3.上下取上,左右取左
  4.参考系: 原有位置| 最近的定位父级(父相子绝)|页面窗口
  5.z-index 决定上下显示层次
  注: calc(100%)
5.js:
  定义:运行在浏览器上的前端脚本编程语言
  作用:处理前端数据,渲染页面,修改样式,完成交互,前后台数据通信
  三种引入:行间式,内联式,外联式
  基本数据类型:数字,布尔,字符串,未定义,数组,对象,函数,
  弱语言:会根据当前的实际运行环境,自行决定存储数据类型

今日内容

1.js的运算符, 控制流程,函数,四种变量,数据类型的运用 (***)

2.js的页面交互(*****)

算数运算符: + - * / %(取余) ++(自增) --(自减)  
赋值运算符: = += -= *= /= %=
比较运算符: ==(等于) ===(绝对等于) !=(不等于) !==(不绝对等于)
逻辑运算符:&&(与) ||(或) !(非)
三目运算符: 结果 = 条件表达式 ? 结果1 :结果2;
  语法规则:条件表达式成立,将结果1 赋值给结果; 反之 赋值结果2;
eg:

  var weather = prompt("天气(晴|雨)"); // 文本输入弹出框
  var res = tq == '晴' ? "今天天气挺好" : "请假回家收衣服";
  console.log(res); // 今天天气挺好

 if 结构    

if (条件表达式) {
    代码块;
}
// 1. 当条件表达式结果为true,会执行代码块;反之不执行
// 2. 条件表达式可以为普通表达式
// 3. 0、undefined、null、""、NaN为假,其他均为真

// 1.双分支
if (表达式1) {
    代码块1;
} else {
    代码块2;
}

// 2.多分支
if (表达式1) {
    
} else if (表达式2) {
    
} 
...
else if (表达式2) {
    
} else {
    }

if (表达式1) {
    if (表达式2) {
        
    }
}

for循环

for (循环变量①; 条件表达式②; 循环变量增量③) {
    代码块④;
}
// for循环执行的顺序:① ②④③ ... ②④③ ②,入口为①,出口为②,②④③就是循环过程

// 案例:
for (var i = 0; i < 5; i++) {
    console.log(i);
}

// 结果:
0
1
2
3
4

循环while

while (条件表达式) {
    代码块;
}
// 条件满足执行代码块,条件不满足跳出循环

// 案例:
var i = 0;
while (i < 5) {
    console.log(i);
    i++;
}

// 结果:
0
1
2
3
4
    do {

    } while (条件);
    `;

    count = 0;
    do {
        console.log('循环体一定会执行');
        count++;
    } while (count < 3);

for 迭代

var arr = [1, 2, 3, 4, 5]
for (num in arr) {
    console.log(num);
}

// 结果:
0
1
2
3
4

数据烈性运用

  // 字符串
    // 1)定义:
    let ss = '123abc呵呵';
    let res;
    console.log(ss);
    // 2)索引
    res = ss[0];
    console.log(res);
    // 3)切片
    res = ss.slice(3, 6);
    console.log(res);
    // 4)替换
    res = ss.replace('abc', 'ABC');
    console.log(res);
    // 5)拆分: string => array
    res = ss.split('');
    console.log(res);
    // 6) 拼接
    res = ss + ss;
    console.log(res);
    // 7) 迭代
    for (s of ss) {
        console.log(s);
    }

    // 数组
    // array => string
    let arr = [3, 1, 2, 4, 5];
    res = arr.join('');  // 默认,  |  ''  |  '自定义符合'
    console.log(res);
    // 迭代
    for (a of arr) {
        console.log(a);
    }
    // 排序
    // arr.sort();
    // arr.reverse();
    // console.log(arr);

    // 增删改查
    console.log(arr[4]);
    arr[4] = 555;
    console.log(arr[4]);

    arr.push(100);  // 尾增
    arr.unshift(200);  // 头增
    console.log(arr);

    arr.pop();  // 尾删
    arr.shift();  // 头增
    console.log(arr);

    // 重点:增删改
    console.log(arr);
    // 开始操作的索引 操作的长度 操作后的结果(不定长0~n个)
    arr.splice(2, 1, 222, 333, 444);
    console.log(arr);

    // 不定长参数
    function f(...a) {
        console.log(a)
    }
    f(1, 2, 3, 4, 5, 6)


    // 字典
    // 增删改查
    dic = {};
    //
    dic['name'] = 'owen';
    dic.age = 18;
    //
    dic.age = 20;
    // 对象的删除
    delete dic.age;
    console.log(dic);
    //
    console.log(dic.name);

    // 字典的迭代用 for in
    for (k in dic) {
        console.log(k);
    }

四种变量

 {
        let a = 10;
        const b = 20;
        var c = 30;
        d = 40;
    }
    // console.log(a);  // 有{}就不能被外界访问
    // console.log(b);  // let和const有块级作用域,不允许重复定义
    // console.log(c);  // var没有块级作用域, 但有局部作用域,可以重复定义
    // console.log(d);  // 没有关键字声明的变量是全局变量,在函数内部声明的外部也可以用

函数

(function () {


    `函数的定义
    function 函数名(参数列表) {
        函数体;
        return 返回值
    }

    function:定义函数的关键字
    函数名:使用函数的依据,就是一个变量,可以赋值给其他变量,也可以存储在容器中,也可以作为函数的参数与返回值
    参数列表:都是按位置传,形参与实参个数不需要统一,但是一定是按位赋值 (你传你的,我收我的)
    函数体:完成功能的主体代码
    返回值:只能返回一个值
    `;

    function fn() {
        console.log('fn run');
        return [1, 2]
    }
    let res = fn();
    console.log(res);
    let func = fn;
    func();

    function my_fn(a, b) {
        console.log('参数', a, b)
    }
    my_fn();  // 你收我不传
    my_fn(10);  // 你收我传不够
    my_fn(10, 20, 30);  // 你收我传多


    `匿名函数
    function () {
        // 没有名字的函数就是匿名函数
    }
    `;
    // 需求需要一个函数地址,就可以传入一个匿名函数
    function fn100(fn) {
        fn()
    }
    fn100( function () { console.log('传进去的匿名函数') } )

    // 用变量接收匿名函数:第二种声明函数的方式
    let f = function (a, b) {
        console.log('ffffffffff')
    };
    f();

    // 为事件提供方法体
    hhh.onclick = function () {
        console.log('hhh 被点击了')
    };

    // 匿名函数自调用:一次性使用
    (function (a, b) {
        console.log('匿名函数自调用:', a, b)
    })(10, 20, 30);

    let abc = 10;

    hhh.onclick = function () {
        console.log(abc);
    };

})() 

 JS选择器

① getElement系列

// 1.通过id名获取唯一满足条件的页面元素
document.getElementById('id名');
// 该方法只能由document调用

// 2、通过class名获取所有满足条件的页面元素
document.getElementsByClassName('class名');
// 该方法可以由document及任意页面元素对象调用
// 返回值为HTMLCollection (一个类数组结果的对象,使用方式同数组)
// 没有匹配到任何结果返回空HTMLCollection对象 ([])

// 3.通过tag名获取所有满足条件的页面元素
document.getElementsByTagName('tag名');
// 该方法可以由document及任意页面元素对象调用
// 返回值为HTMLCollection (一个类数组结果的对象,使用方式同数组)
// 没有匹配到任何结果返回空HTMLCollection对象 ([])
eg: getElement系列
let h1 = document.getElementById('hhh'); console.log(h1); console.log(hhh); // id是标签的唯一标识,所以js通过id名可以直接拿到标签 // let h2s = document.getElementsByClassName('hh2'); let h2s = document.getElementsByTagName('h2'); console.log(h2s); console.log(h2s[0]);

② querySelect系列

// 1.获取第一个匹配到的页面元素
document.querySelector('css3语法选择器');
// 该方法可以由document及任意页面对象调用

// 2.获取所有匹配到的页面元素
document.querySelectorAll('css3语法选择器');
// 该方法可以由document及任意页面对象调用
// 返回值为NodeList (一个类数组结果的对象,使用方式同数组)
// 没有匹配到任何结果返回空NodeList对象 ([])
eg:
// querySelector就是获取一个 // h1 = document.querySelector('#hhh'); h1 = document.querySelector('body h1#hhh'); console.log(h1); h21 = document.querySelector('#hhh ~ .hh2'); console.log(h21); // querySelectorAll就是获取多个 h2s = document.querySelectorAll('#hhh ~ .hh2'); console.log(h2s); // 优势:通过id、class或标签,都可以快速定位到某一个或某几个 h22 = document.querySelector('.hh2:nth-of-type(2)'); console.log(h22);

页面标签的操作

   // 1)找目标标签
    let h1 = document.querySelector('h1');

    // 2)获取样式、内容、属性
    let fontSize = h1.style.fontSize;
    console.log(fontSize);
    // 标签.style.属性名 只能获取行间式
    // getComputedStyle(ele_name, 伪类选择器通常用null填充) 能获取所有方式的样式(内联与外联叫计算后样式)
    let bgColor = getComputedStyle(h1, null).backgroundColor;
    console.log(bgColor);

    console.log(h1.innerText);
    console.log(h1.innerHTML);

    console.log(h1.getAttribute('id'));
    console.log(h1.getAttribute('owen'));


    // 3)修改样式、内容、属性
    h1.style.color = 'red';  // js可以直接修改样式 - 修改的是行间式
    h1.style.borderRadius = '50%';  // css的 - 链接语法对应 js的 小驼峰命名法

    h1.innerText = '修改过后的内容';
    h1.innerHTML = '<i>修改过后的内容</i>';

    h1.setAttribute('owen', 'oooooooooooooooo');

    let img = document.querySelector('img');

    if (Math.random() > 0.5) {
        img.setAttribute('src', 'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=255676174,1347478056&fm=26&gp=0.jpg')
    } else {
        img.setAttribute('src', 'https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=3706411226,1037337437&fm=26&gp=0.jpg')
    }

事件

<body>
<h1 id="hhh" style="font-size: 30px" owen="Owen">
    <i>js页面交互</i>
</h1>
<h2 class="hh2">副标题1</h2>
<h2 class="hh2">副标题2</h2>

<img src="" alt="">

<input type="text" value="12345">


</body>

<script>
    // 鼠标事件
    let h1 = document.querySelector('h1');
    // onclick、ondblclick、onmouseover、onmouseleave、onmousemove、onmousedown、onmouseup
    h1.onclick = function (ev) {
        console.log(ev);  // 包含着鼠标的相关信息
        // 鼠标点击点
        console.log(ev.clientX, ev.clientY);
        // 特殊按键
        console.log(ev.altKey, ev.ctrlKey, ev.shiftKey);
    };

    h2 = document.querySelector('h2');
    h2.onmouseover = function () {
        h1.innerText = 'h2被悬浮了';
        h1.style.color = 'green';
    };
    h2.onmouseleave = function () {
        h1.innerText = 'h2被放开了';
        h1.style.color = 'red';
    };
    let count = 1;
    h2.onmousemove = function () {
        ++count;
        h1.innerText = '鼠标在h2身上游走' + count + '';
        this.innerText = '鼠标在h2身上游走' + count + '';
    };
    // 为某个标签绑定事件,去控制页面中任何一个标签(绑定事件中的this就代表自身)

    // 键盘事件
    // 只要在窗口下,点击鼠标就可以触发
    // onkeydown、onkeyup、onkeypress
    /*
    document.onkeydown = function (ev) {
        console.log(ev.keyCode);
        if (ev.keyCode == 37) {
            console.log('你按了左键');
        } else  if (ev.keyCode == 38) {
            console.log('你按了上键');
        }
        console.log(ev.altKey);
        if (ev.ctrlKey && ev.keyCode == 13) {
            console.log('留言');
        }
    }
    */
    // let inp = document.querySelector('input');
    // inp.onkeydown = function (ev) {
    //     console.log(ev.keyCode)
    // }


    // 表单事件
    let inp = document.querySelector('input');
    let h22 = document.querySelector('h2:nth-of-type(2)');
    // onchange当input失去焦点才会触发  oninput 内容改变时触发
    inp.oninput = function () {
        h22.innerText = this.value;
    };

    
原文地址:https://www.cnblogs.com/wyf20190411-/p/11134284.html