js-day05-JSON-jQuery初体验

JSON数据格式

JSON(JavaScript Object Notation)一种简单的数据格式,比xml更轻巧。易于人阅读和编写,同时也易于机器解析和生成(网络传输速度快)
JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包。

描述一个对象 {属性名:属性值,属性名:属性值}

JSON的规则很简单:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’对”之间使用“,”(逗号)分隔。
规则如下:
  1)映射用冒号(“:”)表示。名称:值
  2)并列的数据之间用逗号(“,”)分隔。名称1:值1,名称2:值2
  3) 映射的集合(对象)用大括号(“{}”)表示。{名称1:值1,名称2:值2}
  4) 并列数据的集合(数组)用方括号(“[]”)表示。
    [
      {名称1:值,名称2:值2},
      {名称1:值,名称2:值2}
    ]
  5 元素值可具有的类型:string, number, object, array, true, false, null

//JSON:是一种数据格式,主要用来表示描述对象、封装对象的数据
//表示单个对象
//使用{}:Map<String,Object>
var p = {
    name:"will",
    age:17,
    sex:true,
    hireDate:new Date(),
    hobbys:["java","ACG","book"],
    dept:{
        id:9527,
        name:"管理部"
    }
};
//获取对象中的属性值
console.debug(p);
console.debug(p.age);
console.debug(p.sex);
console.debug(p.hobbys);
console.debug(p.dept.name);

//表示多个对象
//使用[]:List<Map<String,Object>>
var persons = [p,p,p];
console.debug(persons);
var persons = [{
        name:"will",
        age:17,
        sex:true,
        hireDate:new Date(),
        hobbys:["java","ACG","book"],
        dept:{
            id:9527,
            name:"管理部"
        }
    },{
        name:"will",
        age:17,
        sex:true,
        hireDate:new Date(),
        hobbys:["java","ACG","book"],
        dept:{
            id:9527,
            name:"管理部"
        }
    },{
        name:"will",
        age:17,
        sex:true,
        hireDate:new Date(),
        hobbys:["java","ACG","book"],
        dept:{
            id:9527,
            name:"管理部"
        }
    }
];

注意:
1.JSON数据格式:(注意:标准的JSON的属性也使用引号)
2.字符串转成对象:
3.json对象的toSource方法
------------------------------------------------------------
var str = "{name : 'will',age : 17}";
console.debug(str);
//eval函数,可以把一个字符串转换为JS代码
var p = eval("("+str+")");
console.debug(p.toSource());
------------------------------------------------------------
最好是:在JSON字符串前后,都带有();

 

使用JSON实现二级联动

使用JSON作为后台和前台的数据交互格式.
--------------------------------------------------------------------
在服务端需要把省份/城市的数据,拼接成一个JSON的字符串,并响应给JS.
JS需要把字符串的JSON数据,转换为JSON对象.-->每一个对象,都创建一个<option>元素,并存放数据.
使用JSON表示省份:
String jsonData = "[{id:1,name:'四川'},{id:2,name:'广东'},{id:3,name:'陕西'}]";

示例代码:

//Ajax二级联动之JSON格式
public class LinkageByJSONAction extends ActionSupport {
    
    private static final long serialVersionUID = 1L;

    private Long pid;
    
    public void setPid(Long pid) {
        this.pid = pid;
    }

    //获取所有省份
    /*
     * [
     * {id:1,name:'四川'},
     * {id:2,name:'广东'},
     * {id:3,name:'陕西'}
     * ]
     */
    public String getProvinces() throws Exception{
        StringBuilder sb = new StringBuilder(200);
        //获取所有省份
        List<Province> provinces = Province.getAllProvince();
        
        sb.append("[");
        for(Province p : provinces){
            sb.append("{");
            sb.append("id:").append(p.getId()).append(",");
            sb.append("name:").append("'").append(p.getName()).append("'");
            sb.append("}");
            sb.append(",");
        }
        sb.deleteCharAt(sb.length()-1);
        sb.append("]");
        //System.out.println(sb);
        //设置编码,并且打印JSON格式的信息
        ServletActionContext.getResponse().setContentType("text/json;charset=utf=8");
        ServletActionContext.getResponse().getWriter().print(sb);
        return NONE;
    }
    
