jQuery

认识jQuery

jQuery的官方API文档地址是:http://api.jquery.com/

jQuery简介

**jQuery:**JavaScript和查询(Query),即是辅助JavaScript开发的库。其实就是这么一个一堆封装起来的函数的集合

eg:

///JavaScript
window.onload = function() {
    // ...code...
    };


//jQuery
//这段jQuery代码的意思是,为window对象绑定load事件,这个load方法接受的这个匿名函数会在window的load事件触发的时候执行。
$(window).load(function(){
    // code2
});

函数$()

函数$():完全支持CSS选择器方法querySelector(),并且能够处理querySelector()方法能处理的所有参数类型。

//$()方法可以接受一个字符串类型的参数,使能够在页面中找到id为parent的DOM元素。
$(window).load(function(){

  $("#parent").append("<span>Hello World!!</span>");

});

**JavaScript中标识符的命名规则:**JavaScript标识符必须以字母、下划线或美元符号( )开始,后续字符可以是字母、数字、下划线或美元符号。所以在 j Q u e r y 中 )开始,后续字符可以是字母、数字、下划线或美元符号。所以在jQuery中 )开始,后续字符可以是字母、数字、下划线或美元符号。所以在jQuery也只是一个普通的变量而已。

DOM对象包装成jQuery对象,我们已经见到两种了:

1)第一种是直接将一个DOM对象作为参数传递给$():

        $(window)

这样函数$()会将window对象包装成一个jQuery对象然后返回。

2)第二种则是传递一个选择器的参数给$():

        $('#parent')

jQuery 等同于 $

$实际上是一个函数,jQuery对象实际上是一个强大的初始化构造函数。

jQuery和$指向的是同一个对象

c.png

一个jQuery对象实际上是包含了一些DOM对象,外加jQuery自己提供了一些方法的集合。

jQuery对象是数组

jQuery对象实际上是一个数组,数组中的元素就是原始的DOM对象,所以我们从数据中获取到的就是原始的DOM对象:

        $(window)[0]

可以将其与原始的window对比:

        $(window)[0]===window

对比结果是true,说明它们是同一个对象。

如果这个jQuery数组对象中含有多个DOM元素怎么办呢?读取数组啊:

        var lis = $(".list");
        var origDOM = []; 
        for(var i = 0; i < lis.length; i++) {
            origDOM[i] = lis[i];
        }

jQuery选择器

纯JS查找DOM元素的方法

将jQuery当成一个数组读取,就能获取原始的DOM对象。

//getElementById是精确查找,其余的两个方法返回的结果都是数组

// 获取 id 为 parent 的 div 元素

  parEl = document.getElementById('parent');

  // 获取所有 tr 标签元素

  trEls = document.getElementsByTagName('tr');

  // 获取所有 class 为 list 的元素

  listEls = document.getElementsByClassName('list');

querySelector方法返回在DOM树中查找到的匹配参数条件的第一个元素,而querySelectorAll方法则返回DOM树中匹配参数条件的所有结果

使用jQuery查找DOM元素

eg:使用querySelectorAll方法查找到所有class属性为row的tr元素,然后为其class属性添加一个light值。

var rows = document.querySelectorAll('tr.row');
     for (var i = 0; i < rows.length; i++) { //遍历结果集
         rows[i].className += " light"; //为每个元素的class属性加上一个“light”
     }


//jQuery会自动的遍历这个数组,并为其中的每个元素执行这个添加class的操作。
$(window).load(function() {
	 var rows = document.querySelectorAll('tr.row');
     var jQueryObj = $(rows);
     jQueryObj.addClass("light");
});

//jQuery
$(window).load(function() {
	$('tr.row').addClass("light");
});

题1:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-418wzbnm-1672105336429)(C:\Users\maker\AppData\Roaming\Typora\typora-user-images\image-20220830154716358.png)]

层次查找

parent()方法

jQuery提供了一个parent()方法用于查找节点的直接父节点,如图所示,如果对节点div#navi调用这个方法,则查找到它的直接父节点就是div#cont。

