9.4周末总结

9.4周末总结

筛选器方法

下个元素:
$('#id').next()  # 查找当前元素的下一个同级元素
$('#id').nextAll()  # 查找当前元素的下面的所有同级元素
$('#id').nextUnitl('#id2')  # 查找当前元素下面的同级元素直到id2为止

上个元素:
$('#id').prev()  # 查找当前元素的上一个同级元素
$('#id').prevAll()  # 查找当前元素的上面的所有同级元素
$('#id').prevUnitl('#id2')  # 查找当前元素上面的同级元素直到id2为止

父亲元素:
$('#id').parent()  # 查找当前元素的一个父亲元素
$('#id').parents()  # 查找当前元素的所有父辈元素
$('#id').parentsUntil('#id2')  # 查找当前元素的所有的父辈元素直到匹配到id2为止

儿子和兄弟元素:
$('#id').children()  # 儿子们
$('#id').siblings()  # 兄弟们,同级别上下所有的元素

链式操作:
底层原理:对象调用方法之后还会返回一个对象,从而实现链式操作的效果,链式操作实现一行代码可以操作所有的标签。
let $pEle = $('#d1')
$pEle.parent()
$pEle.parent().parent()
$pEle.parent().css('color','red').parent().css('border','2px bolid green')

查找:搜索所有与指定表达式匹配的元素
$('div').find('p') 等价于 $('div p')

筛选:筛选出与指定表达式匹配的元素集合。
$('div').filter('.c1') 等价于 $('div.c1')

操作标签

1.样式操作:
jQuery样式操作:
addClass()  # 添加指定的类名
removeClass()  # 移除指定的类名
hasClass()  # 判断样式存不存在
toggleClass()  # 切换css类名,如果有就移除没有就添加
js样式操作:
classList.add()
classList.remove()
classList.contains()
classList.toggle()

2.css操作:
jQuery操作:
jQuery对象.css('属性名','属性值')
js操作:
style.样式名 = '样式值'

3.位置操作
offset()  # 获取匹配元素在当前窗口的相对偏移或设置元素位置
position()  # 获取匹配元素相对父元素的偏移
scrollTop()  # 获取匹配元素相对滚动条顶部的偏移
scrollLeft()  # 获取匹配元素相对滚动条左侧的偏移
.offset()方法允许我们检索一个元素相对于文档(document)的当前位置。和 .position()的差别在于: .position()是相对于相对于父级元素的位移。

4.文本操作
HTML代码:
html()  # 取得第一个匹配元素的html内容
html(val)  # 设置所有匹配元素的html内容

文本值:
jQuery操作:
text()  # 取得所有匹配元素的内容
text(val)  # 设置所有匹配元素的内容
js操作:
innerText()
innerHTML()
值:
jQuery操作:val()  # 取得第一个匹配元素的当前值
val(val)  # 设置所有匹配元素的值
val([val1, val2])  # 设置多选的checkbox、多选select的值
设置值:
$("[name='hobby']").val(['basketball', 'football']);
$("#s1").val(["1", "2"])
js操作:value()

5.属性操作
用于ID等或自定义属性
attr(attrName)  # 返回第一个匹配元素的属性值
attr(attrName, attrValue)  # 为所有匹配元素设置一个属性值
attr({k1: v1, k2:v2})  # 为所有匹配元素设置多个属性值
removeAttr()  # 从每一个匹配的元素中删除一个属性

6.prop和attr区别
'''attr针对动态变化的属性没有办法判断,永远只能判断页面已经写死的代码,若想判断动态变化的属性需要使用prop,主要用于checkbox、radio和option'''
总结:对于标签上有的能看到的属性和自定义的属性都用attr;对于返回布尔值的比如checkbox、radio和option是否被选中都用prop。

7.文档处理
添加到指定元素的内部的后面:
$(a).append(b)  # 把b追加到a
$(a).appendTo(b)  # 把a追加到b
添加到指定元素的内部的前面:
$(A).prepend(B)  # 把B前置到A
$(A).prependTo(B)  # 把A前置到B
添加到指定元素的外部的后面:
$(A).after(B)  # 把B放到A的后面
$(A).insertAfter(B)  # 把A放到B的后面
添加到指定元素外部的前面:
$(A).before(B)  # 把B放到A的前面
$(A).insertBefore(B)  # 把A放到B的前面
移除和清空元素:
remove()  # 从DOM中删除所有的匹配的元素。整个标签都没有了
empty()  # 删除匹配的元素集合中所有的子节点。只有内容没有了,标签还有

jQuery绑定事件

方式一:
jQuery对象.事件名(function(){
    事件代码
})

方式二:
jQuery对象.on('事件名',function(){
    事件代码
})

补充:
鼠标事件
  click() :单击事件、触发或将函数绑定到指定元素的click事件
  mouseover(): 触发或将函数绑定到指定元素的mouseover事件
  mouseout() :触发或将函数绑定到指定元素的mouseout的事件
