2023年3月

1.4. jQuery的版本

官网下载地址:
http://jquery.com/download/
jQuery版本有很多,分为1.x 2.x 3.x

大版本分类:

1.x版本:能够兼容IE678浏览器
2.x版本:不兼容IE678浏览器
1.x和2.x版本jquery都不再更新版本了,现在只更新3.x版本。

3.x版本:不兼容IE678,更加的精简(在国内不流行,因为国内使用jQuery的主要目的就是兼容IE678)

关于压缩版和未压缩版

jquery-1.12.4.min.js:压缩版本,适用于生产环境,因为文件比较小,去除了注释、换行、空格等东西,但是基本没有颗阅读性。
jquery-1.12.4.js:未压缩版本,适用于学习与开发环境,源码清晰,易阅读。

1.5. jQuery的入口函数

使用jQuery的三个步骤:

1. 引入jQuery文件
2. 入口函数
3. 功能实现

关于jQuery的入口函数:

//第一种写法
$(document).ready(function() {

});
//第二种写法
$(function() {

});

jQuery入口函数与js入口函数的对比

1.    JavaScript的入口函数要等到页面中所有资源(包括图片、文件)加载完成才开始执行。
2.    jQuery的入口函数只会等待文档树加载完成就开始执行,并不会等待图片、文件的加载。

1.6. jQuery对象与DOM对象的区别(重点)

1. DOM对象:使用JavaScript中的方法获取页面中的元素返回的对象就是dom对象。
2. jQuery对象:jquery对象就是使用jquery的方法获取页面中的元素返回的对象就是jQuery对象。
3. jQuery对象其实就是DOM对象的包装集(包装了DOM对象的集合(伪数组))
4. DOM对象与jQuery对象的方法不能混用。

DOM对象转换成jQuery对象:【联想记忆:
花钱

var $obj = $(domObj);
// $(document).ready(function(){});就是典型的DOM对象转jQuery对象

jQuery对象转换成DOM对象:

var $li = $(“li”);
//第一种方法(推荐使用) 下标
$li[0]
//第二种方法 get方法
$li.get(0) 

【练习:隔行变色案例.html】

《jQuery精品教程视频\jQuery精品教程资料\19-jQuery第一天\04-代码\05-DOM对象(js对象)与jq对象.html》