    //获取对应id省份的城市    
    /*
     * [
     * {id:1,name:'广州'},
     * {id:2,name:'深圳'},
     * {id:3,name:'东莞'}
     * ]
     */
    public String getCitys() throws Exception{
        StringBuilder sb = new StringBuilder(200);
        //获取对应id省份的城市    
        List<City> citys = City.getCityByProvinceId(pid);
        
        sb.append("[");
        for(City c : citys){
            sb.append("{");
            sb.append("id:").append(c.getId()).append(",");
            sb.append("name:").append("'").append(c.getName()).append("'");
            sb.append("}");
            sb.append(",");
        }
        sb.deleteCharAt(sb.length()-1);
        sb.append("]");
        //System.out.println(sb);
        //设置编码,并且打印JSON格式的信息
        ServletActionContext.getResponse().setContentType("text/json;charset=utf=8");
        ServletActionContext.getResponse().getWriter().print(sb);
        return NONE;
    }
}
<body>
    <h3>Ajax二级联动,HTML格式</h3><br/>
    省份:<select id="province" onchange="getCitys();"><option>请选择</option></select>
    市级:<select id="city"><option>请选择</option></select>
</body>
//简单的Ajax,二级联动,JSON格式
//获取省份
window.onload = function(){
    //页面加载完毕之后,把所有省份查询出来并显示到页面
    var ajax = createAjax();
    ajax.open("get","/linkage/json_getProvinces.action",true);
    ajax.onreadystatechange = function(){
        if(ajax.readyState == 4 && ajax.status == 200){
            var jsonArray = eval("("+ajax.responseText+")");
            for (var index = 0; index < jsonArray.length; index++) {
                var jsonResult = jsonArray[index];//每一个省份对象
                
                //针对每一个省份对象都创建<option>元素
                var optionEl = document.createElement("option");
                optionEl.value = jsonResult.id;
                optionEl.innerHTML = jsonResult.name;
                document.getElementById("province").appendChild(optionEl);
            }
        }
    };
    ajax.send();
};
//获取市级,根据不同省份
function getCitys(){
    //获取省份id
    var pid = document.getElementById("province").value;
    document.getElementById("city").innerHTML = "<option>请选择</option>";
    //alert(pid);
    if(!parseInt(pid)){
        return;
    }
    var ajax = createAjax();
    ajax.open("get","/linkage/json_getCitys.action?pid="+pid,true);
    ajax.onreadystatechange = function(){
        if(ajax.readyState ==4 && ajax.status == 200){
            var jsonArray = eval("("+ajax.responseText+")");
            for (var index = 0; index < jsonArray.length; index++) {
                var jsonResult = jsonArray[index];//每一个市级对象
                
                //针对每一个市级对象都创建<option>元素
                var optionEl = document.createElement("option");
                optionEl.value = jsonResult.id;
                optionEl.innerHTML = jsonResult.name;
                document.getElementById("city").appendChild(optionEl);
            }
        }
    };
    ajax.send();
}

//创建Ajax对象,处理W3C和IE6以下版本浏览器的兼容性
function createAjax(){
    var ajax = null;
    
    try {
        ajax = new XMLHttpRequest();
    } catch (e) {
        ajax = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return ajax;
}

 

JSON转换工具(JSON lib和fast JSON)

JSON的转换工具(提供JSON对象和Java对象(JavaBean/集合)的相互转换方法):
  1):JSON lib.(最广泛的,需要依赖另外的5个jar).
  2):fast json(阿里开发的,号称世界第一,不需要依赖,有一个即可.)

测试代码:

@Test
    public void testJSONLib() throws Exception {
        List<Province> provinces = Province.getAllProvince();//多个对象s
        Province p = provinces.get(0);//单个对象
        //把单个对象转化为JSON字符串:JSONObject
        //{"id":1,"name":"四川"}
        System.out.println(JSONSerializer.toJSON(p));
        
        //把多个对象转化为JSON字符串:JSONArray
        //[{"id":1,"name":"四川"},{"id":2,"name":"广东"},{"id":3,"name":"陕西"}]
        System.out.println(JSONSerializer.toJSON(provinces));
        
        //支持把map转化为JSON格式
        Map<String,Object> map = new HashMap<>();
        map.put("id", 17);
        map.put("name", "四川");
        //{"name":"四川","id":17}
        System.out.println(JSONSerializer.toJSON(map));
    }

测试代码:

@Test
    public void testFastJSON() throws Exception {
        List<Province> provinces = Province.getAllProvince();//多个对象s
        Province p = provinces.get(0);//单个对象
        //把单个对象转化为JSON字符串:JSONObject
        String str1 = JSON.toJSONString(p);
        //{"id":1,"name":"四川"}
        System.out.println(str1);
        
        //把多个对象转化为JSON字符串:JSONArray
        String str2 = JSON.toJSONString(provinces);
        //[{"id":1,"name":"四川"},{"id":2,"name":"广东"},{"id":3,"name":"陕西"}]
        System.out.println(str2);
        
        //支持把map转化为JSON格式
        Map<String,Object> map = new HashMap<>();
        map.put("id", 17);
        map.put("name", "四川");
        //{"name":"四川","id":17}
        System.out.println(JSON.toJSONString(map));
    }

 

jQuery简介

1,jQuery简单背景介绍;
jQuery是继prototype之后又一个优秀的Javascript框架,(Extjs)。
jQuery是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)
jQuery是免费、开源的。
jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多).

2,jQuery版本介绍
jQuery1.x: 经典版本,兼容IE6,7,8;
jQuery2.x:改进版本,及后续版本将不再支持IE6,7,8浏览器。

jQuery能干什么?
jQuery使用户能更方便地处理HTML(标准通用标记语言下的一个应用)、events、实现动画效果,并且方便地为网站提供AJAX交互
jQuery的语法设计可以使开发者更加便捷,例如操作文档对象、选择DOM元素、制作动画效果、事件处理、使用Ajax以及其他功能。

3,JQuery文件介绍;
jQuery1.x.js:jQuery源文件;学习jQuery或者debug的时候使用;
jQuery1.x.min.js:jQuery压缩之后的文件;正常项目中使用;

 

 

jQuery的引入和体验

jQuery引入(安装):
第1步:引入jQuery的库文件:<script type="text/javascript" src="../jquery-1.11.2.min.js"></script>
第2步:引入我们自己的js : <script type="text/javascript" src="index.js"></script>
第3步:在index.js中,alert($),如果输出的是一个函数,说明安装成功!
出错效果如下:

使用不同的jQuery插件,可能依赖的jQuery库的版本不一致,此时请保留插件依赖的jQuery库.

神奇的$:
在jQuery中,$其实就是jQuery对象($ === jQuery).
-------------------------------------------------------------------------------------
案例:模拟Struts2的debu标签.(传统js代码和jQuery代码)

 示例代码:

<title>Insert title here</title>
    <script type="text/javascript" src="../jquery-1.11.2.js"></script>
    <script type="text/javascript" src="index.js"></script>
</head>
<body>
    <h3>模拟Struts2的debug标签</h3>
    <a href="#" id="debug1">debug(传统方式)</a><br/>
    <a href="#" id="debug2">debug(jQuery方式)</a>
    <div id="detail" style="display: none;">
        <h3>キセキ~未来へ~</h3>
        明日、今日よりも好きになれる 溢れる想いが止まらない<br/>
        明天会比今天更喜欢你 满溢的思念无法停止<br/><br/>
        今もこんなに好きでいるのに 言葉に出来ない<br/>
        现在虽然如此喜欢你 但却无法用语言表述<br/><br/>
        君のくれた日々が積み重なり 過ぎ去った日々2人歩いた「軌跡」<br/>
        你给予我的岁月沉淀累积 过去的日子里两个人一起前行的「轨迹」<br/><br/>
        うまく行かない日だって 2人で居れば晴れだって!<br/>
        不顺利的日子 两个人在一起就会放晴<br/><br/>
        喜びや悲しみも 全て分け合える<br/>
        喜悦或是悲伤 全部一起分享<br/><br/>
        君が居るから 生きていけるから!<br/>
        正因为有你 我才能活下去<br/><br/>
        だからいつも そばに居てよ 「愛しい君へ」最後の一秒まで<br/>
        所以一直留在我身边吧 「致可爱的你」直到最后一秒<br/><br/>
        明日、今日より笑顔になれる 君が居るだけで そう思えるから<br/>
        明天 会比今天有更好的笑颜 只要有你在 我就会这样想<br/><br/>
        何十年 何百年 何千年 時を超えよう 君を愛してる<br/>
        无论是几十年 几百年 还是几千年 都要超越时光地爱着你<br/><br/>
    </div>