![

](http://iflyssedata.oss-cn-shanghai.aliyuncs.com/upload/image/20160918/6360976640550745514714482.png)

除了查找直接父节点,还可以查找所有父节点。

blob.png

parents()方法

除此之外,parents()方法还可以接受选择器,然后以该节点的所有父节点为范围,在其中根据选择器查找节点。

blob.png

children()方法

children()方法可以用来查找指定元素的子节点,不过只能是直接子节点。

blob.png

并且,也可以传递选择器给children()这个方法,然后会在直接子节点中根据选择器查找节点。

find()方法

children()方法只能查找元素的直接子节点,对于更深层次的子节点则无能为力,因此就需要一个方法,能够在所有的后代节点中进行查找的,也就是find()方法。

blob.png

find()方法如果不传递参数,则其不会返回任何节点。

siblings()方法

最后一个是查找兄弟节点,即查找一个给定元素的所有兄弟节点,不论是排在前面还是后面的。

blob.png

使用jQuery操作DOM

toggleclass()方法

toggleclass()方法在jQuery中的描述为:为集合中的每个元素添加或移除一个或多个class,至于具体是添加还是移除则取决于当前这个元素中是否存在这个class值,或者由参数state的值决定增删。

这个方法可以接受参数,这个参数可以是一个字符串;也可以是一个函数,这个函数要能够返回以空格分隔的class名。此外还有一个可选的第二参数,是一个布尔值,用于决定是为这个元素添加class还是移除class。

eg: 对设置和移除所有

元素的 “main” 类进行切换:

//这串代码的意思就是:如果所有 <p> 元素有class=‘main’就去除,若没有则加上,
$("button").click(function(){
  $("p").toggleClass("main");
});
//为下面的HTML中的li标签添加上class属性,class属性的值为bgcolor1~bgcolorn
$(window).load(function(){
    var i = 0;
    $('li').toggleClass(function() {
        i++;
        return 'bgcolor'+i;
    });
});

attr()方法

jQuery为我们提供了attr()方法用于操作DOM的属性

attr(属性名)

//获取属性的值(取得第一个匹配元素的属性值。通过这个方法可以方便地从第一个匹配元素中获取一个属性的值。如果元素没有相应属性,则返回undefined )

attr(属性名, 属性值)

//设置属性的值 (为所有匹配的元素设置一个属性值。)

//HTML代码:
<p title="你最喜欢的水果是。">你最喜欢的水果是?</p>
 <ul>
    <li title="苹果汁">苹果</li>
    <li title="橘子汁" value="123">橘子</li>
    <li title="菠萝汁">菠萝</li>
 </ul>


//使用attr(name)获取title值:
alert($("ul li:eq(1)").attr("title"));

//使用attr(name,value)修改title值为:不吃橘子
$("ul li:eq(1)").attr("title","不吃橘子");
alert($("ul li:eq(1)").attr("title"));

//为下面的列表中的第一个a标签,添加上href属性,值为“#1”。
$("a:contains('Item 1')").attr("href","#1")

css()方法

css(),该方法用来返回或设置元素的一个或多个属性。

语法一:取首个匹配元素的属性值 css.(“propertyname”);

eg:返回首个p元素的background-color值

$(“p”).css(“background-color”);

语法二:为所有匹配元素设置一个样式属性(值) css.(“propertyname”,“value”);

eg:为所有的p元素设置background-color值

$(“p”). css.(“background-color”,“yellow”);

语法三:利用“属性名/值”对所有匹配元素设置多个样式属性(值) css({“propertyname”:“value”,“propertyname”:“value”,…});

eg:为所有的p元素设置background-color 和 font-size属性并赋值

$(“p”).css({“background-color”:“yellow”,“font-size”:“200%”});

val()方法

val()这个方法用于获取第一个匹配的元素的值,或者用于设置所有匹配的元素的值。另外,这个val()方法主要是用于获取或设置表单字段的值

eg:设置输入域的值:

HTML代码:

名称:

设置输入字段的值

JS代码:

$(document).ready(function(){

   $("button").click(function(){

       $("input:text").val("科大讯飞");

   });

});

remove()方法

remove()方法:在目标节点上调用这个方法即可删除这个节点。

append()方法以及其他插入法

append()这个方法可以接受的参数类型可以是jQuery对象、字符串、节点对象等,将参数的内容插入到目标对象子节点的末尾

可以将需要插入的节点直接以HTML字符串的形式传入。

blob.png

blob.png

blob.png

blob.png

这里调用insertBefore()方法的主体是待插入的对象,而不是插入的目标位置的对象。

insertAfter()方法与insertBefore是一对,不过插入的位置正好相反,这个是在后面插入的。

QQ截图20160926154006.png

each( )方法和this关键字

each()方法

jQuery提供了一个each()方法用来替代for循环。

$(window).load(function(){
  var pList = $('p');
  for (var i = 0; i < pList.length; i++ ) {
        var cont = $(pList[i]).text() ;
        $(pList[i]).text(cont + cont.length);
  }
});

//重点要注意这里出现的一个新的关键字“this”。这个each()方法实际上就是针对$('p')进行循环。那么每次循环都针对$('p')结果中的一项,在此处就是一个p节点,而this关键字,就是指这个p节点。也就是每次循环所针对的目标。就像我们的for循环中的pList[i]一样。
$(window).load(function(){
	$('p').each(function() {
		var cont = $(this).text();
		$(this).text(cont + cont.length);
		});
});

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MpRS5QiV-1672105336432)(C:\Users\maker\AppData\Roaming\Typora\typora-user-images\image-20220830172221007.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8jQChUGe-1672105336433)(C:\Users\maker\AppData\Roaming\Typora\typora-user-images\image-20220830172403706.png)]

jQuery中的事件处理

on方法

jQuery提供了一个on方法,这个方法用于绑定事件,它接受一个字符串作为事件的名称,后面接受一个函数,作为这个事件的处理程序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-27HyJ8Gp-1672105336433)(C:\Users\maker\AppData\Roaming\Typora\typora-user-images\image-20220902165340348.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qht2xddO-1672105336433)(C:\Users\maker\AppData\Roaming\Typora\typora-user-images\image-20220902165609128.png)]

