在get方式用URL傳中文的時候若是不轉碼的話,在後臺接收參數的會出現亂碼問題。javascript
因此在要傳的中文encodeURI("參數","UTF-8"); 進行轉碼, 後臺直接getParameter就OK!css
ajax優勢:
1.無刷新更新數據
2.異步與服務器通訊
3.前端後端負載平衡
4.基於標準被普遍支持
5.界面與應用分離html
ajax缺點:
1.ajax幹掉了back和history功能,即對瀏覽器機制的破壞
2.ajax的安全問題
3.對搜索引擎支持較弱
4.破壞程序的異常處理機制
5.違背url和資源定位的初衷
6.ajax不能很好的支持移動設備
7.客戶端過肥,太多客戶端代碼形成開發上的成本 ajax的原理:Ajax的原理簡單來講經過XmlHttpRequest對象來向服務器發異步請求,從服務器得到數據,而後用javascript來操做DOM而更新頁面 get和post區別:前端
1. get是從服務器上獲取數據,post是向服務器傳送數據。
2. get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中能夠看到。post是經過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一塊兒傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
3. 對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。
4. get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,通常被默認爲不受限制。但理論上,IIS4中最大量爲80KB,IIS5中爲100KB。
5. get安全性很是低,post安全性較高。可是執行效率卻比Post方法好。
建議:
一、get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數據提交方式;
二、在作數據查詢時,建議用Get方式;而在作數據添加、修改或刪除時,建議用Post方式;
var url = "http://localhost:8080/crcp/rcp/t99eidt/testjson.do?jsonp=callbackfunction"; var script = document.createElement('script'); script.setAttribute('src', url); //load javascript document.getElementsByTagName('head')[0].appendChild(script); //回調函數 function callbackfunction(data){ var html=JSON.stringify(data.RESULTSET); alert(html);
<!doctype html> <html> <head> <title>省市聯動</title> <meta charset = "utf-8"/> </head> <style type="text/css"> </style> <script type="text/javascript"> //省市聯動 var cityArr=[ { "name":"北京", "city":[ { "ID":0101, "name":"海淀" }, { "ID":0102, "name":"昌平" }, ] }, { "name":"上海", "city":[ { "ID":0211, "name":"浦東" }, { "ID":0212, "name":"閘北" }, ] }, { "name":"天津", "city":"天津" }, { "name":"重慶", "city":"重慶" }, { "name":"陝西", "city": [ { "ID":029, "name":"西安" }, { "ID":0911, "name":"延安" }, { "ID":0912, "name":"榆林" }, { "ID":0913, "name":"渭南" }, { "ID":0914, "name":"商洛" }, { "ID":0915, "name":"安康" }, { "ID":0916, "name":"漢中" }, { "ID":0917, "name":"寶雞" },{ "ID":0919, "name":"銅川" }, { "ID":0910, "name":"咸陽" }, ] } ]; function showProviceFun(){ var province = document.getElementById("proviceSelect"); province.length = 0; for(var i=0;i<cityArr.length;i++){ var option = document.createElement("option"); option.value = cityArr[i].name; option.innerHTML = cityArr[i].name; province.appendChild(option); } } function showCity(){ var temp = document.getElementById("proviceSelect"); var city = document.getElementById("citySelect"); city.length = 0; for(var i=0;i<cityArr.length;i++){ if(temp.value==cityArr[i].name){ for(var j=0;j<cityArr[i].city.length;j++){ var option = document.createElement("option"); option.value = cityArr[i].city[j].name; option.innerHTML = cityArr[i].city[j].name; city.appendChild(option); } } } } </script> <body onload="showProviceFun()" > <select id="proviceSelect" onchange="showCity()"> <option>==省==</option> </select>省: <select id="citySelect"> <option>==市==</option> </select>市: </body> </html>
$("#all").click(function(){ if(this.checked){ $("#list :checkbox").prop("checked", true); }else{ $("#list :checkbox").prop("checked", false); } });
// 方法一:
var arr1 =[1,2,2,2,3,3,3,4,5,6], arr2 = []; for(var i = 0,len = arr1.length; i< len; i++){ if(arr2.indexOf(arr1[i]) < 0){ arr2.push(arr1[i]); } } document.write(arr2); // 1,2,3,4,5,6
//放法二
var res = []; var json = {}; for(var i = 0; i < this.length; i++){ if(!json[this[i]]){ res.push(this[i]); json[this[i]] = 1; } } return res; } var arr = [112,112,34,'你好',112,112,34,'你好','str','str1']; alert(arr.unique3());
JavaScript中全部的量都是存在於某一個做用域中的 除了全局做用域, 每個做用域都是存在於某個做用域中的 在試圖訪問一個變量時JS引擎會從當前做用域開始向上查找直到Global全局做用域中止 例如 10 var A;//全局做用域 function B() { var C;//C位於B函數的做用域 function D() { var E;//E位於D函數的做用域 alert(A) } } 當alert(A)時, JS引擎沿着D的做用域, B的做用域, 全局做用域的順序進行查找. 這三個做用域組成的有序集合就成爲做用域鏈 至於爲何叫鏈, 你能夠理解和鏈表有類似之處, 深層的做用域會可以訪問到上層做用域, 就如同鏈表中兩個連續節點可以單向訪問同樣
RegExp 對象
RegExp 對象表示正則表達式,它是對字符串執行模式匹配的強大工具。
直接量語法
/pattern/attributes建立 RegExp 對象的語法:
new RegExp(pattern, attributes);
參數
參數 pattern 是一個字符串,指定了正則表達式的模式或其餘正則表達式。
參數 attributes 是一個可選的字符串,包含屬性 "g"、"i" 和 "m",分別用於指定全局匹配、區分大小寫的匹配和多行匹配。ECMAScript 標準化以前,不支持 m 屬性。若是 pattern 是正則表達式,而不是字符串,則必須省略該參數。
RegExp 對象方法
FF: Firefox, IE: Internet Explorer
方法 描述 FF IE
compile 編譯正則表達式。 1 4
exec 檢索字符串中指定的值。返回找到的值,並肯定其位置。 1 4
test 檢索字符串中指定的值。返回 true 或 false。 1 4
支持正則表達式的 String 對象的方法
FF: Firefox, IE: Internet Explorer
方法 描述 FF IE
search 檢索與正則表達式相匹配的值。 1 4
match 找到一個或多個正則表達式的匹配。 1 4
replace 替換與正則表達式匹配的子串。 1 4
split 把字符串分割爲字符串數組。 1 4
sessionStorage 、localStorage 和 cookie 之間的區別
共同點:都是保存在瀏覽器端,且同源的。java
區別:cookie數據始終在同源的http請求中攜帶(即便不須要),即cookie在瀏覽器和服務器間來回傳遞;cookie數據還有路徑(path)的概念,能夠限制cookie只屬於某個路徑下。存儲大小限制也不一樣,cookie數據不能超過4k,同時由於每次http請求都會攜帶cookie,因此cookie只適合保存很小的數據,如會話標識。ajax
而sessionStorage和localStorage不會自動把數據發給服務器,僅在本地保存。sessionStorage和localStorage 雖然也有存儲大小的限制,但比cookie大得多,能夠達到5M或更大。正則表達式
數據有效期不一樣,sessionStorage:僅在當前瀏覽器窗口關閉前有效,天然也就不可能持久保持;localStorage:始終有效,窗口或瀏覽器關閉也一直保存,所以用做持久數據;cookie只在設置的cookie過時時間以前一直有效,即便窗口或瀏覽器關閉。json
做用域不一樣,sessionStorage不在不一樣的瀏覽器窗口中共享,即便是同一個頁面;localStorage 在全部同源窗口中都是共享的;cookie也是在全部同源窗口中都是共享的。Web Storage 支持事件通知機制,能夠將數據更新的通知發送給監聽者。Web Storage 的 api 接口使用更方便。後端
本地對象是ECMA官方定義好的對象;內置對象也是本地對象,只包括Global對象和Math對象;宿主對象包括BOM和DOM對象。
1. 本地對象
本地對象包括以下內容:Object、Function、String、Array、Boolean、Number、Date、 RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError。由此可知,本地對象是ECMA-2定義的類(引用類型)。
2. 內置對象
ECMA-262把內置對象(built-in object)定義爲「 由ECMAScript實現提供的,獨立與宿主環境的全部對象,在ECMAScript程序開始執行時出現」。這意味着開發者沒必要明確實例化內置對象,它已經被實例化了。ECMA只定義了兩個內置對象,即Global和Math(它們也是本地對象,根據定義,全部內置對象都是本地對象)。
3. 宿主對象
全部非本地對象都是宿主對象(host Object),即由ECMAScript實現的宿主環境提供的對象。
全部的BOM和DOM對象都是宿主對象。
JS 數據類型轉換 方法主要有三種 轉換函數、強制類型轉換、利用js變量弱類型轉換。 1. 轉換函數: js提供了parseInt()和parseFloat()兩個轉換函數。前者把值轉換成整數,後者把值轉換成浮點數。只有對String類型調用這些方法,這兩個函數才能正確運行;對其餘類型返回的都是NaN(Not a Number)。 2. 強制類型轉換 還可以使用強制類型轉換(type casting)處理轉換值的類型。使用強制類型轉換能夠訪問特定的值,即便它是另外一種類型的。 ECMAScript中可用的3種強制類型轉換以下: Boolean(value)——把給定的值轉換成Boolean型; Number(value)——把給定的值轉換成數字(能夠是整數或浮點數); String(value)——把給定的值轉換成字符串。 用這三個函數之一轉換值,將建立一個新值,存放由原始值直接轉換成的值。這會形成意想不到的後果。 當要轉換的值是至少有一個字符的字符串、非0數字或對象(下一節將討論這一點)時,Boolean()函數將返回true。若是該值是空字符串、數字0、undefined或null,它將返回false。 3. 利用js變量弱類型轉換 舉個小例子,一看,就會明白了。 <script> var str= '012.345 '; var x = str-0; x = x*1; </script>
如何判斷js中的數據類型:typeof、instanceof、 constructor、 prototype方法比較
如何判斷js中的類型呢,先舉幾個例子:
var a = "iamstring.";
var b = 222;
var c= [1,2,3];
var d = new Date();
var e = function(){alert(111);};
var f = function(){this.name="22";};
最多見的判斷方法:typeof
alert(typeof a) ------------> string
alert(typeof b) ------------> number
alert(typeof c) ------------> object
alert(typeof d) ------------> object
alert(typeof e) ------------> function
alert(typeof f) ------------> function
其中typeof返回的類型都是字符串形式,需注意,例如:
alert(typeof a == "string") -------------> true
alert(typeof a == String) ---------------> false
另外typeof 能夠判斷function的類型;在判斷除Object類型的對象時比較方便。
判斷已知對象類型的方法: instanceof
alert(c instanceof Array) ---------------> true
alert(d instanceof Date)
alert(f instanceof Function) ------------> true
alert(f instanceof function) ------------> false
注意:instanceof 後面必定要是對象類型,而且大小寫不能錯,該方法適合一些條件選擇或分支。
根據對象的constructor判斷: constructor
alert(c.constructor === Array) ----------> true
alert(d.constructor === Date) -----------> true
alert(e.constructor === Function) -------> true
注意: constructor 在類繼承時會出錯
eg,
function A(){};
function B(){};
A.prototype = new B(); //A繼承自B
var aObj = new A();
alert(aobj.constructor === B) -----------> true;
alert(aobj.constructor === A) -----------> false;
而instanceof方法不會出現該問題,對象直接繼承和間接繼承的都會報true:
alert(aobj instanceof B) ----------------> true;
alert(aobj instanceof B) ----------------> true;
言歸正傳,解決construtor的問題一般是讓對象的constructor手動指向本身:
aobj.constructor = A; //將本身的類賦值給對象的constructor屬性
alert(aobj.constructor === A) -----------> true;
alert(aobj.constructor === B) -----------> false; //基類不會報true了;
通用但很繁瑣的方法: prototype
alert(Object.prototype.toString.call(a) === ‘[object String]’) -------> true;
alert(Object.prototype.toString.call(b) === ‘[object Number]’) -------> true;
alert(Object.prototype.toString.call(c) === ‘[object Array]’) -------> true;
alert(Object.prototype.toString.call(d) === ‘[object Date]’) -------> true;
alert(Object.prototype.toString.call(e) === ‘[object Function]’) -------> true;
alert(Object.prototype.toString.call(f) === ‘[object Function]’) -------> true;
js檢測一個變量是string類型的方法:function a(obj){
return typeof(obj)=="string";api
}