JS、JQ相關小技巧積攢,以備不時之需。 1.js 獲取時間差:時間戳相減。new Date().getTime() 獲得毫秒數,除以(1000*60*60*24) 獲得天數。 2.重定向操作:頁面重定向:window.location.href="http://..."即可(本頁頁面跳轉)。 3. ...
JS、JQ相關小技巧積攢,以備不時之需。
1.js 獲取時間差:時間戳相減。new Date().getTime() 獲得毫秒數,除以(1000*60*60*24) 獲得天數。
2.重定向操作:頁面重定向:window.location.href="http://..."即可(本頁頁面跳轉)。
3.js立即執行函數,window.onload = function, $(document).ready({})區別 以及 執行時機 以及 先後順序。
4.前臺form表單的提交方式有很多種,例如:
1. form表單submit直接提交的方法
2. Ajax提交的方法 $("form").serialize() 不能提交file文件,如果要表單元素的值包含到序列字元串中,元素必須使用 name 屬性
3. jquery提交的方法
4. 原生js提交的方法 document.forms["importFileForm"].submit();
5. 提交附件
前端用 FormData
var formdata = new FormData();
formdata.append("key","value");
如果提交form則 var formdata = new FormData($("#form1")[0]); // 註意構造器參數是Dom對象不是jq對象
後端用 FormCollection
public ActionResult xxaction(FormCollection form)
{
var xx = form["xx"] + "";
//獲取客戶端上傳的文件集合,即使沒有附件上傳files.Count也大於0,只要表單存在<input type='file' />
HttpFileCollection files = System.Web.HttpContext.Current.Request.Files;
}
Ajax使用FormData向後臺傳參數時,在ajax參數中加上:
contentType:false,
processData:false
6. js通配符選擇器:
^= 以什麼開頭
$= 以什麼結尾
*= 包含什麼
7. js數組與字元串相互轉換
數組轉字元串:var arr = new Array(a,b,c,d); arr.join(",");
字元串轉數組:var str = "abcd"; str.split("");
8. 數組添加元素
var arr = [];
arr.push():// 元素插入數組尾部,返回數組新長度
arr.unshift(): //元素插入數組頭部,返回數組新長度
arr.splice(index,item)://元素插入數組指定索引處
9.
$.get("/QM_Price/CheckAtcost",{ "vrid": $("#bjmb").attr("vrid") },function (data) { if (data == "Y") { noAtcost = false; }});
$.post()
都是非同步提交,所以要立即用返回值的情況不能使用此種方法,需要用ajax的同步提交async:false;
10. 數組與對象深拷貝 產生副本的是深拷貝,傳遞本身的是淺拷貝
數組:
淺拷貝:
var arr1 = [1,2,3,4];
var arr2 = arr1;
console.log(arr2) // [1,2,3.4];
arr1[1] = 5;
console.log(arr2) // [1,5,3,4];
深拷貝:
var arr2 = arr1.slice(0); // 選擇一個數組並返回一個副本
slice(start,end) start必填,end不填預設是數組結尾 上式表示將數組元素都選了。
var arr2 = [].concat(arr1);// 連接一個空數組並返回一個副本
concat參數可以是任意多個數組或者值 arr1.concat(4,5)的值為 [1,2,3,4,4,5];
對象:
淺拷貝:
var obj1 = {"name":"a","age":10};
var obj2 = obj1;
obj1["name"] = "b";
console.log(obj2.name) // "b"
深拷貝:
obj2 = JSON.parse(JSON.stringify(obj1)) ;// 格式化輸出對象
JSON.stringify():格式化json字元串,有三個參數:
value:值,需要格式化的json串
raplace:可選,可以是方法,也可以是數組,一般寫null,作用:可以對json串進行操作,比如大小寫轉換
space:分隔符,數字0-10表示縮進幾個字元。轉義字元:\t表示回車。字元串,表示用什麼分割
JSON.parse():將json字元串轉換成對象
11. 篩選器問題
$("input[name='xx'][id='yy']") 兩個[]連一起,表示的是求交集——a且b
$("input[name='xx'],input[name='yy']") 逗號表示並集——a或b(a和b)
12. iE瀏覽器相容性問題:
不支持 => 表達式,所以不能用forEach()方法來遍曆數組,拉姆達表達式是ES6的東西
不支持 ` 符號(模板字元串),js字元串多行問題。這個是ES6的特性
字元串多行問題解決:\ 使用反斜杠,如果寫html片段,註意裡面的屬性值用單引號 ' ,用到雙引號的地方使用 \" 來轉義。
13. hasOwnProperty(key):判斷一個對象里是否包含該key值。
14. jQuery.extend(true, {}, data[i]):對象深拷貝
15.查看項目種jq 的版本:alert('jQuery版本:' + $.fn.jquery); 是否引入了jq:typeof jQuery == undefined
16. jq.html() 方法,返回元素的html,不包括本身,第一個子元素的html。
17. $.fn.load = function(params...){},重寫jquery的load函數。
fn是函數的原型成員,在js中,每個函數都有兩個對象,一個是函數對象,即函數本身,一個是原型對象。函數的prototype方法指向這個原型對象。
18. var start = new Date($("#BeginDate").datebox("getValue").replace(/-/g, "/"));// ‘-’在ie瀏覽器中不能被識別成日期格式在chrome中可以。 ‘/’瀏覽器通用。
19. js中浮點型的0 等於 "",等於false
var a = 0;
console.log(a == "") // true
console.log(a == false) // true
20. jq offset():只能得到display不為none的元素的值,為none則offset():{top:0,left:0}
21. ajax提交後臺的時候,數組無法直接提交,提交後後臺得不到數組或者字元串,得到一個null,用JSON.stringify(); 或者:traditional: true。
22. ie瀏覽器緩存問題:ajax每次請求後臺時請求參數相同時,瀏覽器緩存機制會不再次請求後臺,直接讀取上一次的數據,所以每次改一下請求參數即可:
data: {
param: Math.random()// ie瀏覽器緩存,每次請求參數不一致即可
}
23. form表單裡面的button 點擊不刷新頁面 type='button'
24. NaN 、"" 、 0 、false 、null 、undefined 這6個值是js的6個假值,取反都是true,除了這幾個,其它都是false。
25. history.back();--點擊瀏覽器的回退按鈕
history.go(-1);--等同於history.back(),
如果想要回退的同時再刷新以下頁面,則以上方法不可取,可用以下方法:
window.location.href=document.referrer
26.判斷ie版本:
"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Tablet PC 2.0)"
var useragent = navigator.userAgent;//瀏覽器自帶字串
var re = new RegExp("MSIE (\\d+\\.\\d+)");
re.test(useragent);
RegExp.$1;
RegExp 是javascript中的一個內置對象。為正則表達式,RegExp.$1(RegExp["$1"])是RegExp的一個屬性,指的是與正則表達式匹配的第一個子匹配(以括弧為標誌)字元串:
var r= /^(\d{4})-(\d{1,2})-(\d{1,2})$/; //正則表達式 匹配出生日期(簡單匹配)
r.exec('1985-10-15');
s1=RegExp.$1;
s2=RegExp.$2;
s3=RegExp.$3;
alert(s1+" "+s2+" "+s3)//結果為1985 10 15
正則里有一個 lastIndex 的屬性,是下一次匹配的開始位置,test()匹配之後,lastIndex的值是下一次匹配開始的位置
27.判斷是否ie
if ("ActiveXObject" in window) {
console.log("你是ie..");
} else {
console.log("你不是");
}
28.判斷是否ie,並且返回版本信息
function IEVersion() {
// 取得瀏覽器的userAgent字元串
var userAgent = navigator.userAgent;
// 判斷是否為小於IE11的瀏覽器
var isLessIE11 = userAgent.indexOf('compatible') > -1 && userAgent.indexOf('MSIE') > -1;
// 判斷是否為IE的Edge瀏覽器
var isEdge = userAgent.indexOf('Edge') > -1 && !isLessIE11;
// 判斷是否為IE11瀏覽器
var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf('rv:11.0') > -1;
if (isLessIE11) {
var IEReg = new RegExp('MSIE (\\d+\\.\\d+);');
// 正則表達式匹配瀏覽器的userAgent字元串中MSIE後的數字部分,,這一步不可省略!!!
IEReg.test(userAgent);
// 取正則表達式中第一個小括弧里匹配到的值
var IEVersionNum = parseFloat(RegExp['$1']);
if (IEVersionNum === 7) {
// IE7
return 7
} else if (IEVersionNum === 8) {
// IE8
return 8
} else if (IEVersionNum === 9) {
// IE9
return 9
} else if (IEVersionNum === 10) {
// IE10
return 10
} else {
// IE版本<7
return 6
}
} else if (isEdge) {
// edge
return 'edge'
} else if (isIE11) {
// IE11
return 11
} else {
// 不是ie瀏覽器
return -1
}
}
29. 是否聲明DTD:
控制台輸入:document.compatMode
顯示 CSS1Compat:已聲明
30.http跨域+cookie跨功能變數名稱
http跨域:
什麼是跨域請求?
瀏覽器同源策略的限制(訪問同源的資源是被瀏覽器允許的,但是如果訪問不同源的資源,瀏覽器預設不允許。訪問不同源的資源就叫做跨域)
什麼是同源策略(Same Origin Policy)?
同源策略,是瀏覽器的一種核心最基本的安全策略。它對來之不同遠的文檔或腳本對當前文檔的讀寫操作做了限制。
同源,即協議相同,功能變數名稱相同,埠相同
為什麼會有跨域問題?
跨域問題只出現在瀏覽器訪問的頁面,因為這是瀏覽器為了保戶用戶安全而製造的策略。假如沒有這層保護,網站就很容易受到跨站偽造請求(CSRF)的攻擊
瀏覽器cookie 不能跨功能變數名稱,而不是不能跨域,即同一個IP地址,不同埠(跨域)共用一個cookie。