事件

jQuery为许多事件的绑定提供了便捷方法,比如click()、dbclick()、mouseenter()、mouseleave()都是常用的jQuery绑定事件的方法。

快捷方式如.on( “change”, handler )则对应的快捷方法为.change( handler )

blob.png

当一个事件被触发时,浏览器捕获到这个事件的触发,就将这个事件触发过程中的一些相关信息,比如事件的类型,事件发生的元素、鼠标的坐标等等信息封装在一个对象中,并将这个对象传递给事件处理函数。

冒泡事件

冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件。

阻止事件进行冒泡

1、通过返回false来取消默认的行为并阻止事件冒泡。

$("form").bind( 
  "submit", 
  function() { 
    return false; 
   } 
); 

2、通过使用 preventDefault() 方法只取消默认的行为。

$("form").bind( 
  "submit", 
  function(event){ 
    event.preventDefault(); 
  } 
); 

3、通过使用 stopPropagation() 方法只阻止一个事件冒泡。

$("form").bind( 
  "submit", 
  function(event){ 
    event.stopPropagation(); 
  } 
); 

ready事件和load事件

网页加载,构造DOM树是需要时间的,如果说DOM树还没有加载完成,就已经运行了对DOM树操作的js代码,会怎样?

这样就导致了一些问题了,由于一些绑定事件处理以及对DOM操作的失败,必然会导致页面的交互性出问题

window对象表示的是浏览器窗口,当window加载完成时,则表示页面中的所有内容都加载完成了,包括构建DOM树,下载样式表文件,下载JS文件,下载网页中的图片等资源。

blob.png

不同于window的load事件,在jQuery中的document的ready事件并不是DOM中原生存在的事件,而是通过DOMContentLoaded事件构造出来的。

下图中说明了document的ready事件与window的load事件的区别:

也就是说,一般情况下,我们只需要将我们的JS代码放到document的ready的事件处理函数中即可,如果有需要对图片文件进行操作的JS代码,才需要放到window的load事件的处理函数中。

blob.png

 $(document).ready(function(){
    
        // ...code...
    
    });

jQuery中的动画效果

使用jQuery的hide()和show()方法隐藏和显式元素是通过设置元素的css属性中的display属性实现的。

语法:

    $(element).effect();

eg:

//将index.html中存在三个颜色各异的方块,请在document的ready事件处理中为其中的id为green的方块添加一个click事件,使其点击之后进行隐藏。为其中id为red的方块添加一个click事件,使点击red方块时,可以显示green方块。

$(document).ready(function(){
    $('#green').click(function(){
        $('#green').hide();
    });
    $('#red').click(function(){
        $('#green').show();
    });
});
//当鼠标移入时,这个区块就在1秒(1000ms)内变淡,然后隐藏:
$("#red").fadeOut(1000);

//当鼠标移入时,这个区块在1秒内颜色变深,显示完成:
$('#red').fadeIn(1000);

在jQuery中,函数()能够实现元素显示和隐藏的互换:toggle()

animate()方法

jQuery为我们提供了一个animate()方法,允许我们提供一些CSS属性的值,来实现自定义的动画效果。

//让一个图片,通过在一定的时间内修改其尺寸,来模拟心动的情形。
$(window).load(function(){
	
	$('img').mouseenter(function() {
		$('img').animate({
			height: "+=100px",
			width: "+=100px"
		}, 1000);
	});
	
	$('img').mouseleave(function() {
		$('img').animate({
			height: "-=100px",
			width: "-=100px"
		}, 1000);
	});
	
	$('img').trigger('mouseenter');
	$('img').trigger('mouseleave');

	setInterval(function(){
		$('img').trigger('mouseenter');
		$('img').trigger('mouseleave');
	}, 2000);

});

document的ready是等DOM树加载完成就触发,而window的load事件则是等页面中的所有内容都加载完成之后再触发。

AJAX

http请求

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)

HTTP工作原理

HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。

Web服务器有:Apache服务器,IIS服务器(Internet Information Services)等。

Web服务器根据接收到的请求后,向客户端发送响应信息。

HTTP默认端口号为80,但是你也可以改为8080或者其他端口

HTTP三点注意事项:

1.HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。

2.HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。

\3. HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。

一个完整的http事务

1)域名解析 -->

  1. 发起TCP的3次握手 -->

  2. 建立TCP连接后发起http请求 -->

  3. 服务器响应http请求,浏览器得到html代码 -->

5)浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) -->

6)浏览器对页面进行渲染呈现给用户 -->

HTTP 请求格式

HTTP请求格式主要有四部分组成,分别是:请求行、请求头、空行、消息体,每部分内容占一行。

d.png

请求行:请求行是请求消息的第一行,由三部分组成:分别是请求方法(GET/POST/DELETE/PUT/HEAD)、请求资源的URI路径、HTTP的版本号。如:

GET /index.html HTTP/1.1

请求头:请求头中的信息有和缓存相关的头(Cache-Control,If-Modified-Since)、客户端身份信息(User-Agent)等等。如:

Cache-Control:max-age=0

Cookie:gsScrollPos=; _ga=GA1.2.329038035.1465891024; _gat=1

If-Modified-Since:Sun, 01 May 2016 11:19:03 GMT

User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36

消息体:请求体是客户端发给服务端的请求数据,这部分数据并不是每个请求必须的。

HTTP 响应格式

服务器接收处理完请求后返回一个HTTP相应消息给客户端。HTTP响应消息的格式包括:状态行、响应头、空行、消息体。每部分内容占一行。

e.png

状态行:状态行位于相应消息的第一行,有HTTP协议版本号,状态码和状态说明三部分构成。如:

HTTP/1.1 200 OK

响应头:响应头是服务器传递给客户端用于说明服务器的一些信息,以及将来继续访问该资源时的策略。

Connection:keep-alive

Content-Encoding:gzip

Content-Type:text/html; charset=utf-8

Date:Fri, 24 Jun 2016 06:23:31 GMT

Server:nginx/1.9.12

Transfer-Encoding:chunked

响应体:响应体是服务端返回给客户端的HTML文本内容,或者其他格式的数据,比如:视频流、图片或者音频数据。

h.png

其中每一块的功能如下:

1、Controls控制Network的外观和功能。

2、Filters控制Requests Table具体显示哪些内容。

3、Overview显示获取到资源的时间轴信息。

4、Requests Table按资源获取的前后顺序显示所有获取到的资源信息,点击资源名可以查看该资源的详细信息。

5、Summary显示总的请求数、数据传输量、加载时间信息。

下面我们主要讲Requests Table这一块的内容,header中的信息就在这一块。

Name:资源名称,点击名称可以查看资源的详情情况,包括Headers、Preview、Response、Cookies、Timing。

Status(&Text):针对该请求服务器返回的状态码及描述该状态码的简短信息。

Type:该资源的类型。

Size:资源的大小。

Time: Time就是从请求开始到接到最后一个字节所经历的时间;而Latency为请

求开始到接收第一个字节所经历的时间。此处的请求开始指的是该请求的状态从stalled(阻塞)状态开始。

Timeline(waterfall):该列呈现出了每个请求从阻塞状态到完成请求所经历的阶段,和整个页面从加载到完成过程中其中资源的加载流。

Initator:初始化该请求的对象或进程,有以下几种情况:

Parser:请求由Chrome的HTML解析器时发起的。

Redirect:请求是由HTTP页面重定向发起的。

Script:请求是由Script脚本发起的。

Other:请求是由其他进程发起的,比如用户点击一个链接跳转到另一个页面或者在地址栏输入URL地址。

HTTP状态码

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。

HTTP状态码的英文为HTTP Status Code。

下面是常见的HTTP状态码:

1XX:信息类,表示是收到浏览器请求,正在进一步处理中。

2XX:成功,表示用户请求被正确接收,理解和处理。

eg:200 - 请求成功

3XX:重定向,表示请求没有成功,客户必须采取进一步动作。

eg:301 - 资源(网页等)被永久转移到其它URL

4XX:客户端错误,表示提交的请求有错误。

eg:404 - 请求的资源(网页等)不存在

5XX:服务器错误,表示服务不能完成对请求的处理

eg:500 - 内部服务器错误

web服务器

WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。

Web服务器是可以向发出请求的浏览器提供文档的程序。

1、服务器是一种被动程序:只有当Internet上运行在其他计算机中的浏览器发出请求时,服务器才会响应。

2 、最常用的Web服务器是Apache和Microsoft的Internet信息服务器(Internet Information Server,ⅡS)。

​ 3、Internet上的服务器也称为Web服务器,是一台在Internet上具有独立IP地址的计算机,可以向Internet上的客户机提供WWW、Email和FTP等各种Internet服务。

Web服务器的协议

1)应用层使用HTTP协议。

2)HTML文档格式。

3)浏览器统一资源定位器(URL)。

4)为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

常见的服务器有以下几种:

1)Apache服务器:Apache使用广泛,开放源代码,支持多个平台,相比其他服务器占的内存较大,是重量级产品。

2)Microsoft IIS 服务器:微软的,包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,要使用它需要购买对应的商业window server操作系统。

3)Nginx服务器:(发音同engine x)俄罗斯的一个站点开发的,相比于Apache服务器,Nginx占用内存小且较稳定。

4)Tomcat服务器:(汤姆猫服务器)也是开放源代码的,运行servlet和JSP Web应用软件基于Java,比绝大多数的商业用的软件服务器要好。

AJAX

异步的JavaScript和XML请求。

blob.png

在Ajax中的A表示Asyncronous(即异步),表明请求并不会阻塞其他事件的发生。也就是说,浏览器一边正常的与用户进行交互,另一边,则等待数据从服务器返回之后,将其显示到页面上。