<script>$(function() {//1. 什么是DOM对象(js对象):使用js的方式获取到的元素就是js对象(DOM对象)
    //var cloth = document.getElementById("cloth");
    //cloth.style.backgroundColor = "pink";
    
    //2. 什么是jq对象:使用jq的方式获取到的元素就是jq对象
    //var $li = $("li");
    //console.log($li);
    //$li.text("我改了内容");

//3. jq对象与js对象的区别 //js对象对象不能调用jq对象的方法 //var cloth = document.getElementById("cloth"); //cloth.text("呵呵"); //4. jq对象与js对象的联系(jq对象其实就是js对象的一个集合,伪数组,里面存放了一大堆的js对象)(宏观上) //jquery对象能不能调用DOM对象的方法 //var $li = $("li"); //$li[0].setAttribute("name","hehe"); //DOM无法调用jQuery对象的方法:为什么:因为是两个不同对象 //DOM对象调用jQuery对象的方法。需要把DOM对象转换成jQuery对象。 var cloth = document.getElementById("cloth");//DOM对象就变成jQuery对象 //$(cloth).text("呵呵"); //jQuery对象怎么转换成DOM对象(取出来) var $li = $("li");
$li[
1].style.backgroundColor = "red";
$li.get(
2).style.backgroundColor = "yellow";//1. 什么是DOM对象:用js的方式获取到的对象时DOM对象 //2. jQuery对象:用jq的方式获取到的对象时jq对象 //3. 区别与联系 //4. 区别:js对象与jq对象的方法不能混着用 //5. 联系: //DOM--> jQuery $() //jQuery--》 DOM $li[0] $li.get(0) });

第一天

//jquery:简单、粗暴

//jq和js的关系
//js是什么? js是一门编程语言
//jq仅仅是基于js的一个库,jq可理解为就是开发js的一个工具。

//概念
//1. 为什么要学jquery ? 简单,粗暴 没有兼容性问题
//2. 什么是jquery?js库,说白了就是js文件,里面有一大堆的方法
//3. 使用jquery的步骤: 1. 引入jquery文件 2. 入口函数 功能实现
//4. 版本:1.x 2.x 3.x 1.x 压缩版和未压缩版
//5. 入口函数: $(document).ready(function) $(function()
{})
//6. jQuery对象与DOM对象
//区别:方法不能混用
//联系: DOM-->jq 花钱 jq-->dom [0] get(0)

//$的实质:function

// console.log($ === jQuery); 输出true
// $(function ()
{ //}); 入口函数  也可以写成: jquery(fuction(){})

//选择器

//基本选择器 标签 类 id选择器 交集 并集
//层级选择器: 子代 后代

//过滤选择器:
//:odd:奇数 even:偶数 :eq:指定下标
//:first :last :gt :lt

//筛选选择器
//children():找儿子
//find():找后代
//parent():找爹
//siblings():找兄弟,不包括自己
//next:下一个兄弟
//prev:上一次兄弟
//eq:指定下标

//index():返回的当前元素在所有兄弟里面的索引。

第二天

<script>

//1. 操作样式 (5)
//1.1 css操作
//设置单个样式
//设置多个样式
//获取样式
//1.2 class操作
//addClass(name):添加类
//removeClass(name):移除类
//hasClass(name):判断类
//toggleClass(name):切换

//2. 操作属性(3)
//2.1 attr
//设置单个属性
//设置多个属性
//获取属性
//2.2 prop
//对于布尔类型的属性,disabled,selected,checked,只能用prop

//2.3 removeAttr(name):移除某个属性

//3. 动画 (10)
//3.1 三组基本动画
//show/hide slideDown/slideUp/slideToggle fadeIn/fadeOut/fadeToggle
//3.2 自定义动画
//animate(prop, [speed], [swing/linear], [callback])
//3.3 停止动画
//stop


//4. 操作节点(10)
//4.1 创建节点: $("<span></span>")
//4.2 添加节点 append appendTo prepend prependTo after before
//4.3 清空内容 empty
//4.4 删除节点 remove
//4.5 克隆节点 clone

$("div").removeAttr("title");

</script>
//对于布尔类型的属性,不要attr方法,应该用prop方法 prop用法跟attr方法一样。
$(function ()
{$("input").eq(0).click(function () { //第一个input标签的 赋予点击事件
$("#ck").prop("checked", true);// 给id为 ck的 <input type="checkbox" id="ck"> 打钩
});

width/height 写到style里 就是样式,直接写到标签里面就变成了属性了;比如我们有些标签是有这两个属性的 img,img中的width 可以用attr获取

//1. 样式操作(写到style)  width/height
//css(name, value) :设置单个样式
//css(obj):设置多个样式
//css(name):获取样式

//addClass(name):添加类
//removeClass(name):移除类
//hasClass(name):判断类
//toggleClass(name):切换类

//2. 属性操作(能写到标签里面的叫属性) width/height
//attr方法,用法与css一样
//prop方法:操作布尔类型的属性,disabled checked selected
//removeAttr:移除属性

//3. 动画
//show/hide slideDown/slideUp/slideToggle fadeIn/fadeOut/fadeToggle
//animate(prop, [speed], [swing/linear], [callback])
//stop()

//4. 节点操作
//创建节点 $()
//添加节点: append appendTo prepend prependTo before after
//删除节点: remove 自杀
//清空节点:empty
//克隆节点:clone()

第三天

<script>

//1. 特殊的属性操作
// val()
// text() 与 html()
// width height
//scrollTop scrollLeft
//offset position


//2. 事件
//注册事件 on
// on("click", function()
{})
// on("click", "p", function()
{})

// off() off("click")

//click() trigger("click")

// e.stopPropagation()
// e.preventDefault()
// return false;

//3. 补充

//链式编程:end()
//each
//$.noConflict();

</script>

//jQuery释放$的控制权
$.noConflict();
jQuery(function () {
});

补充:

js == 与 === 的区别[转]

1、
基础类型:
对于string,number等,==和===是有区别的

1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等
2)同类型比较,直接进行“值”比较,两者结果一样
2、
高级类型:
对于Array,Object等,==和===是没有区别的
进行“指针地址”比较
3、基础类型与高级类型比较,==和===是有区别的
1)对于==,将高级转化为基础类型,进行“值”比较
2)因为类型不同,===结果为false

1、逐行分析jQuery源码的奥秘 - 网易云课堂  http://study.163.com/course/courseMain.htm?courseId=465001#/courseDetail?tab=1   此课程免费,网易邮箱登录即可看

