废话不说,直接上图

一 js的基本操作

(1)js 的六种数据类型

  1. var n4;//六种数据类型用typeof来确定类型,Null类型的用typeof是不行的,这个是特殊
  2. alert(typeof (n4));
  3. var n1 = 123;
  4. alert(typeof n1);
  5. var n2 = "hahaha";
  6. alert(typeof (n2));
  7. var n3 = true;
  8. alert(typeof (n3));
  9. var n5 = null;
  10. alert(String(n5));
  11. var n6 = new Object();
  12. alert(typeof (n6));

(2)是否相等的两种判断'=='和'===

  1. var n1 = null;
  2. var n2;
  3. alert(Boolean(n1));
  4. alert(Boolean(n2));
  5. if (n1 === n2) {//这里双等号和三等号是不同的,两个等号会将值进行类型转换再判断,三个等号不仅判断值还判断数据类型
  6. alert("相等");
  7. } else {
  8. alert("不相等");
  9. }
  10. var n3;
  11. //判断一个变量或者对象是不是可以使用
  12. if (typeof (n3) != undefined && n3 != null) {
  13. alert("可以使用");
  14. } else {
  15. alert("不能使用");
  16. }

(3)类型转换的问题

  1. //类型转换, parseInt和parseFloat
  2. var n = '10';
  3. alert(parseInt(n) + 90);
  4.  
  5. var n = '10skdfj';
  6. alert(parseInt(n));
  7.  
  8. var n = '2.513';
  9. alert(parseFloat(n));
  10.  
  11. var n = 'sdf';
  12. alert(parseInt(n));//如果是不能转换的类型,即返回NAN,就是not a number
  13. //---------------判断是否转换成功
  14. var n = 'string';
  15. if (isNaN(parseInt(n))) {
  16. alert('不可以使用');
  17. } else {
  18. alert('可以使用');
  19. }
  20. // ------------------测试调试
  21. var sum = 0;
  22. for (var i = 0; i < 6; i++) {
  23. sum += i;
  24. }
  25. alert(sum.toString());

(4)js中的方法

  1. // 访问修饰符+返回值类型+方法名+【参数列表】 C#中的方法声明
  2. // public void Show(string str)
  3. //关键字function +方法名+【参数列表(无须声明参数类型)】 js中的方法声明(注意没有返回值类型)
  4. function func(n) {
  5. alert('嘎嘎');
  6. }
  7. function func() {
  8. alert('不要闹');
  9. }
  10. func('哈哈');//js中没有方法的重载这么一说,就是浏览器从上到下一行一行解析

(5)最简单的面向对象,

  1. function Person() {
  2. }
  3. var per = new Person();
  4. per.name = '张三';
  5. per.Sayhello = function () {
  6. alert('大家好,我叫' + per.name);
  7. }
  8. alert(per.name);
  9. per.Sayhello();
  10. //===================//
  11. function Person(name, age) {
  12. this.name = name;
  13. this.age = age;
  14. this.Sayhello = function () {
  15. alert('大家好,我叫' + this.name + '我今年' + this.age + '岁了');
  16. }
  17. }
  18. var per = new Person('李四', 51);
  19. alert(per.name);
  20. per.Sayhello();