</body>

 

//当页面加载完毕,给id为debug1的超链接绑定点击事件
window.onload = function(){
    document.getElementById("debug1").onclick=function(){
        var div = document.getElementById("detail").style.display;
        if(div){
            document.getElementById("detail").style.display = "";
        } else {
            document.getElementById("detail").style.display = "none";
        }
    };
};

//使用jQuery完成
$(function(){
    $("#debug2").click(function(){
        $("#detail").toggle(200);
    });
});

$(function(){
  //页面加载完毕之后,就执行的代码,相当于window.onload事件
});
---------------------------------------------------------------------------
window.onload=function(){};只能编写一次,后写会覆盖之前写的.
而$(function(){});可以写N次.
--------------------------------------------------
$("#ox"):获取ID属性为ox的元素对象.

 

jQuery对象

需求:获取和修改某个元素的文本内容.
-----------------------------------------------------------------------------------
引入问题:通过document.getElementById()找到的console内容和通过$();找不到元素console返回的内容不一样;

1,通过jQuery方法获取的页面元素,都是jQuery对象。
2,jQuery对象其实就是对DOM对象进行了包装,增强相关了方法,让开发者使用起来更加便利。
  jQuery对象其实是模拟了数组(伪数组),每一个索引对应一个真正的DOM元素.
  jQuery对象是不可能为null的,可以根据jQuery的length是否为0来判断,当前是否查询出了DOM元素.
3,虽然jQuery对象包装了DOM对象但是两种不能混用,各位可以理解为jQuery对象与DOM对象是两个不类型的对象,但是我们调用jQuery对象的方法,事实上底层代码还是操作的是DOM对象。
-----------------------------------------------------------------------------------------------------------------------
jQuery对象和DOM对象的关系,是jQuery对象包含了DOM对象.
jQuery对象和DOM对象的获取方式,以及相互的转换问题:
  1):使用jQuery方法获取的对象都是jQuery对象.
  2):使用document.getElementById/getElementsByTagName/getEelementsByName获取的都是DOM对象.

jQuery对象转换为DOM对象:
  jQuery对象[index]或者jQuery对象.get(index):表示当前jQuery对象中包装的第index个DOM元素.
DOM对象转换为jQuery对象: $(DOM对象);

----------------------------------------------------
jQuery对象只能访问jQuery对象的属性和方法,不能访问DOM对象的属性和方法.
DOM对象只能访问DOM对象的属性和方法,不能访问jQuery对象的属性和方法.

//获取id为div1的文本内容
$(function(){
    //通过jQuery选择器查询出来的都是jQuery对象
    var jQueryObject = $("div");
    console.debug(jQueryObject);//jQuery
    console.debug(jQueryObject.innerHTML);//innerHTML是DOM对象的方法,jQuery对象不能使用
    //jQuery对象转化为DOM对象
    console.debug(jQueryObject[0].innerHTML);
    console.debug(jQueryObject.get(0).innerHTML);
    
    console.debug("===================")
    //DOM对象转化为jQuery对象
    var domObject = document.getElementById("div1");
    console.debug(domObject);
    console.debug($(domObject));
    console.debug($(domObject).text());
});

 

/*    
jQuery常用方法:<br/>
jquery.size()//获取jquery获取dom的个数.<br/>
jquery.val();//获取表单标签相关的值。<br/>
jquery.html();//获取标签中的HTML代码。<br/>
jquery.text();//获取标签中的纯文本,忽略html代码。<br/>
 */    
//<li>问题一:获得username的值; </li>
$(function(){
    var username = $("#username").val();
    console.debug(username);//圣光啊
});
//<li>问题二:为username设置值;</li>
$(function(){
    var username = $("#username").val("那个邪恶看起来值得一战").val();
    console.debug(username);//那个邪恶看起来值得一战
});
//<li>问题三:获取h1的html内容和纯文本内容,对结果进行比较;</li>
$(function(){
    var html = $("#h1").html();
    var text = $("#h1").text();
    console.debug(html);
    console.debug(text);
});
//<li>问题四:把h1的颜色设置为黄色(attr);</li>
$(function(){
    //$("#h1").attr("style","background:yellow");
    $("#h1").css("background","yellow").css("color","gray");
});
//<li>问题五:完成类似struts2的debug效果(toggleClass/toggle);</li>
$(function(){
    $("#debug").click(function(){
        $("#question").toggle();
    });
});

 

 