妙味课堂:一起学习jQuery源码【逐行分析jQuery源码的奥秘】 - 妙味视频教程 - 妙味茶馆 - Powered by Discuz!  http://bbs.miaov.com/forum.php?mod=viewthread&tid=7385

2、jQuery源码解析(架构与依赖模块)-慕课网  http://www.imooc.com/learn/172  不是视频,更多的是描述 和js代码

作者播客 : jQuery源码分析系列 - 【艾伦】 - 博客园  http://www.cnblogs.com/aaronjs/p/3279314.html

============================jquery 2.0.3版本 分析课程 可以到下面链接下载2.0.3源码

妙味课堂-jQuery源码分析视频 http://jquery.miaov.com/

+++++++++++++++++++++++++++++++++++++++++++++++

==自调用函数

(function () {
var x = "Hello!!";      // 我将调用自己
})();

匿名函数自执行:(function(){ var a=10; } )(); 局部变量 在外面找不到 ,需要提供对外接口,如下截图: window.$ = $;

==== 整个框架

整个大的是一个匿名函数自执行,最后传一个window到闭包中来,

其实不传也可以,但是为了查找更快

$()实例方法
(更上一层的,实际也是调用更底层的静态方法)和
$静态方法
(可以看做底层的方法,也叫工具方法);$就是个符合,函数,在函数下面拓展方法 叫做拓展工具,静态方法不仅仅可以jq使用还可以给 js使用

==

undefined IE 7以上是可以被修改的

"use strict"; 严格模式,

===


==JQuery的创建

============下面涉及一个原型 prototype,需要先理解这个概念,下方有说明

传统类的创建和调用方法,和jquery对比: 减少了New创建和 init初始化 直接可以调用到css()方法。

传统

Jquery

283行 有 jQuery.fn.init.prototype = jQuery.fn; 而96行有 jQuery.fn = jQuery.prototype 所以上方截图可以写成:

jQuery.prototype.init.prototype=jQuery.prototype;
意思: jQuery对象的原型 给了jQuery.prototype.init()初始化出来的对象的原型,

jQuery.prototype下添加的任何方法,都可以被jQuery()初始化出来的对象调用。这就是为什么 jQuery()可以直接调用.css()的原因。

==== 原型Prototype 的理解

http://www.runoob.com/jsref/jsref-prototype-string.html

jQuery1.3.2 源码学习-5 jQuery 中的原型 - 冠军 - 博客园  http://www.cnblogs.com/haogj/archive/2010/04/20/1716178.html

下面两句话说得很明白了。

prototype 属性允许您向对象添加属性和方法
注意: Prototype 是全局属性,适用于所有的Javascript对象。

个人理解:如果再理解不了,可以理解为Prototype是所以js的祖先类,给祖先类添加拓展公共方法,子类可以直接调用到。

==init()初始化和参数管理 ;jquery可以接受的参数有哪些?

包含对下面几个的判断:空,undefined ,false,字符串,对象,函数,数组

==jq和js原生写法


------parseHTML 可以将 script添加到HTML中

jQuery.parseHTML() 把字符串转换成一个节点数组; $.each 和$().each() 的区别?

JQuery中$.each 和$(selector).each()的区别详解 - 郝高胜 - 博客园  http://www.cnblogs.com/qq313462961/p/6666666446.html

===jQuery.merge() 我们平时一般用的时候是 合并数据的,但是也可以将 json对象和数组合并,如下:


====jq源码中133行处做的功能

                    //HANDLE: $(html, props) 源码 133行处
                    if ( rsingleTag.test( match[1] ) &&jQuery.isPlainObject( context ) ) {for ( match incontext ) {//Properties of context are called as methods if possible
                            if ( jQuery.isFunction( this[ match ] ) ) {this[ match ]( context[ match ] );//...and otherwise set as attributes
                            } else{this.attr( match, context[ match ] );
}
}
}

=== extend 扩展工具,扩展实例方法,深拷贝浅拷贝

$.extend();
$.fn.extend();
//当只写一个对象自变量的时候,JQ扩展插件的形式 $.extend(//扩展工具方法 {aaa:function(){alert(1);},
bbb:
function(){alert(2);}});
$.fn.extend(
//扩展JQ实例方法 {aaa:function(){alert(3);},
bbb:
function(){alert(4);}})

$.aaa();//1
$.bbb();
$().aaa();
//3实例方法要创建JQ对象来调用 $().bbb(); //4