这里的XML是表示在请求和响应的过程中主要使用XML格式来传输数据。不过这仅是其中的一种方式而已。

Ajax的核心是XMLHttpRequest对象,它是Ajax实现的关键——发送异步请求、接收响应及执行回调都是通过它来完成的。

Ajax的优势

不需要插件支持优秀的用户体验提高web程序的性能减轻服务器和带宽的负担

AJAX的具体实现

AJAX功能通过浏览器提供的XMLHttpRequest对象实现,所以首先创建一个XMLHttpRequest对象

  var xhr = new XMLHttpRequest();

然后为xhr设置一个事件回调函数

  xhr.onreadystatechange = function() {}

我们之前说过使用AJAX来加载数据是异步的,也就是说,当我们的请求发送出去之后,会继续做别的事情,不会等待响应。那么等响应回来了由谁去处理呢?

因此,我们为这个响应事件设置一个回调函数,当响应回来之后,触发这个事件,然后就调用相应的函数来处理。

然后再设置这个xhr对象的请求方式,请求路径:

  xhr.open("get", url, true);

然后最关键的一步是将构造好的这个请求,发送出去

  xhr.send(null);

然后看看这个onreadystatechange事件处理函数:当响应返回时,响应信息仍然在我们之前创建的这个xhr对象中,我们通过解析这个对象,来获取响应的相关信息。

在这个事件处理函数中,我们根据响应的状态码来判断响应是成功还是失败,如果成功则解析数据,进行后续处理,如果失败,则给出错误信息。

使用jQuery实现AJAX

image.png

$(window).load(function() {
    
    var aj = $.ajax( {  
        url: 'http://wthrcdn.etouch.cn/weather_mini?city=北京',  
        type:'get',  
        dataType:'json',  
        success:function(data) {
            $('body').text(data);
            console.log(data);
        },  
        error : function() {  
              alert("异常!");  
         }  
    });
});

这里屏幕上会打印一个对象blob.png,我们需要在控制台中才看到结果

blob.png