jQuery选择器概述/如何学习jQuery/jQuery常用方法

文档在手,天下我有!
------------------------------------------------------------------------------------
jQuery选择器是jQuery类库最重要功能之一。
这些选择器的用法和CSS的语法非常相似,结合jQuery类库的方法你可以很方便快速地定位页面中任何元素,并为其添加响应的行为。
-------------------------------------------------
一、什么是选择器?
  jQuery提供获取页面元素一种语法。

二、选择器的组成?
  选择器一般由“特殊符号”+“字符串”组成。
  比如:“#”代表id “mydiv”是一个字符串,那么整体#mydiv代表,id为mydiv的元素对象。

三、使用选择器获取元素?
  $(“选择器”) , $ (“#mydiv”)

注意:如果通过jQuery方法获取页面中元素,没有查找到,返回值不是null,返回值为一个空数组[],所以判断是否获取到元素,通过jquery.length!=0来判断。

过滤选择器:通过特定的过滤规则来筛选所需要的DOM元素.过滤规则与CSS中的伪类选择器语法相同.
即选择器以一个冒号(:)开头.
按照不同的过滤规则,可分为基本过滤,内容过滤,可见性过滤,属性过滤,子元素过滤,表单对象属性过滤选择器.

//基础选择器
//<li>问题一:请得到id为msg的元素的文本内容; </li>
$(function(){
    var msg = $("#msg").text();
    console.debug(msg);
});
//<li>问题二:请查询所有li元素,并打印出数量;</li>
$(function(){
    var length = $("li").length;
    console.debug(length);
    var size = $("li").size();
    console.debug(size);
});
//<li>问题三:得到所有class为selected的元素;</li>
$(function(){
    console.debug($(".selected"));
});
//<li>问题四:查询myul下有多少个li,学会使用selector和get方法;</li>
$(function(){
    console.debug($("#myul li"));
    console.debug($("#myul li")[0]);//DOM对象
    console.debug($("#myul li").get(0));//DOM对象
    console.debug($("#myul li").selector);//当前使用的选择器类型
});
//层级选择器
//<div>问题一:选择ul下的所有li元素,并分析选择结果; </div>
$(function(){
    console.debug($("ul li"));
});
//<div>问题二:选择myul下的所有直接li元素,并分析选择结果; </div>
$(function(){
    console.debug($("#myul>li"));
});
//<div>问题三:选择所有label元素后的input元素,并分析选择结果; </div>
$(function(){
    console.debug($("label~input").css("background-color","yellow"));
});
//<div>问题四:选择紧跟着label元素的input元素,并分析选择结果; </div>
$(function(){
    console.debug($("label+input").css("background-color","gray"));
});
//基础过滤器
//<li>问题一:请得到ul第一个li元素(:first); </li>
$(function(){
    //$("ul li:first").css("background","yellow");
});
//<li>问题二:请得到每一个ul的第一个li元素(:first-child);</li>
$(function(){
    //$("ul li:first-child").css("background","yellow");
});

//<li>问题三:得到ul最后一个li元素;</li>
$(function(){
    //$("ul li:last").css("background-color","yellow");
});
//<li>问题四:得到每一个ul元素的最后一个li元素(:last-child);</li>
$(function(){
    //$("ul li:last-child").css("background-color","yellow");
});
//<li>问题五:得到奇数/偶数位li元素(:odd/:even);</li>
$(function(){
    //$("li:odd").css("background-color","yellow");
    //$("li:even").css("background-color","yellow");
});
//<li>问题六:得到每一个ul元素的奇数/偶数位li元素(:nth-child);</li>
$(function(){
    //$("ul li:nth-child(3n+1)").css("background-color","yellow");
});
//<li>问题七:表格隔行变色;</li>
$(function(){
    //$("#mytable tbody tr:even").css("background-color","yellow");
    //$("#mytable tbody tr:odd").css("background-color","gray");
});
//<li>问题八:选择所有id属性值以select_开头的checkbox([attribute^=value]);</li>
$(function(){
    console.debug($(":checkbox[id^='select_']"));
});
posted @ 2019-01-18 20:26  松鼠航  阅读(262)  评论(0编辑  收藏  举报