個人筆記,學習JavaScript以來積累的一些常遇問題的方法和總結 不斷更新中... 轉載需註明 不引入第三個變數,調換兩個數的值 熟悉了這樣的寫法,可以少聲明一個變數 x=10;y=8; //法一: x=x y;//x=2,y=8 y=y+x;//y=10,x=2 x=y x;//x=8,y=1 ...
個人筆記,學習JavaScript以來積累的一些常遇問題的方法和總結
不斷更新中...
轉載需註明
不引入第三個變數,調換兩個數的值
熟悉了這樣的寫法,可以少聲明一個變數
x=10;y=8;
//法一:
x=x-y;//x=2,y=8
y=y+x;//y=10,x=2
x=y-x;//x=8,y=10
//法二:
x=x+y; //x=18,y=8
y=x-y; //x=18,y=10
x=x-y; //x=8,y=10
判斷一個數是完全平方數
另一意思是:這個數的開平方是整數
(Math.sqrt(n)+"").indexOf(".")==-1 //為真(找不到小數點)
猜數字游戲
場景特點:
- 當輸入“exit”或猜對就退出,否則一直迴圈輸入
- 退出發生條件有多個且是或者關係
- 每個條件發生時,都有操作執行
- 判斷條件不是 比較全等 無法用switch執行
解決方法:用while實現循壞,條件是true,if..elase實現判斷,break實現退出
var n=parseInt(Math.random()*(9-0+1)+0);
var input;
while(true){
input=prompt("請輸入一個數:");
if(input>n){
alert("數字大了");
}else if(input<n){
alert("數字小了");
}else if(input==n){
alert("猜對了");
break;
}else if(input<"0"||input>"9"){
alert("無效輸入");
}else if(input=="exit"){
alert("放棄了");
break;
}
}
反覆輸入密碼,直到輸入正確
當輸入不正確時,不執行錯誤的操作,但又需要迴圈輸入
while(prompt("請輸入密碼")!=pwd){
alert("密碼錯誤,請重試!");
}
alert("驗證成功");
給一個多位數,分解出它各個位上的數字
var x=54321;//一個五位數
a=parseInt(x/10000);/* 分解出萬位 */
b=parseInt(x%10000/1000);/* 分解出千位 */
c=parseInt(x%1000/100);/* 分解出百位 */
d=parseInt(x%100/10);/* 分解出十位 */
e=parseInt(x%10);/* 分解出個位 */
數組去重/統計個數
用hash數組
var arr=[2,3,4,3,6,4,5,6];
var hash=[];
for(var i=0;i<arr.length;i++){ //去掉重覆,並且統計個數
if(hash[arr[i]]==undefined){
hash[arr[i]]=1;
}else {
hash[arr[i]]++;
}
}
console.log(hash);
arr=[];
for(var key in hash){ //得到去掉重覆後的新數組
arr[arr.length]=(key-=0);
}
console.log(arr);
使字元串變數字的簡單方法
var a=str-0;
獲得滑鼠的事件,並獲取滑鼠離視窗的坐標
var e=window.event||arguments[0];
var x=e.screenX;
var y=e.screenY;
獲取對象的style屬性,解決相容性
if(getComputedStyle){
style=getComputedStyle(this.div);
}else{
style=this.div.currentStyle; //對於IE8
}
兩個對象同用一個函數時,可連續等號
$("li.app_jd").onmouseout=
$("li.service").onmouseout=function(){
this.$("[id$='_items']").style.display="none";
}
在js中修改元素的樣式屬性
在css文件中是斜杠表示的,在js中要把斜杠去掉並把第二個單詞首字母大寫
css:font-size:12px;
js:div.style.fontSize="32px";
將文本內容插入到元素內
作為文本插入到元素
textContent或innerText屬性可以獲取或設置指定元素的文本內容
作為節點方式
創建文本節點 - createTextNode(text)
將文本節點作為子節點
jq中的last選擇器
- :last 與前面是同一個元素
:last-child 是前一個的子元素
#table tr>td:last //最後一行的最後一個td #table tr :last-child //每行的最後一個td
給a綁定click事件
在最後 return false;-->阻止a元素的預設行為(頁面跳轉)
控制動畫的速度:設置相對速度
this.speed=0;//控制速度 this.step=function(){ this.speed++; if(this.speed%2==0){ //執行操作代碼 } }
獲取數組中的最大值和最小值
var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
var maxInNumbers = Math.max.apply(Math, numbers);
var minInNumbers = Math.min.apply(Math, numbers);產生隨機數
基本歸納:
Math.random() 【產生0<=b<1的小數】
Math.random()*(max-min+1)+min 【產生min<=x<(max+1)的小數】
Math.floor(Math.random()*(n+1)) 【產生0<=x<=n的整數】
Math.ceil(n) 【產生>=n的最小整數】
Math.floor(m) 【產生<=m的最大整數】
Math.round(k) 【產生k四捨五入後的整數值】
parseInt(y) 【對y進行取整】
例子:
var a=parseInt(Math.random()*(10-1+1)+1);//1<=a<=10的整數
var b=Math.floor(Math.random());//0
var c=Math.random()*(1-0+1)+0;//0<=c<2 的小數
var a=Math.floor(Math.random()*(1-0+1)+0);//0和1
toFixed方法
number.toFixed(a)
- 返回一個以定點表示法表示的數字的字元串形式
- toFixed預設值是0-->就是取number的整數部分
- a的範圍為0-20,當a是0-20的小數時 取a的整數部分
- 當a不是數字時(字元串、null...)等 a取預設值0
當a不在0-20的範圍內時 會報錯 不在範圍內
parseInt方法
- 取當前字元中整數
- 第一個是數字,將一直找到第一個不是數字的字元,取前面的數字
第一個不是數字 返回空
void 運算符
- void 運算符對任何值返回 undefined(它不是有效值,不會顯示在瀏覽器視窗中)
- 該運算符通常用於避免輸出不應該輸出的值
沒有返回值的函數真正返回的都是 undefined
<a href="javascript:void(window.open('about:blank'))">Click me</a> <a href = "javascript:void(0)" onclick = ""></a>
value、innerHTML、textContent屬性的區別
value
a、用於單標簽:獲取有value屬性的單標簽的 value值
b、用於雙標簽:獲取元素在網頁上此時呈現的內容
eg: select.value -->表示此時select中被選中項的內容
innerHTML:獲取元素內的所有內容(包括文本和子標簽),以字元串的形式
用innerHTML向頁面寫雙標簽時,應該一次寫入,不能分開textContent:獲取標簽內的文本
向數組插入數據
兩種方法:
array.push(data);
array[array.length] = data;
切換變數0和1的方法
分支結構 if..else..
if(a==0){ a=1; }else{ a=0; }
- 三目
公式計算
a=(++a)%2;
關於select的一些操作
var obj = document.getElementById("testSelect"); //定位id
var index = obj.selectedIndex; // 選中索引
var text = obj.options[index].text; // 選中文本
var value = obj.options[index].value; // 選中值
var value = obj.value;// 選中值DOM對象和jq對象的相互轉化
1.DOM轉JQ
$("#orderList").append($(html));//$(html)-->把DOM對象轉換成JQ對象
2.JQ轉DOM:
$("#v")[0];
$("#v").get(0);
外部文件的引用
- js中 尋找圖片 相對路徑-相對於html文件
css中 尋找圖片 相對路徑-相對於該css文件
函數聲明與函數表達式(ES5)
- 函數聲明會預設提前,可以先執行再聲明
函數表達式,執行到var這行時才會解析,只能先聲明再執行
console.log(a());//2 var a=function(){ return 1}; function a(){ return 2}; console.log(a());//1
transition
css3的動畫屬性(transition)可操作 js給元素添加的屬性
jq中hover函數
$('').hover(function(){},function(){});
表示滑鼠進入和離開那一時間發生的事件,
其中兩個函數相當於mouseenter() mouseleave()
jq中把一個對象轉化成get請求需要的參數形式
把一個對象轉換成key1=val1&key2=val2&...
var str=jQuery.param(object);
獲取屏幕寬高
var scrWidth=document.body.scrollWidth;//網頁正文全文寬
var srcHeight=document.body.scrollHeight;//網頁正文全文高
JS中函數的隱含參數
- arguments:代表正在執行的函數和調用它的函數的參數,只有函數開始時才可用
- caller:返回一個對函數的引用,該函數調用了當前函數
- callee:返回正被執行的function對象,也就是所指定的function對象的正文
arguments.length-實參長度;
arguments.callee.length-形參長度
toString()方法
- x.toString()--->把x變成字元串(不能轉化null,underfined...)
- Object.toString()--->輸出對象的類型和名稱
- toString(x)--->輸出x的類型
- String(x)--->把x變成字元串,相當於隱式轉換(所有的都可以轉包括null,underfined)
- toString與String關係:String調用toString
toString與x.valueOf區別:toString包含類型轉換;valueOf不帶類型轉換
將 [類數組對象/偽數組] 變為 [數組類型對象]
類數組對象/偽數組:能通過Array.prototype.slice轉換為真正的數組的帶有length屬性的對象,例如arguments對象,調用getElementsByTagName、document.childNodes之類返回NodeList的對象都屬於偽數組
兩種方法:
lis=Array.prototype.slice.call(lis); //在IE8及之前版本不行
lis=[].slice.call(lis);
| |
//數組(處理後的lis) //類數組對象(前lis)
相容所有瀏覽器都可運行:
function convertToArray(nodes){
var array=null;
try {
array=Array.prototype.slice.call(nodes,0);//針對非IE瀏覽器
}catch(ex){
array=new Array();
for(var i=0,len=nodes.length;i<len;i++){
array.push(nodes[i]);
}
}
return array;
}
例子1:
html:
<ul id="ul">
<li data-i="2">222</li>
<li data-i="4">444</li>
<li data-i="5">555</li>
<li data-i="1">111</li>
<li data-i="3">333</li>
</ul>
對li 依據data-i屬性值排序,見js實現:
var ul=document.getElementById("ul");
var lis=ul.querySelectorAll("li"); //getElementsByTagName方法也是一樣
lis=Array.prototype.slice.call(lis);
lis.sort(function(a,b){
return a.dataset.i-b.dataset.i;
});
for(var i=0,len=lis.length;i<len;i++){
lis[i]='<li data-i='+lis[i].dataset.i+'">'
+lis[i].innerHTML
+'</li>';
}
ul.innerHTML=lis.join("");
例子2:
對無序的形參輸入進行排序
function fun(){
arguments=Array.prototype.slice.call(arguments);
return arguments.sort(function(a,b){
return a - b
});
}
console.log(fun(23,56,1,23,5));
輸出 [1, 5, 23, 23, 56]
用jq遍歷表格的行和列
行:
- 如果我們要選擇第一行,我們可以用 $('tr:eq(0)')
- 如果我們要選擇第N行,我們可以用 $('tr:eq(n-1)')
- 如果我們要選擇奇數行,我們可以用 $('tr:odd')
- 如果我們要選擇偶數行,我們可以用 $('tr:even')
列:
如果我們要選擇第一列並且對其樣式進行改變,我們可以用下麵的語句來實現
$(document).ready(function(){ $('table').find('td').each(function(i){ if(i%4 == 0){ //‘4’代表表格總共有4列,如果區間編號被4整除,那麼它就屬於第一列 $(this).addClass('col_1');} }); });
如果有合併的話我麽可以先迴圈行再迴圈td
$('table tr').each(function(i){ $(this).find("td").each(function(j){ if(j== 9){//第9列 $(this).addClass('word_break'); } }); });
例子:
給一個表格的第0、2...行的0列加上紅色,1列加上藍色,2列加上紅色,3列加上藍色...
$('#tables>tbody>tr:even').each(function(k){
$(this).find("td").each(function(j){
if(j%2 == 0){
$(this).css("background","red");}
if(j%2 == 1){
$(this).css("background","blue");}
});
});
禁止右鍵點擊
$(document).ready(function(){
$(document).bind("contextmenu",function(e){
return false;
});
});
檢測瀏覽器
註: 在版本jQuery 1.4中,$.support 替換掉了$.browser
$(document).ready(function() {
// Target Firefox 2 and above
if ($.browser.mozilla && $.browser.version >= "1.8" ){
// do something
}
// Target Safari
if( $.browser.safari ){
// do something
}
// Target Chrome
if( $.browser.chrome){
// do something
}
// Target Camino
if( $.browser.camino){
// do something
}
// Target Opera
if( $.browser.opera){
// do something
}
// Target IE6 and below
if ($.browser.msie && $.browser.version <= 6 ){
// do something
}
// Target anything above IE6
if ($.browser.msie && $.browser.version > 6){
// do something
}
});
統計元素個數
$(document).ready(function() {
$("p").size();
});
關於網頁的一些屬性
var h = "";
h += " 網頁可見區域寬:"+ document.body.clientWidth+"\n";
h += " 網頁可見區域高:"+ document.body.clientHeight+"\n";
h += " 網頁可見區域寬:"+ document.body.offsetWidth +" (包括邊線和滾動條的寬)"+"\n";
h += " 網頁可見區域高:"+ document.body.offsetHeight +" (包括邊線的寬)"+"\n";
h += " 網頁正文全文寬:"+ document.body.scrollWidth+"\n";
h += " 網頁正文全文高:"+ document.body.scrollHeight+"\n";
h += " 網頁被捲去的上:"+ document.body.scrollTop+"\n";
h += " 網頁被捲去的左:"+ document.body.scrollLeft+"\n";
h += " 網頁正文部分上:"+ window.screenTop+"\n";
h += " 網頁正文部分左:"+ window.screenLeft+"\n";
h += " 屏幕解析度的寬:"+ window.screen.width+"\n";
h += " 屏幕解析度的高:"+ window.screen.height+"\n";
h += " 屏幕可用工作區寬度:"+ window.screen.availWidth+"\n";
h += " 屏幕可用工作區高度:"+ window.screen.availHeight+"\n";
h += " 你的屏幕設置是 "+ window.screen.colorDepth +" 位彩色"+"\n";
h += " 你的屏幕設置 "+ window.screen.deviceXDPI +" 像素/英寸"+"\n";
引用外部文件時,設置編碼格式
<script type="text/javascript" src(引用外部js文件)="xxx.js" charset(設置編碼格式)="utf-8"></script>
從數組中隨機獲取成員
var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var randomItem = items[Math.floor(Math.random() * items.length)];
生成隨機字母數字混合的字元串
function generateRandomAlphaNum(len) {
var rdmString = "";
for( ; rdmString.length < len; rdmString += Math.random().toString(36).substr(2));
return rdmString.substr(0, len);
}
打亂數字數組的順序
var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
numbers = numbers.sort(function(){ return Math.random() - 0.5});
字元串去空格
String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g, "");};
驗證是否是數字
function isNumber(n){
return !isNaN(parseFloat(n)) && isFinite(n);
}
使用length屬性截斷數組
var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ];
myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124]
myArray.length = 0; //清空數組
如果把length屬性變大,數組的長度值會增加,會使用undefined來作為新的元素填充。length是一個可寫的屬性
通過for-in迴圈檢查對象的屬性
可以防止迭代的時候進入到對象的原型屬性中
for (var name in object) {
if (object.hasOwnProperty(name)) {
// do something with name
}
}
用JSON來序列化與反序列化
var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} };
var stringFromPerson = JSON.stringify(person);
/*
stringFromPerson 結果為
'{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}'
*/
var personFromString = JSON.parse(stringFromPerson);
/* personFromString 的值與 person 對象相同 */
JQuery一個對象可以同時綁定多個事件
多個事件同一個函數:
$("div").on("click mouseover", function(){});
多個事件不同函數
$("div").on({ click: function(){}, mouseover: function(){} });