1.jq的预加载?与window.onload 区别?
2.jq与js对象的互相转换;
3.jq的链式调用什么意思?
4.jq的事件监听
5.jq的on 、live、delegat、bind 区别?
6.jq的ajax;
7.如何解决$符号的冲突?
8.jq需不需要做兼容?
9:学习新框架的方法;看api.再看...
;
1:$(function(){
})==window.onload=function(){
}
3.点点点。this的指向.没人调用就指向window.
fade in /out 不占位置;
1:jq的$(function(){})也就是$(document).ready(function(){})的简写,与之对应的原生js的window.onload事件,这俩者之间到底有什么区别呢?
$(function () {
console.log("ready执行");
});
$(function() {
console.log("ready1执行");
});
window.onload = function () {
console.log('load执行');
};
window.onload = function () {
console.log('load1执行');
}
$(function () {
console.log("ready执行");
});
$(function() {
console.log("ready1执行");
});
window.onload = function () {
console.log('load执行');
};
window.onload = function () {
console.log('load1执行');
}
我们来看一下控制台中输出的结果:
这里写图片描述
这里可以看出两点不同:
1.$(function(){})不会被覆盖,而window.onload会被覆盖,个人感觉$(function(){})不会被覆盖的原因是将其放入到了一个队列中,在对应时机一次出队。
2. $(function(){})在window.onload执行前执行的,$(function(){})类似于原生js中的DOMContentLoaded事件,在DOM加载完毕后,页面全部内容(如图片等)完全加载完毕前被执行。而window.onload会在页面资源全部加载完毕后才会执行。
DOM文档加载步骤:
1.解析HTML结构
2.加载外部的脚本和样式文件
3.解析并执行脚本代码
4.执行$(function(){})内对应代码
5.加载图片等二进制资源
6.页面加载完毕,执行window.onload
(2):
1.JQuery 转 JS:
$().get(0)
$()[0]
2. JS 转 JQuery:
$(js对象)
相互转换,是为了调对方对象的属性或方法.
(3):
jquery中链式调用原理
1.链式调用
$("#mybtn").css("width","100px")
.css("height","100px")
.css("background","red");
2.在对属性进行操作时建议使用JSON形式控制样式
$("#mybtn").css({
width:200,
height:"200",
"background-color":"red"
})
3.事件中this的指向
//事件中this的指向
//JQuery中提示了一个方法,该方法可以将原生JS元素对象 转换成JQ对象
//语法结构:$(原生JS元素对象)
console.log($(this).html());
//css方法若传递一个参数可以获取属性名的属性值
//当使用JQ中的方法取值是一般都无法进行链式调用,
//原因是方法内部return的已经不是JQ实例本身了
var $result1 = $("div").css("width");
console.log($result1);
实现链式的基本条件就是要实例对象先创建好,调用自己的方法。
链式调用是通过return this的形式来实现的。通过对象上的方法最后加上return this,把对象再返回回来,对象就可以继续调用方法,实现链式操作了。
4.以下是链式调用原理::return this;
var MyJQ = function(){
}
MyJQ.prototype = {
css:function(){
console.log("设置css样式");
return this;
},
show:function(){
console.log("将元素显示");
return this;
},
hide:function(){
console.log("将元素隐藏");
}
};
var myjq = new MyJQ();
myjq.css().css().show().hide();
(4):
jquery中四种事件监听的区别
2017年08月06日 23:20:18
阅读数:14230
我们知道jquery提供了四种事件监听方式,分别是bind、live、delegate、on,下面就分别对这四种事件监听方式分析。
已知有4个列表元素:
列表元素1
列表元素2
列表元素3
列表元素4
1.bind
bind(type,[data],function(eventObject)) bind是使用频率较高的一种,作用就是在选择到的元素上绑定特定事件类型的监听函数,
参数函数如下:
type:事件类型,如click、change、mouseover等;
data:传入监听函数的参数,通过event.data取到;
function:监听函数,可传入event对象,这里的event是jquery封装的event对象。
源码:
bind: function( types, data, fn ) {
return this.on( types, null, data, fn );
}
可以看到内部是调用了on方法。
bind的特点就是会把监听器绑定到目标元素上,有一个邦一个,在页面上的元素不会动态添加的时候使用它没有什么问题。
但如果列表中动态增加一个“列表5”,点击它是没有反应的,必须再bind一次才行。
测试代码:
$(function(){
$('div').bind('click',function(){
if($(this).text()=='列表4'){
$(this).after('<div>列表5</div>');
}
alert($(this).text());
})
})
注意:jquery中append()和after()方法都可以添加元素,不同之处是append()是在要添加元素的末尾(在元素内)添加,而after()是在要添加的元素之后(在元素外)。
2.live
live(type, [data], fn)
live的参数和bind一样,它又有什么蹊跷呢,我们还是先瞄一眼源码:
live: function( types, data, fn ) {
jQuery( this.context ).on( types, this.selector, data, fn );
return this;
}
可以看到live方法并没有将监听器绑定到自己(this)身上,而是绑定到了this.context上了。
通过 live() 方法添加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素),
使用事件委托的优点一目了然,新添加的元素不必再绑定一次监听器。
将上面代码中的bind改为live后,点击列表5就可以弹出“列表5”了。
注意:live方法在在 jQuery 版本 1.7 中被废弃,在版本 1.9 中被移除,官方建议使用on代替。
测试代码:
$(function(){
$('div').live('click',function(){
if($(this).text()=='列表4'){
$(this).after('<div>列表5</div>');
}
alert($(this).text());
})
})
3.delegate
将监听事件绑定在就近的父级元素上,
源码: delegate: function( selector, types, data, fn ) {
return this.on( types, selector, data, fn );
}
delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,
并规定当这些事件发生时运行的函数。
这下,我们的选择又多了一些灵活性,不单可以利用事件委托,还可以选择委托的对象。
代码,实现效果,点击div,两个p标签的文字颜色都发生变化。
<div>
<p>div内的p标签</p>
</div>
<p>div外的p标签</p>
$(function(){
$('div').delegate('p','click',function(){
$('p').css('color','blue');
});
4、on
on(type,[selector],[data],fn)
参数与delegate差不多但还是有细微的差别,首先type与selector换位置了,其次selector变为了可选项。
on() 方法在被选元素及子元素上添加一个或多个事件处理程序。
自 jQuery 版本 1.7 起,on() 方法是 bind()、live() 和 delegate() 方法的新的替代品。
代码,实现效果同上,把delegate改为on,第一个参数为click,第二个参数p可写可不写,第三个参数同上。
$(function(){
$('div').on('click','p',function(){
$('p').css('color','red');
});
(5):
ajax() 方法通过 HTTP 请求加载远程数据。
该方法是 jQuery 底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该函数,除非你需要操作不常用的选项,以获得更多的灵活性。
最简单的情况下,$.ajax() 可以不带任何参数直接使用。
注意:所有的选项都可以通过 $.ajaxSetup() 函数来全局设置。
js的ajax与jq的ajax总结
原生ajax原理及应用
ajax基础
1.什么是服务器:网页浏览过程分析,浏览器服务器文件localhost/文件.txt,这种方式和用路径在浏览器上打开的方式是不同的,前者是在服务器上
2.ajax:Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术
通俗的来讲:
(1)没用AJAX的网页,你点一个按钮就要刷新一下页面,尽管新页面上只有一行字和当前页面不一样,但你还是要无聊地等待页面刷新
(2)用了AJAX之后,你点击,然后页面上的一行字就变化了,页面本身不用刷。
(3)AJAX的缺点:前进后退按钮被破坏,搜索引擎支持不够,开发调试工具缺乏
与传统的web应用比较
(1) 传统的web应用:
传统的Web应用交互由用户触发一个HTTP请求到服务器,服务器对其进行处理后再返回一个新的HTHL页到客户端,每当服务器处理客户端提交的请求时,客户都只能空闲等待,并且哪怕只是一次很小的交互、只需从服务器端得到很简单的一个数据,都要返回一个完整的HTML页,而用户每次都要浪费时间和带宽去重新读取整个页面。这个做法浪费了许多带宽,由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
(2)ajax:
AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的Web Service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了
Ajax相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。
同步过程
这里写图片描述
异步过程
这里写图片描述
同步:脚本会停留并等待服务器发送回复然后再继续
异步:脚本允许页面继续其进程并处理可能的回复
异步更新是后台和服务器进行少量数据交换,即不重新加载整个网页就可以对网页的某部分进行更新。而AJAX减少了用户的等待时间。展示给用户的还是同一个页面,用户感觉页面刷新,也看不到到JavaScript后台进行的发送请求和接受响应。
同步和异步之间相差一个XMLHttpRequest(XHR)的对象,来让后台与服务器之间交换数据,并同时对网页进行部分更新(即异步请求,局部刷新)
跨域:不同的域之间相互请求资源
ajax的跨域问题:
默认情况下,XHR对象只能访问与包含它的页面位于同一个域中的资源,这种安全策略可以预防某些恶意行为。
实现合理的跨域请求对开发某些浏览器应用程序至关重要。
主要有以下几种方法:
a.CORS,跨域资源共享,定义了必须在访问跨域资源时,浏览览器与服务器该如何沟通,基本思想是,使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是否成功。注意,请求和响应都不包含cookie信息。IE8通过XDomainRequest对象支持CORS,其它浏览器通过XHR对象原生支持CORS。
b.JSONP,填充式JSON,应用JSON的一种新方法。
它是被包含在函数调用中的JSON,例如,
callback({“name”: “abc”});
JSONP由两部分组成,毁掉函数和数据。毁掉函数是当响应到来时应该在页面中调用的函数。数据时传入毁掉函数中的JSON数据。
JSONP只支持 “GET” 请求,但不支持 “POST” 请求。
var eleScript= document.createElement("script"); //创建一个script元素
eleScript.type = "text/javascript"; //声明类型、
eleScript.src = "http://www.bbb.com/getinfo.php"; //添加src属性 引入跨域访问的url
document.getElementsByTagName("HEAD")[0].appendChild(eleScript); //在页面中添加新创建的script元素
ajax实现的步骤
创建XHR对象,也就是创建一个异步调用对象
创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息
设置响应HTTP请求状态变化的函数
发送HTTP请求
获取异步调用返回的数据
使用JavaScript和DOM实现局部刷新
如何使用XHR
①创建XHR对象
1
2
var request = new XMLHttpRequest();
注意ie5和ie6不支持
(
兼容方法:var request = new ActiveXObject("Microsoft.XMLHTTP");
)
②进行HTTP请求
1
2
http是一种无状态协议(服务端不保留相关信息,无记忆),可以使浏览器从服务器请求信息和服务
HTTP请求
完整请求过程:
这里写图片描述
将以上分为两个过程:请求和响应
a.请求过程
1.http请求的方法,如GET或者POST请求
2.正在请求的URL地址(发出请求的地址)
3.请求头,如客户端环境的信息,身份验证信息等
4.请求体,包含客户提交的查询字符串信息,表单信息等
(请求头和请求体之间有一个空行,表示请求头已经结束,开始运行请求体)
请求方法:
GET:用于获取数据(如:浏览贴子)的默认方法,多用于查询,用url传递参数,任何人可见。
POST:用于上传数据(如:用户注册),用于修改服务器资源,对数量无限制
GET、POST的区别 :
GET在url里传送数据:安全性低、容量小
POST安全性一般、容量几乎无限
GET便于分享(商品地址和url有关),适合获取,且会缓存
POST更适合上传(图片等)
b.响应组成
1.一个数字和文字组成的状态码,用来显示请求成功还是失败
2.响应头,包含服务器类型、日期类型、内容类型、长度等
3.响应体 即相应正文
③XMLHttpRequest请求
方法一、open(method,url,async)
method:发送请求方法( GET、POST不分大小写)
url:请求地址(相对地址或者绝对地址)
async:请求异步(即true)或者同步(false),默认异步
方法二、send(string)发送到服务器
get时参数不写或者null
post时参数必须填写
例子
request.open("GET","get.php",ture);
request.send();
//get.php地址
//创建王二狗
request.open("POST","create.php",ture);
//设置http头信息,发送表单。setRequestHeader必须在open和send中间
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
request.send("name=王二狗&sex=男");
③XMLHttpRequest响应
属性
这里写图片描述
readystate属性:监听这个属性来判断事件是否响应完成,并取得成功
这里写图片描述
重要
<script>
//创建XHR
var request = new XMLHttpRequest();
//请求
request.open("GET","get.php",true);
request.send();
//响应
//用readystate监听,满足if条件
request.onreadystatechange = function(){
if(request.readyState===4&&request.status===200){
//随便做些啥
request.responseText
}
}
</script>
例子:(php不想看)
查询员工信息,可以通过输入员工编号查询员工基本信息
新建员工信息,包含员工姓名,员工编号,员工姓名,员工职位
(需要用php页面实现查询员工和新建员工的后台接口)
服务端由php实现
客户端实现
<h1>员工查询</h1>
<label>请输入员工编号:</label>
<input type="text" id="keyword"/>
<button id="search">查询</button>
<p id="searchResult"></p>
<h1>员工新建</h1>
<label>请输入员工姓名:</label>
<input type="text" id="staffName"/><br>
<label>请输入员工编号:</label>
<input type="text" id="staffNumber"/><br>
<label>请输入员工性别:</label>
<select id="staffSex">
<option>男</option>
<option>女</option>
</select><br>
<label>请输入员工职位:</label>
<input type="text" id="staffJob"/><br>
<button id="save">保存</button>
<p id="createResult"></p>
<script>
document.getElementById("search").onclick = function(){
//发送ajax查询并处理
//新建XHR
var request = new XMLHttpRequest();
//请求
request.open("GET","service.php?number="+document.getElementById("heyword").value);
request.send();
//响应,进行事件监听,获取onreadystatechange,判断是否请求成功,请求成功则进行页面更新
request.onreadystatechange = function(){
if(request.readyState===4){
if(request.status===200){
document.getElementById("searchResult").innerHTML = request.responseText;
}else{
alert("发生错误:"+request.status);
}
}
}
}
document.getElementById("save").onclick = function(){
var request = new XMLHttpRequest();
request.open("POST","service.php");
//构造参数
var data = "name=" +document.getElementById("staffName").value
+"&number=" +document.getElementById("staffNumber").value
+"&sex=" +document.getElementById("staffSex").value
+"&job=" +document.getElementById("staffJob").value;
request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
request.send(data);
request.onreadystatechange = function(){
if(request.readyState===4){
if(request.status===200){
document.getElementById("createResult").innerHTML = request.responseText;
}else{
alert("false:"+request.status);
}
}
}
}
</script>
jQuery的ajax
Jquery是将原生的Javascript封装好了成为了一个库,
jquery.ajax([settings])
1.type:类型,“POST”或 “GET”,默认为“GET”
2.url : 发送请求的地址
3.data:是一个对象,连同请求发送到服务器的数据
4.dataType:预期服务器返回的数据类型。如果不指定,jQuery将自动根据HTTP包MIME信息来智能判断,一般我们采用json格式,可以设置为“json”
5.success:是一个方法,请求成功后的回调函数。传入返回后的数据,以及包含成功代码的字符串
6.error:是一个方法,请求失败时调用此函数。传入XMLHttpRequest对象。
将js的ajax进行jq的改进
//引入jquery
<script src="http://apps.bdimg.com/libs/jquery/1.11.1/jquery.js"></script>
<script>
//初始化jquery
$(document).ready(function(){
//GET请求
$("#search").click(function(){
//$.ajax是对js中代码的封装,仅需要配置一些属性
$.ajax({
type:"GET",
url:"service.php?number="+$("#keyword").val(),
dataType:"json",
success:function(data){
if(data.success){
$("#searchResult").html(data.msg);
}else{
$("#searchResult").html("出现错误:"+data.msg);
}
},
error:function(jqXHR){
alert("发生错误:"+jqXHR.status);
}
});
});
//post请求
$("#save").click(function(){
$.ajax({
type:"POST",
url:"service.php",
dataType:"json",
//不用拼成url格式,直接用json拼写
data:{
name:$("#staffName").val(),
number:$("#staffNumber").val(),
sex:$("#staffSex").val(),
job:$("#staffJob").val(),
},
success:function(data){
if(data.success){
$("#createResult").html(data.msg);
}else{
$("#createResult").html("出现错误:"+data.msg);
}
},
error:function(jqXHR){
alert("发生错误:"+jqXHR.status);
}
});
});
});
</script>
在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST。
GET - 从指定的资源请求数据
POST - 向指定的资源提交要处理的数据
jQuery使用$符号作为 jQuery 的简介方式。换种方式$是JQuery的别名。
Ajax是一种技术,而JQuery只是实现了这种技术的一种方式,当然还有别的方式,可以实现AJAx这种技术。
(7)
一.当jquery在common.js之前引入
方法1:将$改写为jQuery
<script type = "text/javascript" src = "js/jquery-1.7.1.min.js"></script>
<script type = "text/javascript" src = "js/common.js"></script>
<script type="text/javascript">
jQuery(function(){
alert("jquery获取文本框值:"+jQuery('#test').val());
});
function ck(){
alert("自定义函数获取文本框值: "+$('test').value);
}
</script>
<input type = "text" id = "test" value ="我是文本框" />
<input type = "button" id = "btn" value = "点击" onclick="ck()"/>
方法2:jQuery.noConflict();自定义别名
<script type = "text/javascript" src = "js/jquery-1.7.1.min.js"></script>
<script type = "text/javascript" src = "js/common.js"></script>
<script type="text/javascript">
var jq = jQuery.noConflict();
jq(function(){
alert("jquery获取文本框值:"+jq('#test').val());
})
function ck(){
alert("自定义函数获取文本框值: "+$('test').value);
}
</script>
<input type = "text" id = "test" value ="我是文本框" />
<input type = "button" id = "btn" value = "点击" onclick="ck()"/>
方法3:使用语句块在语句块中仍然使用$,(不推荐)
<script type = "text/javascript" src = "js/jquery-1.7.1.min.js"></script>
<script type = "text/javascript" src = "js/common.js"></script>
<script type="text/javascript">
(function($){
$(function(){
alert("jquery获取文本框值:"+$('#test').val());
})
//alert("自定义函数获取文本框值: "+$('test').value);
})(jQuery);
function ck(){
alert("自定义函数获取文本框值: "+$('test').value);
}
</script>
<input type = "text" id = "test" value ="我是文本框" />
<input type = "button" id = "btn" value = "点击" onclick="ck()"/>
这种方法虽然保留了jquery对$符号的使用权限,但是局限性相对较大,此外自定义函数ck()不可写入语句块中,否则按钮点击事件无法获取该方法。若在我们自定义的函数中应用到了jquery,但是又不能将自定义方法置于语句块中,这就是不推荐这种方式的原因。
二.jquery在common.js后引入。
方法:这种情况需要jQuery.noConflict();让出$符号的使用权限,通过上述的自定义别名的方式即可解决
(8):可以不见兼容。ie8以下的;
(9)jq.js(未压缩.可用性高。加载慢)和js.min.js(压缩后的开发的。)
$.ajax({
url:"json.txt",
succ:function(date){
}
})
$.get("json1.txt")
#(head).load("wenjian")//公用头部;
$.entend{
}