url: "test.php",
type: "post",
data: {
username: $("#username").val(),
content: $("#content").val()
},
success: function (data) {
var data = JSON.parse(data);
var username = data.username;
var content = data.content;
var txtHtml = "<div><span><b>" + username + "说:</b></span><span>" + content + "</span></div>";
$("#resText").html(txtHtml);

data里面的内容:$(“#username”).val()可以理解为获取id为username的元素,即本项目中的input,通过val()方法获取输入的值

success里面的内容,var data = JSON.parse(data),这是因为PHP代码中通过echo输出的是JSON格式的字符串,我们需要将它转换成对象,这就需要JSON.parse()方法。通过这样一个方法之后得到的是一个对象,通过调用例如本项目的data.username就能得到username的值了

$(“#resText”).html(txtHtml),找到id为resText的元素,在其内部插入txtHtml所指代的内容,于是就出现了这样的效果。

跨域请求的问题

blob.png

所谓的域,可以理解成域名,如果这个XHR所在的页面与请求的接口是在同一个应用下面,那么就不存在跨域的问题,它们是在同一个域下面,例如这里都在本地(localhost:8080)。

又如请求发起的XHR和请求的目标都是在wikipedia.org下面,则也不存在跨域的问题。

blob.png

而如果请求的发起XHR所在的页面和目标不在一个域下面,就存在了跨域的问题:

blob.png

$(window).load(function() {
    
    var cityString = "London";
    var wikiUrl = 'http://en.wikipedia.org/w/api.php?action=opensearch&search='
            + cityString + '&format=json&callback=wikiCallback';
    
    var aj = $.ajax( {  
        url:wikiUrl,  
        type:'get',  
        dataType:'json',  
        success:function(data) {
            console.log("ajaxFromSameSource");
            console.log(data);
        },  
        error : function() {  
              alert("异常!");  
         }  
    });
    
});

//解决方法
$(window).load(function() {
    
    var cityString = "London";
    var wikiUrl = 'http://en.wikipedia.org/w/api.php?action=opensearch&search='
            + cityString + '&format=json&callback=wikiCallback';
    
    $.ajax({
        url: wikiUrl,
        dataType: "jsonp",
        success: function( data ) {
            console.log(JSON.stringify(data));
        }
    });
});

相较于之前使用jQuery实现对于普通JSON接口访问的方式,实现JSONP的方式与之最大的区别在于两个参数的配置:type和dataType。

在实现JSONP的方式中,没有了type的选项,并且dataType变成了jsonp。除此之外,基本没有什么变化。

jQuery除了提供了.ajax()方法外,还提供了.post()、.get()、.getJSON()等方法,但这些方法无非就是对.ajax()方法的一些封装,使得代码编写起来更简介而已。

jQuery插件

jQuery插件的种类

  1. 封装对象方法的插件

这类插件是将对象的方法封装起来用于通过选择器获取的jQuery对象进行操作,是最常见的一种插件。

例如:我们可以编写一个color()方法的jQuery插件。

  1. 封装全局函数的插件

把独立的函数加到jQuery命名空间之下。

例如:常用的jQuery.ajax()方法以及去除首位空格的jQuery.trim()方法,都是以这种方法加到jQuery命名空间之下的。

  1. 选择器插件

虽然jQuery选择器十分强大,但还是会需要扩充一些自己喜欢的选择器。

例如:color(red)来选择所有红色字的元素之类的想法。

jQuery.fn.extend()函数方法

用于扩展封装对象的插件

jQuery.extend()方法

用于扩展封装全局函数的插件和选择器插件

这两个方法都接受一个参数,类型为Object。Object对象的“名/值对”分别代表“函数或方法名/函数主体”。

语法:jQuery.extend(target,obj1,…[objN])

解释:用一个或多个其他对象来扩展一个对象,然后返回被扩展对象。

例如:

//合并setting对象和option对象,修改并返回setting对象。
var settings = { validate:false,limit:5,name:"foo"};

var options = { validate:true,name:"bar"};

var newOptions = jQuery.extend(settings,options);

//结果为:

newOptions = { validate: true,limit:5,name:" bar "};

jQuery.extend()方法还经常被用于设置插件方法的一系列默认参数,

jQuery代码如下:

function foo(options){

    options=jQuery.extend({

       name:"bar";

       length:5,

       dataType:"xml" /*默认参数*/

    },options   /*options为传递的参数*/

)}

解释:若用户调用foo()方法的时候,在传递的参数options对象中设置了相应的值,那么使用设置的值,否则使用默认值。代码如下:

foo({name:"a",lengeh:"4",dataType:"json"});

foo({name:"a",lengeh:"4"});

foo({name:"a"});

foo();

通过使用jQuery.extend()方法可以很方便地用传入的参数来覆盖默认值。此时,对方法的调用保持一致,只不过传入的是一个映射而不是一个参数列表。这种机制比传统的每个参数都要去检测的方式不仅灵活而且简洁。

封装jQuery对象方法插件

功能:

1) 设置匹配元素的颜色

2) 获取匹配的元素(元素集合中的第一个)的颜色。

名字:jquery.color.js

方法:jQuery.fn.extend()

框架:

;(function($) {

$.fn.extend({

    "color":function(value){

    //这里写插件代码

    }

});

})(jQuery);

这里给这个方法提供了一个参数value。若调用方法时传递了value参数,那么用这个值设置字体颜色,否则获取匹配字体颜色的值。

第一个功能,设置字体颜色。

调用jQuery提供的css()方法,直接写成this.css(“color”,value)即可.

注:

1.插件内部的this指向jQuery对象并非普通的DOM对象。

2.若插件不需要返回字符串之类的特定值,应当使其具有可链接性。为此,直接返回这个this这个对象,由于css()方法也会返回调用它的对象,即此外的this,因此可以将代码写成:

;(function($) {

$.fn.extend({

    "color":function(value){

    return this.css("color",value);

    }

});

})(jQuery);

第二个功能,若没有参数传递,则获取集合对象中的第一个对象的color的值。

由于css()方法本身具有返回第一个匹配元素的样式值功能,所以无需通过eq来获取第一个元素。因此,只需要判断value是否为underfined即可。实际上,css()内部已经具有判断value是否为underfined的机制,所以最终代码就是之前的代码。

eg

<!DOCTYPE html>
<html>
<head>	
	<title>测试jquery.color.js</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
	<script type="text/javascript">
	//插件编写
	;(function($) {
		jQuery.fn.extend({
			"color":function(value){
				return this.css("color",value);
			}
		});
	})(jQuery);

	//插件应用
	$(function(){
		//把所有的div的字体颜色都设为红色
		alert( $("div").color("red")+"\n返回object证明得到的是jQuery对象。");
	})
	</script>
</head>
<body>
<div style="color:red">red</div>
<div style="color:blue">blue</div>
<div style="color:green">green</div>
<div style="color:yellow">yellow</div>
</body>
</html>

封装全局函数插件

这类插件是在jQuery命名空间内部添加一个函数。这类插件很简单,只是普通的函数,没有特别需要注意的地方。
例如新增两个函数,用于去除左侧和右侧的空格。

首先构建一个Object对象,把函数名和函数都放进去,其中的名/值对分别为函数名和函数主体,然后利用jQuery.extend()方法直接对jQuery对象进行扩展。得到如下代码:

;(function($) {

    $.extend({

       ltrim :  function( text ) {

           return (text ||   "").replace( /^\s+/g, "" )

       },

       rtrim :  function rtrim(  text ) {

           return (text ||   "").replace( /\s+$/g, "" )

       }

    });

})(jQuery);

注:

1.(text||“”)部分是用于防止传递进来的text这个字符串变量处于未定义的特殊状态,如果text是undeined,则返回字符串"",否则返回字符串text。这个处理是为了保证接下来的字符串替换方法replace()方法不会出错。

2.运用了正则表达式替换首末的空格。

eg

<!DOCTYPE html>
<html>
<head>
<title>封装全局函数插件</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script	type="text/javascript">
//插件编写
;(function($) {
	$.extend({
		ltrim :	function( text ) {
			return (text ||	"").replace( /^\s+/g, "" )
		},
		rtrim :	function rtrim(	text ) {
			return (text ||	"").replace( /\s+$/g, "" )
		}
	});
})(jQuery);
//插件应用
$(function(){
	$("#trimTest").val(
		jQuery.trim("       test      ") + "\n" +
		jQuery.ltrim("       test      ") + "\n" +
		jQuery.rtrim("       test      ")
	);
})
</script>
</head>
<body>
<textarea id="trimTest" rows="5" cols="20"></textarea>
<p>第一行左右两侧空格被删除</p><br />
<p>第二行只有左侧空格被删除</p><br />
<p>第一行只有右侧空格被删除</p>
</body>
</html>

自定义选择器

jQuery提供了gt、lt和eq等选择器,但是却没有le(小于等于)、ge(大于等于)和between(两者之间)之类的选择器。

接下来,我们来实现between选择器。使用$(“between(2,5)”)实现获取索引值为3、4元素的功能。

首先我们参考一个选择器的例子:

$(“div:gt(1))

//gt()选择器在jQuery中的代码:

gt:function(a,i,m){

    return i>m[3]-0;

}
//a:指向当前遍历的DOM元素。

//i:指的是当前遍历的DOM元素的索引值,从0开始。

//m:由jQuery正则解析引擎进一步解析后的产物,是一个数组。

    //m[0]:在该例子中是:gt[1]这部分,是jQuery选择器进一步匹配的内容。
    //m[1]:选择器的引导符匹配例子中的“:”,即冒号。
    //m[2]:例子中的gt,确定调用哪一个选择器函数。
    //m[3]:例子中的括号里的数字1,是编写选择器的一个重要参数。

参考以上代码,我们首先构建选择器函数。代码如下:

function(a,i,m){

    var tmp = m[3].split(,);  

    return tmp[0]-0<i&&i<tmp[1]-0; //i>2&&i<5

}

\1. 将传递过来的m[3]以逗号为分隔符,转化成一个数组。此时m[3]的值为“2,5”是一个字符串,放在tmp中待用。

\2. 直接将得到的2和5与i进行比较,i大于2并且i小于5的元素进行保留。

此处用到了通过tmp[0]-0将本来的字符串转化为了数字2,在与i进行比较。

所以最终jQuery代码为:

;(function($) {

           $.extend(jQuery.expr[":"], {

              between :  function( a , i ,m ) {

                  var tmp=m[3].split(",");

                  return tmp[0]-0<i&&i<tmp[1]-0;

              }

           });

       })(jQuery);
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>自定义选择器</title>
        <script src="jquery.js"></script>
	<script type="text/javascript">
		//插件编写
		;(function($) {
			$.extend(jQuery.expr[":"], {
				between :	function( a , i ,m ) {
					var tmp=m[3].split(","); //将传递进来的m[3]以逗号为分隔符,切成一个数组
					return tmp[0]-0<i&&i<tmp[1]-0;
				}
			});
		})(jQuery);

		//插件应用
		$(function(){
			alert("执行前");
			$("div:between(2,5)").css("background","white");
			alert("执行后");
		})
	</script>
</head>
<body>
<div style="background:red">0</div>
<div style="background:blue">1</div>
<div style="background:green">2</div>
<div style="background:yellow">3</div>
<div style="background:gray">4</div>
<div style="background:orange">5</div>
</body>
</html>

插件-jQuery Validate

jQuery Validate 是一款功能强大的表单验证插件。用于客户端验证,大多数现代网站填写表单时,都采用这款插件。那么我们就不得不提到它的优点了。

优点:

1) 可以减少服务器的压力。