$.extend();
-->this->$ ->this.aaa -->$.aaa();
$.fn.extend();
--> this->$.fn ->this.aaa -->$().aaa();//当写多个对象自变量的时候,后面的对象都是扩展到第一个对象上 var a={};
$.extend(a,{name:
'hello'},{'age',30});
console.log(a);
//a就拥有后 name和 age的属性 //还可以做 深拷贝和 浅拷贝 var a={};var b = {name:'hello'};
$.extend(a,b);
a.name
='hi';
alert(b.name);
//还是会输出 hello ;没有受到影响 var a={};var b = {name:{age:30}};//也可以数组
$.extend(a,b);//浅拷贝
a.name.age
=20;
alert(b.name);
//输出20 ,受到影响了,因为默认是浅拷贝(会受到影响) $.extend(true,a,b);//深拷贝:拷贝时前面加上 true,b无论多少层都可以拷贝,

==extend中防止循环引用

if ( target === copy ) { //防止循环引用 320行
continue;
}
//如果没有上方的continue跳出的话,下面会:不断循环添加
var a={};
console.log($.extend(a,{name:a}));

==拷贝继承

var a={name:{job:'it'}};
var b={name:{age:30}};
$.extend(true,a,b); //a将b中的内容继承过来,保留原来的。
console.log(a); 会两个的叠加

JQ中:拷贝继承:如果a是{}就是原型,如果a是构造函数原型就是类式继承
JS: 类式继承/ 原型继承

new 构造函数 / {}

==防止冲突,释放$ 或 jQuery符号

noConflict: function( deep ) {//防止冲突,释放$ 或 jQuery符号

==DOMContentLoaded DOM触发  $(function(){});函数分析

==16课时 等待DOM加载完触发的3种写法

$(function(){});
$(document).ready(
function(){});//简写$().ready();? $(document).on('ready',function(){alert(123)});

==看到19课时,后面挑着看
502行 ES5中的函数

parseJSON: JSON.parse,只能解析严格模式的json
eval可以解释任何类型的字符串,安全性和性能都差点

JSON.stringify() json解析为字符串。

==29课

var cb = $.Callbacks(); //观察者模式
cb.add(函数1);
cb.add(函数2);
cb.fire();

==39课 support 功能检测
https://modernizr.com/ 检测css3 和html5功能的库
Modernizr,HTML5/CSS3 特性检测库,帮助你构建下一代 HTML5/CSS3 驱动的网站
$(function(){
for(var attr in $.support){
$('body').append('<div>'+attr+':'+$.support[attr]+'</div>');
}
})

\day01_shiro\0323\10realm支持散列.avi;
\day01_shiro\0323\1权限管理原理.avi;
\day01_shiro\0323\2权限管理解决方案.avi;
\day01_shiro\0323\3基于url拦截-开发框架搭建.avi;
\day01_shiro\0323\4基于url拦截-用户认证实现.avi;
\day01_shiro\0323\5基于url拦截-用户授权实现.avi;
\day01_shiro\0323\6shiro的介绍.avi;
\day01_shiro\0323\7shiro认证入门程序.avi;
\day01_shiro\0323\8shiro认证流程.avi;
\day01_shiro\0323\9自定义realm实现认证.avi;
\day01_shiro\0323\源代码\permission6666660\WebRoot\images\px;
\day01_shiro\案例\permission(基于url授权工程)\WebRoot\images\px;
\day02_shiro第二天\0325\10shiro整合开发-验证码实现.avi;
\day02_shiro第二天\0325\11shiro整合开发-记住我.avi;
\day02_shiro第二天\0325\1shiro授权入门程序.avi;
\day02_shiro第二天\0325\2自定义realm进行授权.avi;
\day02_shiro第二天\0325\3shiro整合开发-applicationContext-shiro.avi;
\day02_shiro第二天\0325\4shiro整合开发-登陆和退出.avi;
\day02_shiro第二天\0325\5shiro整合开发-realm查询完整认证在页面展示.avi;
\day02_shiro第二天\0325\6shiro整合开发-realm授权.avi;
\day02_shiro第二天\0325\7shiro整合开发-认证连接数据库.avi;
\day02_shiro第二天\0325\8shiro整合开发-授权连接数据库.avi;
\day02_shiro第二天\0325\9shiro整合开发-缓存.avi;
\day02_shiro第二天\0325\源代码\permission6666660\WebRoot\images\px;
\day02_shiro第二天\0325\源代码\permission_shiro6666660\WebRoot\images\px;

《shiro\day01_shiro\0323\1权限管理原理.avi》

视频中39分 时 提到权限和资源是多对一,不是很理解。

====================

1.1
什么是权限管理

基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照
安全规则或者
安全策略
控制
用户可以访问而且只能访问自己被授权的
资源

权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。

1.2
用户身份认证

1.2.1
概念

身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。
对于采用
指纹
等系统,则出示指纹;对于硬件
Key
等刷卡系统,则需要刷卡。

1.2.2
用户名密码身份认证流程

1.2.3
关键对象

上边的流程图中需要理解以下关键对象:

n
Subject
:主体

访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;

n
Principal
:身份信息

是主体(
subject
)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(
Primary
Principal
)。

n
credential
:凭证信息

是只有主体自己知道的安全信息,如密码、证书等。

1.3
授权

1.3.1
概念

授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

1.3.2
授权流程

下图中橙色为授权流程。

1.3.3
关键对象

授权可简单理解为
who对what(which)进行How操作:

n Who,即主体

Subject),主体需要访问系统中的资源。

