【JS】知識筆記

1、JS文件位置

  • 多個.JS文件最好合併到一個文件中,減小加載頁面時發送的請求數量。
  • 某個單獨頁面須要的js,最好放在HTML文檔的最後,</body>以前,這樣能使瀏覽器更快地加載頁面。先加載完界面,再執行腳本,不至於先執行復雜腳本帶來的頁面顯示不全。
  • 侵入式與非侵入式JavaScript

  侵入式JavaScriptjavascript

jQuery出現之前,在同一個文件中混雜JavaScript代碼和HTML標記是很是流行的作法。將JavaScript代碼做爲某個特性的值放入HTML元素中是很常見的,如如下代碼:html

<div onclick="javascript:alert('click');">Testing, testing</div>

  非侵入式JavaScript前端

jQuery改變了這種狀況,由於jQuery提供了查找元素和捕獲單擊事件更好的方法。如今能夠從HTML特性中移除JavaScript代碼了。事實上,能夠將javascript代碼與HTML徹底分離java

即便查看視圖渲染的HTML標記,也看不到任何的javascript代碼,腳本留下的惟一的痕跡是一個或多個引用javascript文件的<script>標籤。jquery

 

2、JS判斷是否爲空

  •  方法一
var keyVal= $("#key").val();  

if(keyVal==undefined || keyVal=="" || keyVal==null){  

     alert("隱藏域的值爲空");  

}  

此方法效率不高,不建議。chrome

  • 方法二
var keyVal= $("#key").val();  

if(keyVal.length==0){  

     alert("隱藏域的值爲空");  

} 

此方法效率高。json

3、JS中的text(),html() ,val()的區別

  text()和html()均可以用於元素文本的存取,可是html()不只能夠用於元素文本的存取,還能夠用於元素節點的存取。後端

  val()不一樣於text()和html(),val()用於input節點內容的存取數組

1. text()瀏覽器

<div>text</div>

var text = $("div").text();   //div元素

console.log(text);

console:text

 2. html()

<div><p>text</p></div>

var str = $("div").html();

console.log(str);

console:<p>text</p>  //取到了元素節點

 3. val()

<input type="text" value="text"/>

var str = $("input").val();   //只用於input元素

console.log(str);

console:text

4、JS中得到Webconfig的配置信息

var  timer= (<%=System.Web.Configuration.WebConfigurationManager.AppSettings["homeTimer"]%>);

setTimeout('myrefresh()', timer); //指定x秒刷新一次

5、JS中把任意數字轉爲二進制數

二進制輸出:toString函數

  var m=3;

  m.toString(2);

     結果 "11"

NumberObject.toString(radix)

Radix:規定表示數字的基數,使 2 ~ 36 之間的整數。若省略該參數,則使用基數 10

6、JS中生成GUID

function  newGuid()
{
    var guid = "";
    for (var i = 1; i <= 32; i++){
      var n = Math.floor(Math.random()*16.0).toString(16);
      guid +=   n;
      if((i==8)||(i==12)||(i==16)||(i==20))
        guid += "-";  //可不要
    }
    return guid;    
}

7、JS中判斷是否爲數字

  完整方法,採用正則:

var r=/^[1-9][0-9]+$/gi;
document.writeln(r.test("011"));//false
document.writeln(r.test("11"));//true 

  按照特定需求來定正則:

若輸入的首位能夠是0,則  var r=/^[0-9]+$/gi;

若輸入的能夠爲空,則 var r=/^[0-9]*$/gi;

若輸入的能夠爲負數,則var r = /^(-)?([0-9]*)$/i;

若輸入的能夠含小數點【實際上js中Number是能夠爲小數的】,則var r = /^(-)?([0-9]*)(.)?([0-9]{2})$/i;  兩位小數

參考:jquery裏判斷是否爲數字的各類方法及每種方法的優缺點

注意,上面的正則存在:相同的正則屢次調用test()返回的值卻不一樣的問題

舉例:

var reg = /^1[345678][0-9]{9}$/g;
console.log(reg.test(15328044636));
console.log(reg.test(15328044636));

會發現控制檯打印的數據倒是:

true

false

問題緣由:這是由於正則regg屬性,設置的全局匹配RegExp有一個lastIndex屬性,來保存索引開始位置。 

  上面的問題,第一次調用的lastIndex值爲0,到了第二次調用,值變成了11。

解決方案

  • 第一種方案是將g去掉,關閉全局匹配。
  • 第二種就是在每次匹配以前將lastIndex的值設置爲0。
var reg = /^1[345678][0-9]{9}$/g;
console.log(reg.lastIndex, reg.test(15328044636));
reg.lastIndex = 0;
console.log(reg.lastIndex, reg.test(15328044636));

//打印的值
0 true
0 true
View Code

 

8、JS中轉義字符

  最近遇到調接口返回的字符串中含 & ,到界面顯示確成了 &amp; 。

轉義字符:

 

參考:【轉義字符】HTML 字符實體&lt; &gt: &amp;等

 默認狀況下中文,空格,‘&’等字符都會被瀏覽器自動轉義一次

自定義轉換方法:

/**
 * @function escapeHTML 轉義html腳本 < > & " '
 * @param a -
 *            字符串
 */
escapeHTML: function(a){
    a = "" + a;
    return a.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");;
},
/**
 * @function unescapeHTML 還原html腳本 < > & " '
 * @param a -
 *            字符串
 */
unescapeHTML: function(a){
    a = "" + a;
    return a.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/&quot;/g, '"').replace(/&apos;/g, "'");
},
View Code

1,escapeHTML將< > & " '轉成字符實體 
使用場景: 
(1)用戶在頁面中錄入(好比輸入框) <script>alert(2);</script>, js將該內容提交給後端保存 
(2)顯示時,後端將字符串返回前端;js接收到以後: 
a, 使用escapeHTML,將字符串轉爲 &lt;script&gt;alert(2);&lt;/script&gt;此時,瀏覽器將能正確解析,由於瀏覽器接收到實體字符後,轉成對應的尖括號等。 
b, 不使用escapeHTML,瀏覽器一看到<,便認爲是html標籤的開始,直接把剛纔的字符串當腳本執行了,這就是xss漏洞。 

2,unescapeHTML將字符實體轉成< > & " ' 
使用場景: 
後端將已經轉義後的內容顯示到頁面;好比&lt;script&gt;alert(2);&lt;/script&gt; 
js收到後: 
a,前端進行unescapeHTML,則能夠直接dom操做,將標籤顯示到頁面。 
b,前端沒有unescapeHTML,則原樣輸出<script>alert(2);</script>,但此時並無執行。

9、JS中url的應用

  一、打開新窗體【另開窗口】:window.open(url, '_blank');

  二、刷選當前窗口:window.location.reload(); 

    三、刷新當前頂層窗口:window.top.location.reload();   【eg:使用了artDialog 彈出窗口,在窗口上進行操做時,想操做原窗口,須要用window.top】

10、JS中數組去除空值

  有時定義一個數組:var array=[ ]; 而後賦值array=" "; 此時判斷其長度length=1。須要將空字符串刪掉

/**
 * 擴展Array方法, 去除數組中空白數據
 */
Array.prototype.notempty = function() {
    var arr = [];
    this.map(function(val, index) {
        //過濾規則爲,不爲空串、不爲null、不爲undefined,也可自行修改
        if (val !== "" && val != undefined) {
            arr.push(val);
        }
    });
    return arr;
}
View Code

//調用方法
var a = [1, 2, undefined, 4, "", 5, null, 7, 0, 8];
var b = a.notempty();
//輸出b [1, 2, 4, 5, 7, 0, 8]

11、JS中緩存數據Cookie

  一、讀取cookie:var x = document.cookie;

  二、設置cookie:document.cookie="username=John Doe";

  三、刪除cookie:相似設置,document.cookie="username="; 或者設置一個過時的時間