2) 缩短用户等待时间和提升用户体验。

步骤:

1) 首先我们要引入jQuery依赖

2) 其次我们引入jQuery Validate的主文件

3) 编写验证代码

案例名称:一个简单的登录表单

要求如下:

用户名:2-10位,必填

密码:2-16位,必填

eg

<!DOCTYPE html>
<html>
<head>
		<meta charset="UTF-8">
		<title>表单验证插件</title>
		<style type="text/css">
			body {
				font-size: 36px;
				line-height: 1.6;
			}			
			p {
				margin: 10px 0;
			}			
			label {
				display: inline-block;
				min-width: 140px;
			}
			label.error {
				margin-left: 10px;
				color: red;
			}
			input,button {
				font-size: 36px;
				line-height: 35px;
				border: 1px solid #999;
				min-width: 180px;
			}
			input.error {
				border: 1px solid red;
			}
			input[type=submit],button {
				margin-top: 20px;
				font-size: 36px;
				padding: 10px 0;
			}
		</style>
		<script src="jquery.js"></script>
		<script src="validate.js"></script>
		<script>
			$(document).ready(function(){
				$("#demoForm").validate({
					rules:{
						username:{
							required:true,
							minlength:2,
							maxlength:10
						},
						password:{
							required:true,
							minlength:2,
							maxlength:16
						}
					},
					messages:{
						username:{
							required:"必须填写用户名",
							minlength:"用户名最小为2位",
							maxlength:"用户名最大为10位"
						},
						password:{
							required:"必须填写密码",
							minlength:"密码最小为2位",
							maxlength:"密码最大为16位"
						}
					}
				});
			});
		</script>
	</head>
	<body>
		<form id="demoForm">
			<fieldset>
				<legend>用户登录</legend>
				<p id="info"></p>
				<p><label for="username">用户名</label><input type="text" id="username" name="username" /></p>
				<p><label for="password">密码</label><input type="password" id="password" name="password" /></p>
				<p><input type="submit" value="登录" /></p>
			</fieldset>
		</form>
	</body>