n What,即资源(Resource),如系统菜单、页面、按钮、类方法
、系统商品信息等。资源包括资源类型和资源实例,比如商品信息为资源类型,

类型为
t01的
商品
为资源实例,编号为
001的商品信息也属于资源实例。

n How,权限/许可(Permission),规定了主体对资源的操作
许可
,权限离开资源没有意义,如用户查询权限、用户添加权限、某个类方法

的调用权限、编号为
001用户的修改权限等,通过权限可知主体对哪些资源都有哪些操作许可。

权限分为粗颗粒和细颗粒,粗颗粒权限是指对资源类型的权限,细颗粒权限是对资源实例的权限。

主体、资源、权限关系如下图:

1
权限管理解决方案

1.1
粗颗粒度和细颗粒度

1.1.1
什么是粗颗粒度和细颗粒度


资源类型
的管理称为
粗颗粒度
权限管理,即只控制到菜单、按钮、方法,粗粒度的例子比如:用户具有用户管理的权限,具有导出订单明细的权限。


资源实例
的控制称为
细颗粒度
权限管理,即控制到数据级别的权限,比如:用户只允许修改本部门的员工信息,用户只允许导出自己创建的订单明细。

1.1.2
如何实现粗颗粒度和细颗粒度

对于粗颗粒度
的权限管理可以很
容易做系统架构级别的功能
,即系统功能操作使用统一的粗颗粒度的权限管理。

对于细颗粒度
的权限管理不建议做成系统架构级别的功能,
因为
对数据级别的控制是系统的业务需求,随着业务需求的变更业务功能变化的可能性很大,

建议
对数据级别的权限控制在业务层个性化开发
,比如:用户只允许修改自己创建的商品信息可以在

service
接口添加校验实现,

service
接口需要传入当前操作人的标识,与商品信息创建人标识对比,不一致则不允许修改商品信息。

建议细粒度权限管理在业务层去控制。

比如:部门经理只查询本部门员工信息,在
service
接口提供一个部门
id
的参数,
controller
中根据当前用户的信息得到该 用户属于哪个部门,

调用
service
时将部门
id
传入
service
,实现该用户只查询本部门的员工。

1.2
基于
url
拦截

基于
url
拦截是企业中常用的权限管理方法,实现思路是:将系统操作的每个
url
配置在权限表中,将权限对应到角色,将角色分配给用户,

用户访问系统功能通过
Filter
进行过虑,过虑器获取到用户访问的
url
,只要访问的
url
是用户分配角色中的
url
则放行继续访问。

如下图:

1.3
使用权限管理框架

对于权限管理基本上每个系统都有,使用权限管理框架完成权限管理功能的开发可以节省系统开发时间,并且权限管理框架提供了完善的认证

和授权功能有利于系统扩展维护,但是学习权限管理框架是需要成本的,所以选择一款简单高效的权限管理框架显得非常重要。

原因是:LoginController中用到,自动注入,要配置在 /permission6666660/config/spring/applicationContext-service.xml中配置bean

@Controller
public class LoginController {
@Autowired
private SysService sysService;

---

<!-- 认证和授权的service -->
<bean id="sysService" class="cn.itcast.ssm.service.impl.SysServiceImpl"></bean>