(6)字符串对象的几个常用方法

  1. // 1,字符串.length表示字符串的长度
  2. var str = new String('嘎嘎');
  3. alert(str+str.length);
  4. var str = '我是字符串的内容';
  5. alert(str.length);
  6. alert('今天天气好晴朗处处好风光'.length);
  7. // 2,字符串.charAt();表示获取指定索引位置的字符串
  8. var char = '今天天气好晴朗处处好风光';
  9. alert(char.charAt(6));
  10. // 3,indexOf('字符串',startIndex)方法,获取指定字符串第一次出现的位置,找不到就放回-1
  11. var str = '啦啦啦德玛西亚哦';
  12. alert(str.indexOf('西',6));
  13. // 4,spilt('字符串',limit);根据分隔符把字符串返回为一个数组
  14. var str = '今|天|天|气|好|晴|朗';
  15. var result = str.split('|');//接受数组不需要循环,但是一个一个输出需要循环,否则就一次行输出,用逗号隔开
  16. alert(result);
  17. for (var i = 0; i < result.length; i++) {
  18. alert(result[i]);
  19. }
  20. //5,spilt切割字符串可以用正则表达式
  21. var str = 'a☆b★c#d';
  22. alert(str.split(/☆|★|#/));
  23. //6,substr和substring,都是从索引位置开始切割,第二个参数有所不同,一个是切割多少个,一个是切割到哪个索引
  24. var str = '今天天气好晴朗处处好风光';
  25. alert(str.substr(3, 2));
  26. alert(str.substring(3, 5));
  27. //7,touppercase和tolowercase 转换大小写
  28. var str = 'i need you ';
  29. alert(str.toUpperCase());

二 DOM操作

整个页面或者说窗口就是一个window对象
所以页面的一些元素都可以通过window点出来

1.
页面的点击事件有两个,
body的onclick----------只限于在body中点击才能触发
document.onclick----------整个页面内点击都可以触发

2.
动态设置事件有两种方式:
(1)
直接在某个标签中写js代码,如:
<input type="button" onclick="js代码" />
(2)
通过document.getElementById('id').onclick=匿名函数;在这个匿名函数中写要执行的代码;

3.
window对象的属性和方法:
一般情况,使用window的属性或者方法可以省略window,直接写方法名就可以;如:
window.alert('我好帅');----我们可以省略window;
confirm('弹出内容');----这个方法返回bool类型,可以通过这个方法尽心弹框
window.navigate(url);----这个方法的意思是指重新导航;---------------IE和空中支持
window.location.href=url;-----这个可以直接赋值,表示的是去这个网址-所有浏览器都支持
window.location.reload();----这个方法相当于刷新

4.
js中的两个计时器
setInterval(code,delay);这个计时器指的是每隔多长时间执行一次里面的代码
setTimeout(code,delay);这个计时器指的是隔多长时间就执行一次
两个计时器都是方法,返回值都是他们本身的id,有了id就可以销毁计时器
clearInterval(intervalId);---是第一个计时器的销毁方法
clearTimeout(setTimeoutId);----是清除第二个计时器的方法

5.
doucument的事件三个
onload(页面加载后触发)---常用
onunload(页面卸载后触发)--不常用
onbeforeunload(页面卸载前触发)---经常用

6.
window.event----一般兼容IE,火狐不兼容

window.event.altKey---检测用户按下的是alt键

window.event.ctrlKey---检测用户按下的是ctrl键

window.event.shiftKey--检测用户按下的是shift键

window.event.clientX---发生事件的时候鼠标在客户区的横坐标

window.event.clientY---发生事件的时候鼠标在客户区的纵坐标

window.event.screenX---发生事件时鼠标在屏幕上的横坐标

window.event.screenY---发生事件时鼠标在屏幕上的纵坐标

window.event.offsetX---发生事件时鼠标相对于事件源的横坐标

window.event.offsetY---发生事件时鼠标相对于事件源的纵坐标

window.event.returnValue---值为false的时候指的是取消事件的处理和return false一样(后者常用,兼容问题)

window.event.srcElement---事件源

window.event.button---鼠标按键的值

window.clipboardData.setData('text',值);---设置剪切板内容

window.clipboardData.getData('text');---获得剪切板内容

在火狐里都可以用参数的方式
jquery中全部传参数

body.oncopy---复制的事件

body.onpaste---粘贴的事件

案例一:DOM操作粘贴板

  1. window.onload = function () {
  2. //复制内容
  3. document.body.oncopy = function () {
  4. setTimeout(function () {
  5. var txt = clipboardData.getData('text') + '本文作者李白';//为粘贴板中的内容加标注,注意粘贴板对象clipboardData没有智能提示,别写错了
  6. clipboardData.setData('text', txt);
  7. }, 100);
  8. }
  9. }

案例二:DOM动态创建元素

  1. window.onload = function () {
  2. document.getElementById('btnCreate').onclick = function () {//这里一开始写成了click,click和onclick的区别是onclick才是给这个按钮注册click事件
  3. //创建一个层,也就是一个DOM对象
  4. var divObj = document.createElement('div');
  5. //为创建的这个层设置属性
  6. divObj.style.height = "300px";
  7. divObj.style.width = "500px";
  8. divObj.style.backgroundColor = "red";
  9. divObj.id = 'dv1';
  10. //把这个层添加到body里面
  11. document.body.appendChild(divObj);
  12. }
  13. document.getElementById('btnDelete').onclick = function () {
  14. var Div = document.getElementById('dv1');
  15. document.body.removeChild(Div); //这行代码就是删除一个body里面的元素
  16. }
  17. var i = 0;
  18. document.getElementById('btnAdd').onclick = function () {
  19. i++;
  20. var inputObj = document.createElement('input');
  21. inputObj.type = 'button';
  22. inputObj.value = '我是新来的' + i;
  23. //获取当前的元素,就是当前的层
  24. var newObj = document.getElementById('dv1');
  25. // newObj.appendChild(inputObj);
  26. newObj.insertBefore(inputObj, newObj.firstChild);
  27. }
  28. }

案例三: DOM方式态添加表格超链接

  1. window.onload = function () {
  2. document.getElementById('btn').onclick = function () {
  3. var dic = { "百度": "http://www.baidu.com", "传智播客": "http://www.itcast.cn", "谷歌": "http://www.google.com" }; //创建名字和网址的超链接
  4. var tb = document.createElement('table'); //创建一个表
  5. tb.border = '1';
  6. for (var key in dic) {
  7. //创建行
  8. var trObj = document.createElement('tr');
  9. //创建单元格
  10. var td1 = document.createElement('td');
  11. if (typeof (td1.innerText) == 'string') {
  12. td1.innerText = key; //为单元格的文字赋值 所以是 td1.innerText,这个是IE里面的
  13. }
  14. else {
  15. td1.textContent = key; //如果td1.innerText的类型不是string 那么就是在火狐浏览器里面,就用td1.textContent
  16. }
  17. var td2 = document.createElement('td');
  18. td2.innerHTML = '<a href="' + dic[key] + '">' + key + '</a>'; //在单元格里面创建一个超链接,所以用td2.innerHTML
  19. trObj.appendChild(td1); //下面就是把单元格加到行中,把行加到表中,把表加到body里面
  20. trObj.appendChild(td2);
  21. tb.appendChild(trObj);
  22. }
  23. document.body.appendChild(tb);
  24. }
  25. }
  1. window.onload = function () {
  2. document.getElementById('btn').onclick = function () {
  3. var dic = { "百度": "http://www.baidu.com", "传智播客": "http://www.itcast.cn", "谷歌": "http://www.google.com" };
  4. var tb = document.createElement('table');
  5. tb.border = '1';
  6. for (var key in dic) {
  7. var tr = tb.insertRow(-1);
  8. var td1 = tr.insertCell(-1);
  9. td1.innerText = key;
  10. var td2 = tr.insertCell(-1);
  11. td2.innerHTML = '<a href="' + dic[key] + '">' + key + '<a/>';
  12. }
  13. document.body.appendChild(tb);
  14. }
  15. }

案例四:点击超链接变色

  1. //注意这类功能都是在click中把兄弟元素的属性重新遍历设置一遍
  2. window.onload = function () {
  3. var as = document.getElementsByTagName('a');
  4. for (var i = 0; i < as.length; i++) {
  5. as[i].onclick = function () {
  6. for (var j = 0; j < as.length; j++) {
  7. as[j].style.backgroundColor = '';
  8. }
  9. this.style.backgroundColor = 'red';
  10. return false;
  11. }
  12. }
  13. }

案例五: 小图显示大图

  1. window.onload = function () {
  2. var datas = {
  3. 'mv/1-1.jpg': ["mv/1.jpg", "老牛", "163cm"],
  4. 'mv/2-1.jpg': ["mv/2.jpg", "老马", "165cm"],
  5. 'mv/3-1.jpg': ["mv/3.jpg", "老蒋", "150cm"]
  6. };
  7. var dvs = document.getElementById('dvSmall');
  8. for (var key in datas) {
  9. var imageObj = document.createElement('image');
  10. imageObj.src = key;
  11. imageObj.setAttribute('k', key);
  12. imageObj.style.marginLeft = '10px';
  13. imageObj.style.cursor = 'pointer'; //鼠标进入的时候显示小手的样子
  14. dvs.appendChild(imageObj);
  15. imageObj.onmouseover = function () {
  16. var dvB = document.getElementById('dvBig');
  17. //脱离文档流,确定位置,显示
  18. dvB.style.position = 'absolute';
  19. dvB.style.left = this.offsetLeft + 'px';
  20. dvB.style.top = this.offsetTop + this.offsetHeight + 'px';
  21. dvB.style.display = 'block';
  22. //把键值对里面的值(这里是一个数组)取出来
  23. var values = datas[this.getAttribute('k')];
  24. //确定显示的内容
  25. document.getElementById('imBig').src = values[0];
  26. document.getElementById('spName').innerText = values[1];
  27. document.getElementById('spHeight').innerText = values[2];
  28. }
  29. //鼠标离开的时候大图隐藏
  30. imageObj.onmouseout = function () {
  31. if (document.getElementById('dvBig').style.display=='block') {
  32. document.getElementById('dvBig').style.display = 'none'
  33. }
  34. }
  35. }
  36.  
  37. };
  1. <body>
  2. <div id="dvSmall">
  3. </div>
  4. <div id="dvBig" style="background-color: Orange; border: 1px solid green; width: 630px;
  5. display: none;">
  6. 大头像:<br />
  7. <img id="imBig" src="#" alt="Alternate Text" />
  8. 姓名:<span id="spName"></span><br />
  9. 身高:<span id="spHeight"></span>
  10. </div>
  11. </body>

案例六:DOM下列表的高亮显示

  1. window.onload = function () {
  2. var uls = document.getElementById('u').getElementsByTagName('li');
  3. for (var i = 0; i < uls.length; i++) {
  4. uls[i].onmouseover = function () {
  5. for (var j = 0; j < uls.length; j++) {
  6. uls[j].style.backgroundColor = '';
  7. }
  8. this.style.backgroundColor = 'red'; //这里用this,不能用uls[i],因为这个是uls[i]注册的时间里面调用到自己
  9. }
  10. uls[i].onclick = function () {
  11. for (var j = 0; j < uls.length; j++) {
  12. this.style.fontSize = '';
  13. }
  14. this.style.fontSize = '50px';
  15. }
  16. }
  17. }
案例七:复习正则表达式
  1. // var s = '111@sdf.com';
  2. // var regex = /.+@.+/;
  3. // var mat = s.match(regex);
  4. // alert(mat); 字符串的.match
  5. // var msg = '杨中科:13888888888苏坤:13999999999小胡:133888888888';
  6. // var result = msg.replace(/(\d{3})(\d{4})(\d{4})/, '$1****$3');
  7. var msg = ' 今天天气好晴朗处处好风光 ';
  8. function trimString(s) {
  9. return s.replace(/^\s+/, '').replace(/\s+$/,'') ;//^表示匹配输入字符串的开始位置,$表示匹配字符串的结束位置
  10. } //先切前半部分,再切后面,jQuery源码里面就是这么写的
  11. var result = trimString(msg);
  12. alert(result);

案例八:用键盘抬起事件和正则表达式实现密码强度

  1. <script type="text/javascript">
  2. window.onload = function () {
  3. var tds = document.getElementById('tb').getElementsByTagName('td');
  4.  
  5. document.getElementById('txt').onkeyup = function () {//onkeyup 就是键盘抬起的事件
  6. for (var i = 0; i < tds.length; i++) {
  7. tds[i].style.backgroundColor = 'gray';
  8. }
  9. var result = chechPwd(this.value);
  10. if (this.value.length > 0) {
  11. if (result <= 1) {
  12. tds[0].style.backgroundColor = 'red';
  13. } else if (result == 2) {
  14. tds[0].style.backgroundColor = 'blue';
  15. tds[1].style.backgroundColor = 'blue';
  16. } else if (result == 3) {
  17. for (var i = 0; i < tds.length; i++) {
  18. tds[i].style.backgroundColor = 'green';
  19. }
  20. }
  21. }
  22. }
  23. }
  24. function chechPwd(str) {
  25. var lvl = 0;
  26. if (str.match(/\d/)) {
  27. lvl++;
  28. }
  29. if (str.match(/[a-zA-Z]/)) {
  30. lvl++;
  31. }
  32. if (str.match(/^[0-9a-zA-Z]/)) {
  33. lvl++;
  34. }
  35. if (str.length < 6) {
  36. lvl--;
  37. }
  38. return lvl;
  39. }
  40. </script>

案例九:DOM下的省市联动

  1. window.onload = function () {
  2. var datas = {
  3. "吉林": ["长春", "四平", "松原"],
  4. "山东": ["青岛", "济南", "烟台"],
  5. "山西": ["大同", "太原", "运城"]
  6. };
  7. var defult = '山东';
  8. //把省份加载到第一个下拉框中
  9. var s1 = document.getElementById('se1');
  10. for (var key in datas) {
  11. var opt1 = document.createElement('option');
  12. opt1.innerText = key;
  13. opt1.value = key;
  14. opt1.selected = key == defult ? true : false;
  15. s1.appendChild(opt1);
  16. }
  17. //把对应的城市加载到第二个下拉框中
  18. var se2 = document.getElementById('se2');
  19. for (var i = 0; i < datas[defult].length; i++) {
  20. var opt2 = document.createElement('option');
  21. opt2.value = datas[defult][i];
  22. opt2.innerText = datas[defult][i];
  23. se2.appendChild(opt2);
  24. }
  25. //注册一个第一个select的Change时间
  26. se1.onchange = function () {
  27. while (se2.firstChild) {
  28. se2.removeChild(se2.firstChild);//用一个循环和removeChild来清空
  29. }
  30. for (var i = 0; i < datas[this.value].length; i++) {
  31. var opt3 = document.createElement('option');
  32. opt3.innerText = datas[this.value][i];
  33. opt3.value = datas[this.value][i];
  34. se2.appendChild(opt3);
  35. }
  36.  
  37. };
  38. }

案例十:DOM的权限管理

  1. window.onload = function () {
  2. document.getElementById('toAllLeft').onclick = function () {
  3. allLeftToRight(document.getElementById('se1'), document.getElementById('se2'));
  4. };
  5. document.getElementById('toAllRight').onclick = function () {
  6. allLeftToRight(document.getElementById('se2'), document.getElementById('se1'));
  7. };
  8. function allLeftToRight(s1, s2) {
  9. var opts = s1.getElementsByTagName('option');
  10. for (var i = opts.length - 1; i >= 0; i--) {
  11. s2.insertBefore(opts[i], s2.firstChild); //这里要注意 用的不是.appendchild
  12. }
  13. };
  14. //===========================
  15. document.getElementById('toRight').onclick = function () {
  16. LeftToRight(document.getElementById('se1'), document.getElementById('se2'));
  17. };
  18. document.getElementById('toLeft').onclick = function () {
  19. LeftToRight(document.getElementById('se2'), document.getElementById('se1'));
  20. };
  21. function LeftToRight(s1, s2) {
  22. var opts = s1.getElementsByTagName('option');
  23. for (var i = 0; i < opts.length; i++) {
  24. if (opts[i].selected) {
  25. s2.appendChild(opts[i]);
  26. i--;//因为把select1里面的元素移动后 元素个数发生了变化,所以需要I--
  27. }
  28. }
  29. }
  30. };
  1. <body>
  2. <div style="margin-left: 400px; margin-top: 10px;">
  3. <select multiple="multiple" style="float: left; width: 40px; height: 100px;" id="se1">
  4. <option>添加</option>
  5. <option>删除</option>
  6. <option>修改</option>
  7. <option>查询</option>
  8. <option>打印</option>
  9. </select>
  10. <div style="width: 50px; float: left;">
  11. <input type="button" name="name" value=">" style="width: 50px;" id="toRight" />
  12. <input type="button" name="name" value="<" style="width: 50px;" id="toLeft" />
  13. <input type="button" name="name" value=">>" style="width: 50px;" id="toAllLeft" />
  14. <input type="button" name="name" value="<<" style="width: 50px;" id="toAllRight" />
  15. </div>
  16. <select multiple="multiple" style="float: left; width: 40px; height: 100px;" id="se2">
  17. </select>
  18. </div>
  19. </body>

下午继续写jQuery的总结,过年之前把这些东西都总结一下,希望自己的学习能慢慢进入正轨,希望新年快乐 ^_^

js,jQuery和DOM操作的总结(一)的更多相关文章

  1. js,jQuery和DOM操作的总结(二)

    jQuery的基本操作 (1)遍历键值对和数组 , , , , , ]; $.map(arr, function (ele, index) { alert(ele + '===' + index); ...

  2. jQuery的DOM操作详解

    DOM(Document Object Model-文档对象模型):一种与浏览器, 平台, 语言无关的规则, 使用该接口可以轻松地访问页面中所有的标准组件DOM操作的分类 核心-DOM: DOM Co ...

  3. 第3章 jQuery的DOM操作

    一.  DOM 分为DOM核心,HTML-DOM和CSS-DOM 1.DOM核心 不专属与javascript. 获取对象:document.getElementsByTagName('div') 获 ...

  4. jQuery – 3.JQuery的Dom操作

    3.1 JQuery的Dom操作     1.使用html()方法读取或者设置元素的innerHTML    2.使用text()方法读取或者设置元素的innerText     3.使用attr() ...

  5. js中的DOM操作汇总

    一.DOM创建 DOM节点(Node)通常对应于一个标签,一个文本,或者一个HTML属性.DOM节点有一个nodeType属性用来表示当前元素的类型,它是一个整数: Element,元素 Attrib ...

  6. Jquery所有Dom操作汇总

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 解密jQuery内核 DOM操作

    jQuery针对DOM操作的插入的方法有大概10种 append.prepend.before.after.replaceWith appendTo.prependTo.insertBefore.in ...

  8. 03-老马jQuery教程-DOM操作

    jQuery DOM操作 在没有jQuery之前,DOM的操作相对来说有点麻烦,尤其是DOM节点的搜索.目前我们已经学习了jQuery的选择器,接下带大家一块学习jQuery的DOM操作,jQuery ...

  9. HTML 学习笔记 JQuery(DOM 操作)

    一般来说,DOM操作分为三个方面,即:DOM Core(核心), HTML_DOM 和 CSS_DOM. 1.DOM Core DOM Core 并不专属于JavaScript,任何一种支持DOM的程 ...

随机推荐

  1. C++实现四叉树

    什么是四叉树? 四叉树可以有效解决这个问题. 四叉树每一层都把地图划分四块,根据地图尺寸来决定树的层数,层数越大划分越细. 但需要对某一范围的单位筛选时,只需要定位到与范围相交的树区域,再对其区域内的 ...

  2. js中实现继承的几种方式

    首先我们了解,js中的继承是主要是由原型链实现的.那么什么是原型链呢? 由于每个实例中都有一个指向原型对象的指针,如果一个对象的原型对象,是另一个构造函数的实例,这个对象的原型对象就会指向另一个对象的 ...

  3. Mycat中的核心概念

      Mycat中的核心概念     Mycat中的核心概念 1.数据库中间件    Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有 存储引擎,所以并 ...

  4. C#中如何给PDF添加可见的数字签名

    数字签名广泛用于保护PDF文档,可见数字签名在日常生活中是相当重要的.在这篇文章中我将与大家分享如何给PDF文件添加可见的数字签名. 首先我下载了一个由E-iceblue公司开发的免费版的PDF组件- ...

  5. 老李推荐:第2章2节《MonkeyRunner源码剖析》了解你的测试对象: NotePad窗口Activity之NotesList简介

    老李推荐:第2章2节<MonkeyRunner源码剖析>了解你的测试对象: NotePad窗口Activity之NotesList简介   NotePad窗口Activity之NotesL ...

  6. (转)JAVA多线程和并发基础面试问答

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  7. sublimeText3插件安装

    1,官方下载sublimeText 3(百度搜索) 2,安装成功后按Ctrl+`调出console 3,然后输入 import urllib.request,os; pf = 'Package Con ...

  8. quartus ii中仿真rom时遇到的问题(待完善)

    1.modelsim仿真只支持.hex,并不支持.mif(Memory Initialzation File). 2.在Matlab中生成.mif文件,然后再quartus中打开,转换为hex格式后另 ...

  9. 变态版大鱼吃小鱼-基于pixi.js 2D游戏引擎

    之前用CSS3画了一条

  10. OpenDigg安卓开源项目月报201704

    由OpenDigg 出品的安卓开源项目月报第一期来啦.我们的安卓开源月报集合了OpenDigg一个月来新收录的优质安卓开源项目,方便安卓开发人员便捷的找到自己需要的项目工具. DiscreteScro ...