</html>

validate基本验证方法

1) required 必填

​ eg:required:true 必输字段

2) remote 远程校验

​ eg:remote:“check.php” 使用ajax方法调用check.php验证输入值

3) minlength 最小长度

​ eg:minlength:10 输入长度最小是10的字符串(汉字算一个字符)

4) maxlength 最大长度

​ eg:maxlength:5 输入长度最多是5的字符串(汉字算一个字符)

5) rangelength 长度范围

​ eg:rangelength:[5,10] 输入长度必须介于5和10之间的字符串")(汉字算一个字符)

6) min 最小值

​ eg:min:10 输入值不能小于10

7) max最大值

​ eg:max:5 输入值不能大于5

8) range 值范围

​ eg:range:[5,10] 输入值必须介于 5 和 10 之间

9) email Email格式

​ eg:email:true 必须输入正确格式的电子邮件

10) url URL格式

​ eg:url:true 必须输入正确格式的网址

11) date 日期

​ eg:date:true 必须输入正确格式的日期

12) dateISO ISO日期

​ eg:dateISO:true 必须输入正确格式的日期(ISO),例如:2009-06-23,1998/01/22 只验证格式,不验证有效性

13) number 数字

​ eg:number:true 必须输入合法的数字(负数,小数)

14) digits 整数

​ eg:digits:true 必须输入整数

15) equalTo 与另一个元素值相等

​ eg:equalTo:“#field” 输入值必须和#field相同

Validate的基本概念与方法

1) 两个概念

method:验证方法,指的是校验的逻辑。

eg:email方法,检查输入的文本是否符合email的规则

rule:验证规则,指的是元素和验证方法的关联。

eg:页面的一个id为email的文本框,需要带有email的验证方法

2) 一个方法

validate是插件的核心方法,定义了基本的校验规则和一些有用的配置项

eg:debug,若参数为true,那么表单不会提交,只进行检查,调试时十分方便

3) valid()方法

检查表单或某些元素验证是否有效。

4) rules(“add/remove”,{object})

向表单元素增加/删除校验规则

使用如下图:

or=“password”>密码






## validate基本验证方法

1) required 必填 

​    eg:required:true 必输字段

2) remote 远程校验 

​    eg:remote:"check.php" 使用ajax方法调用check.php验证输入值

3) minlength 最小长度 

​    eg:minlength:10 输入长度最小是10的字符串(汉字算一个字符)

4) maxlength 最大长度 

​    eg:maxlength:5 输入长度最多是5的字符串(汉字算一个字符)

5) rangelength 长度范围 

​    eg:rangelength:[5,10] 输入长度必须介于5和10之间的字符串")(汉字算一个字符)

6) min 最小值 

​    eg:min:10 输入值不能小于10

7) max最大值 

​    eg:max:5 输入值不能大于5

8) range 值范围 

​    eg:range:[5,10] 输入值必须介于 5 和 10 之间  

9) email Email格式 

​    eg:email:true 必须输入正确格式的电子邮件

10)  url URL格式 

​    eg:url:true 必须输入正确格式的网址

11)  date 日期 

​    eg:date:true 必须输入正确格式的日期

12)  dateISO ISO日期 

​    eg:dateISO:true 必须输入正确格式的日期(ISO),例如:2009-06-23,1998/01/22 只验证格式,不验证有效性

13)  number 数字 

​    eg:number:true 必须输入合法的数字(负数,小数)

14)  digits 整数 

​    eg:digits:true 必须输入整数

15)  equalTo 与另一个元素值相等

​    eg:equalTo:"#field" 输入值必须和#field相同

## Validate的基本概念与方法

1) 两个概念

method:验证方法,指的是校验的逻辑。

eg:email方法,检查输入的文本是否符合email的规则

rule:验证规则,指的是元素和验证方法的关联。

eg:页面的一个id为email的文本框,需要带有email的验证方法

2) 一个方法

validate是插件的核心方法,定义了基本的校验规则和一些有用的配置项

eg:debug,若参数为true,那么表单不会提交,只进行检查,调试时十分方便

3) valid()方法

检查表单或某些元素验证是否有效。

4) rules("add/remove",{object})

向表单元素增加/删除校验规则

使用如下图:

![i.png](https://img-blog.csdnimg.cn/img_convert/db0ea23ea64d342f70af63da121a0fca.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值