//設置某個key的cookie值
function setCookie(cname,cvalue,exdays){
    var d = new Date();
    d.setTime(d.getTime()+(exdays*24*60*60*1000));
    var expires = "expires="+d.toGMTString();
    document.cookie = cname+"="+cvalue+"; "+expires;
}

//獲取某個特定key的cookie值
function getCookie(cname){
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) {
        var c = ca[i].trim();
        if (c.indexOf(name)==0) { return c.substring(name.length,c.length); }
    }
    return "";
}
function checkCookie(){
    var user=getCookie("username");
    if (user!=""){
        alert("歡迎 " + user + " 再次訪問");
    }
    else {
        user = prompt("請輸入你的名字:","");
          if (user!="" && user!=null){
            setCookie("username",user,30);
        }
    }
}
View Code

更多參考:JavaScript Cookie

 

12、JS中數據序列化與反序列化

須要引入 jquery.json.js

 $(function () {
            var data = {
                orderID: "ModelOrderID",
                pnr: "hello"
            };
            var jsonStr = $.toJSON(data);  //把數組轉換成json字符串
            console.log(jsonStr);
            var json = $.parseJSON(jsonStr);   //將json字符串反序列化爲json對象
            console.log(json);

        })
View Code

分部輸出:

{"orderID":"ModelOrderID","pnr":"hello"}

 

十3、JS中過濾函數$.grep()

$.grep() 函數使用指定的函數過濾數組中的元素,並返回過濾後的數組。

提示:源數組不會受到影響,過濾結果只反映在返回的結果數組中。

$.grep( array, function [, invert ] )

參數

描述

array

Array類型 將被過濾的數組。

function

Function類型 指定的過濾函數。grep()方法爲function提供了兩個參數:其一爲當前迭代的數組元素,其二是當前迭代元素在數組中的索引。

invert

可選。 Boolean類型默認值爲false,指定是否反轉過濾結果。若是參數invert爲true,則結果數組將包含function返回false的全部元素。

如下示例:

var arr =$.grep( [0,1,2], function(n,i){
        return n > 0;
    });
console.log(arr);//[1,2]

var arr =$.grep( [0,1,2], function(n,i){
        return n > 0;
    },true);//返回n<=0的元素
console.log(arr);//[0]
View Code

 

十4、JS中遍歷$().each()和$.each()

  在jquery中,遍歷對象和數組,常常會用到$().each和$.each(),兩個方法。

一、$().each 在dom處理上面用的較多。

若是頁面有多個input標籤類型爲checkbox,對於這時用$().each來處理多個checkbook,例如:

$(「input[name=’ch’]」).each(function(i){
if($(this).attr(‘checked’)==true)
{
//一些操做代碼
}
View Code

回調函數是能夠傳遞參數,i就爲遍歷的索引。

二、遍歷一個數組一般用$.each()來處理

 例如:

$.each([{name:"limeng",email:"xfjylimeng"},{name:"hehe",email:"xfjylimeng"}],function(i,n)
{
alert("索引:"+i+"對應值爲:"+n.name);
});
//參數i爲遍歷索引值,n爲當前的遍歷對象.

var arr1 = [ "one", "two", "three", "four", "five" ];
$.each(arr1, function(){
alert(this);
});
//輸出:one   two  three  four   five

var arr2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
$.each(arr2, function(i, item){
alert(item[0]);
});
//輸出:1   4   7

var obj = { one:1, two:2, three:3, four:4, five:5 };
$.each(obj, function(key, val) {
alert(obj[key]);
});
//輸出:1   2  3  4  5
View Code

 

十5、JS中的元素設置錨點

  錨點其實就是可讓頁面定位到某個位置上的點。在高度較高的頁面中常常見到。

有如下幾種方式:

一、a標籤href=#XX和id來綁定錨點

在html 4.0之前,只有使用 <a> 標籤的 name 屬性才能建立片斷標識符。id 屬性的出現建議用id,由於 id 標識符幾乎能夠用在全部的標籤中。

eg:<a href="#a01"></a>

<p id="a01">練習</p>
<p>練習</p>

很差,頁面會有刷新感

二、 scrollIntoView()

參考:https://blog.csdn.net/qq_38047742/article/details/82621666

Element.scrollIntoView() 方法讓當前的元素滾動到瀏覽器窗口的可視區域內

錨點定位是一個再熟悉不過的操做了,一般會用a標籤href=#XX去實現,不過這樣作,有一個問題,就是頁面會有刷新感,並且地址欄會有變化,F5刷新,則#XXX仍是顯示在地址欄裏,這樣若是要進一步進行有關地址欄url的操做,就不得再也不作些判斷,因此尋找一些新的方法。

若是要求不是很高,scrollIntoView()這個方法就能夠取代傳統錨點定位,它是利用滾動原理,來將相應的元素滾動到但是區域內。

首先須要說明的是,這個方法並無寫入標準,可是大多數主流瀏覽器已經支持或部分支持其功能了,因此能夠放心使用,固然若是有朝一日標準出來了,那就按標準來吧。

  • scrollIntoView實現簡單的錨點定位

將指定元素定位到瀏覽器頂部,底部,中間

element.scrollIntoView(); // 等同於element.scrollIntoView(true)

element.scrollIntoView(alignToTop); // Boolean型參數

element.scrollIntoView(scrollIntoViewOptions); // Object型參數

  scrollIntoViewOptions參數 可選

    若是爲true,元素的頂端將和其所在滾動區的可視區域的頂端對齊。相應的 scrollIntoViewOptions: {block: "start", inline: "nearest"}。這是這個參數的默認值。

    若是爲false,元素的底端將和其所在滾動區的可視區域的底端對齊。相應的scrollIntoViewOptions: {block: "end", inline: "nearest"}。

 三、  jquery animate實現錨點慢慢平滑滾動效果

參考: http://www.javashuo.com/article/p-zufxzdcq-mc.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>js平滑滾動到頂部、底部、指定地方</title> 
<script type="text/javascript" src="http://cdn.staticfile.org/jquery/2.1.1-rc2/jquery.min.js"></script> 
<style> 
.box{ height:200px; width:100%; background:#ccc; margin:10px 0;} 
.location{ position:fixed; right:0; bottom:10px; width:20px; background:#FFC; padding:5px; cursor:pointer;color:#003}; 
</style> 
</head> 
<body> 
<div class="box"></div> 
<div class="box"></div> 
<div class="box"></div> 
<div class="box"></div> 
<div class="box a">產品介紹產品介紹產品介紹產品介紹產品介紹產品介紹產品介紹產品介紹產品介紹產品介紹產品介紹產品介紹產品介紹</div> 
<div class="box"></div> 
<div class="box"></div> 
<div class="box"></div> 
<div class="box"></div> 
<div class="box bottom"></div> 
<div class="location"> 
<p class="scroll_top">返回頂部</p> 
<p class="scroll_a">產品介紹</p> 
<p class="scroll_bottom">滑到底部</p> 
</div> 
<script type="text/javascript"> 
jQuery(document).ready(
    function($){ 
        $('.scroll_top').click(
            function(){
                $('html,body').animate({scrollTop: '0px'}, 800);
            }); 
            $('.scroll_a').click(function(){$('html,body').animate({scrollTop:$('.a').offset().top}, 800);
    }); 
$('.scroll_bottom').click(function(){$('html,body').animate({scrollTop:$('.bottom').offset().top}, 800);}); }); 
</script> 
</body> 
</html>
View Code

四、 瀏覽器兼容性問題

若寫成:

$("body ").animate({

            scrollTop: $('#id-hotel-policy').offset().top - intMinusTopBig

        }, 8, function () {

            // Animation complete.

        });

則在高版本的chrome瀏覽器【67版】和firefox瀏覽器中都不可用。須要改成

$("body,html").animate({

            scrollTop: $('#id-hotel-policy').offset().top - intMinusTopBig

        }, 8, function () {

            // Animation complete.

        });

參考:關於頁面滾動值scrollTop在FireFox與Chrome瀏覽器間的兼容問題

 

 發送到

十6、JS中下拉框的change事件

  HTML:

 <div>
        <select id="selectID">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
            <option value="6">6</option>
        </select>
    </div>
View Code

  JS:

 $(function () {
            $('#selectID').trigger('change'); //移入時 觸發select的change事件,即下面的事件

            //綁定下拉框change事件,當下來框改變時調用 SelectChange()方法
            $("#selectID").change(function () { SelectChange(); });
        });

        function SelectChange() {
            //獲取下拉框選中項的text屬性值
            var selectText = $("#selectID").find("option:selected").text();
            alert(selectText);
            //獲取下拉框選中項的value屬性值
            var selectValue = $("#selectID").val();
            alert(selectValue);
            //獲取下拉框選中項的index屬性值
            var selectIndex = $("#selectID").get(0).selectedIndex;
            alert(selectIndex);
            ////獲取下拉框最大的index屬性值
            var selectMaxIndex = $("#selectID option:last").attr("index");
            alert(selectMaxIndex);
        }
View Code

十7、JS中多張圖片切換(不循環)

思路:

1.先獲取圖片的id

2.定義一個存放多個圖片的數組,並給它一個初始編號 num=0;

3.當點擊圖片時,先讓num自增,而後判斷num的值是否和數組的長度相等,若是相等,就讓num回到0;

4.最後就把arr[num]賦給oImg的src屬性,就能讀取到圖片的路徑了。

//初始化的時候加載參數
    var oImg = $('.left-part').children('img');
    var arr = ['https://dimg04.c-ctrip.com/images/fd/hotel/g4/M09/4B/1C/CggYHlX364OAB964AADVhVE_jjU887_C_800_525_Q70.jpg', 'https://dimg04.c-ctrip.com/images/2002070000002qls70D99_C_800_525_Q70.jpg', 'https://dimg04.c-ctrip.com/images/200g0i00000099f6p39DB_C_800_525_Q70.jpg'];
    var num = 3;
    var index = 0;
    $('#picIndex').text(index+1);
    $('#picNum').text(num);
    oImg.attr('src', arr[index]);
    $('.next-btn').click(function () {
        if (index >= arr.length-1) {
            return false;
        }
        index++;
        $('#picIndex').text(index+1);
        oImg.attr('src', arr[index]);
    });
    $('.pre-btn').click(function () {
        if (index <= 0) {
            return false;
        }
        index--;
        $('#picIndex').text(index + 1);
        oImg.attr('src', arr[index]);
    });
View Code

 

十8、JS中判斷是否含有某class樣式

  if ($(」#div」).attr("class").indexOf("glyphicon-circle-arrow-up") > -1) {

}

 

 

一、my97日期控件

日期控件使用

<div class="el-input el-input--small">
<span style="width:45%;display:inline-block;"> @Html.TextBoxFor(m => m.Request.ArrivalDateStart, new { style = "width:90px", onfocus = "WdatePicker({skin:'wingon',doubleCalendar:true,dateFmt:'yyyy-MM-dd',minDate:'%y/%M/%d',onpicked:function(){Request_ArrivalDateEnd.focus();}})" }) </span><span style="width:45%;display:inline-block;"> @Html.TextBoxFor(m => m.Request.ArrivalDateEnd, new { style = "width:90px", onfocus = "WdatePicker({doubleCalendar:true,dateFmt:'yyyy-MM-dd',minDate:'#F{$dp.$D(\\'Request_ArrivalDateStart\\',{d:0})}',skin:'wingon'})" })</span>
</div>
View Code

注:引入js   <script type="text/javascript" src="@Url.Content("~/Scripts/FRMy97DatePicker/WdatePicker.js")"></script>

開始時間的 onpicked 可要可不要

Request_ArrivalDateStart 是開始時間控件的id,

參考:http://www.my97.net/demo/index.htm

相關文章
相關標籤/搜索