键盘事件:
  keydown(): 按下按键时、触发或将函数绑定到指定元素的keydown事件
  keyup(): 释放按键时、触发或将函数绑定到指定元素的keyup事件
  keypress(): 产生可打印的字符时、触发或将函数绑定到指定元素的keypress事件
表单事件:
  focus() : 获得焦点、触发或将函数绑定到指定元素的focus事件
  blur() : 失去焦点、触发或将函数绑定到指定元素的blur事件

克隆事件、hover事件、input监听事件

1.克隆事件
$(选择器).clone();
1)clone():克隆默认情况下只会克隆标签的样式,不会克隆标签的事件。
2)clone(true):克隆对方的所有功能

2.hover事件
鼠标放上或者移走都可以设置事件
  $('p').hover(function (){
      alert('来了老弟')
  },
    function (){
        alert('慢走哦~')
    }
  )

3.input监听事件
实时监听,每输入输一个字都会校验。能够检测textarea,input:text,input:password和input:search这几个元素的内容变化,在内容修改后立即被触发,不像onchange事件需要失去焦点才触发。

阻止后续事件、事件冒泡、事件委托

1.阻止后续事件
能够触发form表单提交数据的动作的标签有两个:
<input type="submit">
<button></button>
给已经有的事件的标签绑定事件,会先执行绑定的事件,然后再执行已有的事件。可以让标签之间绑定的事件不在执行。
方式一:return false 
方式二:e.preventDefault()

2.事件冒泡
涉及到标签嵌套并且有相同事件的时候,那么会逐级往上反馈并执行。
当标签嵌套时给标签绑定事件后,会逐层往上执行,若自己的事件执行完后上层有点击事件也会执行依次向上。
若不想发生事件冒泡:
方式一:return false
方式二:e.stopPropagation()

3.事件委托
事件绑定的默认情况下是不会对动态创建的标签生效,如果想要生效那么需要事件委托。
<div>
  <button>点点1</button>
  <button>点点2</button>
</div>

$('div').on('click','button',function () {
            alert('你犯困的样子萌萌哒')
        })
'''委托指的是标签内部的标签'''

Bootstrap框架

1)官网下载,本地导入

2)使用CDN加速服务:
https://www.bootcdn.cn/
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.0.0/jquery.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.js"></script>

web框架

1.本质
基于互联网的web服务端的socket服务端,连接客户端和数据库。

2.纯手撸web框架
1)socket服务端代码
2)HTTP协议
3)根据网址后缀的不同请求不同的的内容
4)请求方式
    GET:朝服务端索要数据
    POST:朝服务端提交数据
5)从请求数据格式中筛选出用户输入的网址后缀
	target_url = data.decode('utf8').split(' ')[1]
6)代码缺陷
    socket代码重复编写
    针对请求数据格式的处理复杂且重复
    针对不同网址后缀的匹配方式过于低下

import socket
server = socket.socket()  # TCP协议
server.bind(('127.0.0.1', 8080))  # IP协议 PORT协议
server.listen(5)  # 连接池
while True:
    sock, address = server.accept()
    data = sock.recv(1024)
    sock.send(b'HTTP/1.1 200 OK\r\n\r\n')
    # print(data.decode('utf8'))  # 从字符串中截取出需要的内容
    target_url = data.decode('utf8').split(' ')[1]  # / /index /login /reg /xxx
    if target_url == '/index':
        sock.send(b'index view')
    elif target_url == '/login':
        sock.send(b'login view')
    elif target_url == '/reg':
        sock.send(b'reg view')
    else:
        sock.send(b'404 error')
        
3.基于wsgiref模块撸
wsgiref内部封装了socket代码和对请求数据的处理
from wsgiref.simple_server import make_server
def run(request, response):
    """
    :param request: 请求数据
    :param response: 响应数据
    :return: 返回给客户端的数据
    """
    print(request)  # 自动将请求数据全部处理成字典k:v键值对形式
    response('200 OK', [])  # 固定代码 无需掌握
    return [b'hello big baby']

if __name__ == '__main__':
    server = make_server('127.0.0.1', 8080, run)  # 任何访问127.0.0.1:8080的请求都会给第三个参数加括号调用
    server.serve_forever()  # 永久启动
1)wsgiref模块解决了两个问题
	1.socket代码重复编写造轮子
	2.针对请求数据格式的处理复杂且重复
2)思考如何再次实现根据不同的网址后缀返回不同的内容(函数化)
	先从大字典中查找出记录网址后缀的键值对
	不推荐使用连续的多个if判断
	针对面条版的代码首先应该考虑封装成函数
 		def index(request):
            return 'index'
        def login(request):
            return 'login'
        def register(request):
            return 'register'
        def error(request):
            return '404 error'
        urls = (
            ('/index', index),
            ('/login', login),
            ('/register', register),
         )	
3)根据py文件中功能的不同划分到不同的py文件(模块化)
	urls.py	 		 对应关系
 	views.py 		 功能函数
  	start.py 		 启动文件
 	templates文件夹  存储html

动静态网页

动态网页
	页面上的数据不是全部写死的 有些是动态获取(后端传入)
静态网页
	页面上的数据直接写死的 要想改变只能修改源码
 
实际需求
	后端代码回去当前时间 然后让前端页面展示
	1.字符串替换
 	2.将字典数据传递给html页面并且想要在页面上操作字典数据
我们无法自己实现>>>:在html页面上使用类似于后端的语法操作数据

jinja2模块

jinja2能够让我们在html文件内使用类似于后端的语法来操作各种数据类型
pip3 install jinja2

from jinja2 import Template
def get_dict(request):
    user_dict = {'name': 'jason', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
    with open(r'templates/myhtml04.html','r',encoding='utf8') as f:
    data = f.read()
    temp = Template(data)
    res = temp.render(data=user_dict)  # 将字典传递给html页面 页面上通过data即可获取(data仅仅是一个变量名)
    return res

将来写前后端非常方便,通过模板语法形式可以控制页面的展示
<h1>{{ data }}</h1>
<h1>{{ data['name'] }}</h1>
<h1>{{ data.get('pwd') }}</h1>
<h1>{{ data.hobby }}</h1> 

{% for user in user_data %}
    <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        <td>{{ user.age }}</td>
    </tr>
{% endfor %}

python主流框架

django框架
	大而全 自身携带的功能非常的多 类似于航空母舰
		缺陷:开发小项目的时候使用该框架有点笨重(大材小用)
    
flask框架
	小而精 自身携带的功能非常的少 类似于特种兵 主要依赖于第三方模块
    	缺陷:受限于第三方模块的开发
   
tornado框架
	异步非阻塞 该框架快到可以作为游戏服务器
    	缺陷:上手难度是三者最高的

fastapi框架、sanic框架、...

Django框架

下载:pip install --index-url http://mirrors.aliyun.com/pypi/simple/ django==2.2.22
        --trusted-host mirrors.aliyun.com
        
1.版本问题
	1.X:同步		1.11
 	2.X:同步		2.2   
  	3.X:异步		3.2
ps:你无论使用什么版本都可以 区别不大 2.2
    
2.启动注意事项
	1)计算机名称尽量不要有中文
 	2)项目中所有的py文件名尽量不要用中文
 	3)不同版本的python解释器配合不同版本的django 会有一些报错
    	仔细查找一下报错信息 里面会提示你是哪个py文件里面的代码出错
       找到那一行代码 把逗号删除即可
    		widgets.py  152  
  	4)一个pycharm窗口只允许有一个项目 不要做项目的嵌套

3.验证django是否下载成功
	cmd终端输入django-admin
    
4.命令操作
创建Django项目:django-admin startproject 项目名
启动django项目:先切换到项目目录下,执行启动目录:python36 manage.py runserver ip:port
访问Django服务器:浏览器直接访问
创建APP应用:python38 manage.py startapp 应用名

5.pycharm操作
1)新建一个项目选择Django
2)选择好下载好的Djangopython版本的解释器
3)更改项目名
4)填写APP应用名称
'''在启动Django项目的时候一定要确保一个端口只有一个项目,否则启动的是第一个项目的窗口,后面的启动修改页面没有效果'''

6.命令行与pycharm操作的区别
1)命令行不会自动创建templates文件夹
2)命令行不会在配置文件编写关于templates文件夹的配置
	'DIRS': [os.path.join(BASE_DIR, 'templates')]    
3)pycharm自动创建的第一个应用会自动注册到配置文件中
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
4)针对db.sqlite3文件不用去在乎它有没有创建 只要运行了django会自动出来


7.目录结构
-mysite文件夹名称

    --mysite同名文件夹

        ----__init__.py			少用,主要做一些冷门配置

        ----settings.py			项目配置文件

        ----urls.py			总路由层,对应关系(目前简单的理解:网址后缀跟函数名)

    --manage.py				项目入口文件

-templates文件夹				存储项目所需的html文件

    --db.sqlite3			运行项目后自动创建(django自带的小型数据库)

    --应用文件夹:通过命令创建(可以创建任意个数)

        ----migrations文件夹		存储数据迁移记录

        ----__init__.py			很少用,主要做一些冷门配置

        ----admin.py			django提供的后台管理

        ----apps.py			用于配置文件的应用注册(创建的应用都需要去配置文件中注册)

        ----models.py			模型层(与数据库相关),存储与数据库表相关的类

        ----views.py			视图层(编写当前应用核心业务逻辑代码),存储业务相关的逻辑代码(函数、类)

        ----tests.py			自带的测试文件
        
核心文件:
urls.py		路由层
views.py	视图层
templates	模板层
models.py   模型层

8.小白必会三板斧
HttpResponse
	主要用于直接返回字符串类型的数据
render
	主要用于返回html页面 并且支持模板语法
redirect
	主要用于页面重定向
posted @ 2022-09-04 15:29  努力努力再努力~W  阅读(23)  评论(0)    收藏  举报