92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

首頁

一篇解決 thymeleaf 下拉選的選中問題

seo達人

說明:本文基于thymeleaf3.x



在做后臺系統時多多少少都會遇到下拉選回顯的問題,本次就總結一下如何利用thymeleaf簡單快速的進行下拉選的回顯。



兩種情況:

1、下拉選的數據固定死了的情況下?

利用 th:field="${要選中的option的value值}" 屬性,如下

<select id="bookKind" name="bookKind" th:field="${book.bookKind}" class="form-control">

        <option value="">請選擇書的種類</option>

        <option value="1">編程語言</option>

        <option value="2">數據庫</option>

        <option value="3">操作系統</option>

        <option value="4">辦公軟件</option>

        <option value="5">圖形處理與多媒體</option>

</select>

         book是請求域中的實體類,當${book.bookKind}的值和 option 的 value值匹配上后,該option就會被選中。



        怎么樣是不是很簡單?如果是用ajax的話,還要先獲取所有的option,循環遍歷,判斷value值是否相等,設置selected屬性值為true,跳出循環,這一系列操作,thymeleaf一個屬性值就搞定,所以孰輕孰重您就看著來吧!哈哈!



2、下拉選的數據沒固定死時?

兩個屬性  th:each="bookKind : ${bookKinds}" th:selected="{bookKind} == ${book.bookKind}" 搞定,如下所示



<select id="bookKind" name="bookKind" class="form-control">

    <option th:each="bookKind : ${bookKinds}" th:selected="
{bookKind} == ${book.bookKind}" 

            th:value="${bookKind}" th:text="${bookKind}"></option>

</select>

        解釋一下,先th:each遍歷,*{bookKind}代表遍歷出來的元素,判斷與點擊的者一欄的bookKind值是否一樣,如果一樣th:selected的值就為true,然后th:value 設置option的value 值,th:text 設置option的文本值。



試想一下,如果是用ajax會怎么樣?1、先后臺獲取數據后,循環append(html標簽) 2、再獲取到當前記錄的這列屬性值,再獲取到 1 中循環設置的option,在比對value值,設置選中,break等。而且第一個ajax還要整成同步的,不然 2 中可能獲取不到 1 中的option元素。



 



最后說明:如果恰巧能解決你的問題,那就動一動您的小手,點個贊或者評論一下,讓我看到你們,您的點贊或評論將會持續帶給我不懈的動力?。?!come on baby!Let's go!

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計  圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

vue-router編程式的導航

seo達人

什么是編程式的導航

除了使用 <router-link> 創建 a 標簽來定義導航鏈接,我們還可以借助 router 的實例方法,通過編寫代碼來實現。



router.push(location, onComplete?, onAbort?)

注意:在 Vue 實例內部,你可以通過 $router 訪問路由實例。因此你可以調用 this.$router.push。



想要導航到不同的 URL,則使用 router.push 方法。這個方法會向 history 棧添加一個新的記錄,所以,當用戶點擊瀏覽器后退按鈕時,則回到之前的 URL。



HTML代碼



<p @click="$router.push('/test/emitView')">跳轉1</p>

<p @click="$router.push({path: '/test/propsView'})">path: '/test/propsView'</p>

<p @click="test">帶參數的跳轉</p>

<p @click="test1">提供了path,params會被忽略</p>

<p @click="$router.push({path: /test/propsView/${userId}})">

    url變為/test/propsView/123

</p>

<p @click="$router.push({path: '/test/propsView', query: {plan: 'private'}})">

    帶參數的url變為/test/propsView?plan=private

</p>

Script中代碼



test () {

    this.$router.push({

        name: 'routerView',

        params: {userId: this.userId, test: 333},

    })

    console.log(this.$route)

    console.log(this.$route.params)

},

test1 () {

    this.$router.push({ // 如果提供了 path,params 會被忽略

        path: 'routerView',

        params: {userId: this.userId, test: 333},

    })

    console.log(this.$route)

    console.log(this.$route.params)

},

router.replace(location, onComplete?, onAbort?)

跟 router.push 很像,唯一的不同就是,它不會向 history 添加新記錄,而是跟它的方法名一樣 —— 替換掉當前的 history 記錄。



router.go(n)

// 在瀏覽器記錄中前進一步,等同于 history.forward()

router.go(1)

 

// 后退一步記錄,等同于 history.back()

router.go(-1)

 

// 如果 history 記錄不夠用,則無反應

router.go(-100)

router.go(100)

router.back()

在瀏覽器記錄中后退一步



router.forward()

在瀏覽器記錄中前進一步


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計  ipad界面設計 、 包裝設計 、 圖標定制  用戶體驗 、交互設計、 網站建設 、平面設計服務

H5之外部瀏覽器喚起微信分享

seo達人

最近在做一個手機站,要求點擊分享可以直接打開微信分享出去。而不是jiathis,share分享這種的點擊出來二維碼。在網上看了很多,都說APP能喚起微信,手機網頁實現不了。也找了很多都不能直接喚起微信。

總結出來一個可以直接喚起微信的。適應手機qq瀏覽器和uc瀏覽器。

下面上代碼,把這些直接放到要轉發的頁面里就可以了:

html部分:


        
  1. <script src="mshare.js"></script>//引進mshare.js
  2. <button data-mshare="0">點擊彈出原生分享面板</button>
  3. <button data-mshare="1">點擊觸發朋友圈分享</button>
  4. <button data-mshare="2">點擊觸發發送給微信朋友</button>

js部分:


        
  1. <script>
  2. var mshare = new mShare({
  3. title: 'Lorem ipsum dolor sit.',
  4. url: 'http://m.ly.com',
  5. desc: 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quaerat inventore minima voluptates.',
  6. img: 'http://placehold.it/150x150'
  7. });
  8. $('button').click(function () {
  9. // 1 ==> 朋友圈 2 ==> 朋友 0 ==> 直接彈出原生
  10. mshare.init(+$(this).data('mshare'));
  11. });
  12. </script>

下面是mshare.js的代碼分享,把這些代碼新建一個js文件放進去,然后在頁面中引進就ok了。


        
  1. /**
  2. * 此插件主要作用是在UC和QQ兩個主流瀏覽器
  3. * 上面觸發微信分享到朋友圈或發送給朋友的功能
  4. */
  5. 'use strict';
  6. var UA = navigator.appVersion;
  7. /**
  8. * 是否是 UC 瀏覽器
  9. */
  10. var uc = UA.split('UCBrowser/').length > 1 ? 1 : 0;
  11. /**
  12. * 判斷 qq 瀏覽器
  13. * 然而qq瀏覽器分高低版本
  14. * 2 代表高版本
  15. * 1 代表低版本
  16. */
  17. var qq = UA.split('MQQBrowser/').length > 1 ? 2 : 0;
  18. /**
  19. * 是否是微信
  20. */
  21. var wx = /micromessenger/i.test(UA);
  22. /**
  23. * 瀏覽器版本
  24. */
  25. var qqVs = qq ? parseFloat(UA.split('MQQBrowser/')[1]) : 0;
  26. var ucVs = uc ? parseFloat(UA.split('UCBrowser/')[1]) : 0;
  27. /**
  28. * 獲取操作系統信息 iPhone(1) Android(2)
  29. */
  30. var os = (function () {
  31. var ua = navigator.userAgent;
  32. if (/iphone|ipod/i.test(ua)) {
  33. return 1;
  34. } else if (/android/i.test(ua)) {
  35. return 2;
  36. } else {
  37. return 0;
  38. }
  39. }());
  40. /**
  41. * qq瀏覽器下面 是否加載好了相應的api文件
  42. */
  43. var qqBridgeLoaded = false;
  44. // 進一步細化版本和平臺判斷
  45. if ((qq && qqVs < 5.4 && os == 1) || (qq && qqVs < 5.3 && os == 1)) {
  46. qq = 0;
  47. } else {
  48. if (qq && qqVs < 5.4 && os == 2) {
  49. qq = 1;
  50. } else {
  51. if (uc && ((ucVs < 10.2 && os == 1) || (ucVs < 9.7 && os == 2))) {
  52. uc = 0;
  53. }
  54. }
  55. }
  56. /**
  57. * qq瀏覽器下面 根據不同版本 加載對應的bridge
  58. * @method loadqqApi
  59. * @param {Function} cb 回調函數
  60. */
  61. function loadqqApi(cb) {
  62. // qq == 0
  63. if (!qq) {
  64. return cb && cb();
  65. }
  66. var script = document.createElement('script');
  67. script.src = (+qq === 1) ? '//3gimg.qq.com/html5/js/qb.js' : '//jsapi.qq.com/get?api=app.share';
  68. /**
  69. * 需要等加載過 qq 的 bridge 腳本之后
  70. * 再去初始化分享組件
  71. */
  72. script.onload = function () {
  73. cb && cb();
  74. };
  75. document.body.appendChild(script);
  76. }
  77. /**
  78. * UC瀏覽器分享
  79. * @method ucShare
  80. */
  81. function ucShare(config) {
  82. // ['title', 'content', 'url', 'platform', 'disablePlatform', 'source', 'htmlID']
  83. // 關于platform
  84. // ios: kWeixin || kWeixinFriend;
  85. // android: WechatFriends || WechatTimeline
  86. // uc 分享會直接使用截圖
  87. var platform = '';
  88. var shareInfo = null;
  89. // 指定了分享類型
  90. if (config.type) {
  91. if (os == 2) {
  92. platform = config.type == 1 ? 'WechatTimeline' : 'WechatFriends';
  93. } else if (os == 1) {
  94. platform = config.type == 1 ? 'kWeixinFriend' : 'kWeixin';
  95. }
  96. }
  97. shareInfo = [config.title, config.desc, config.url, platform, '', '', ''];
  98. // android
  99. if (window.ucweb) {
  100. ucweb.startRequest && ucweb.startRequest('shell.page_share', shareInfo);
  101. return;
  102. }
  103. if (window.ucbrowser) {
  104. ucbrowser.web_share && ucbrowser.web_share.apply(null, shareInfo);
  105. return;
  106. }
  107. }
  108. /**
  109. * qq 瀏覽器分享函數
  110. * @method qqShare
  111. */
  112. function qqShare(config) {
  113. var type = config.type;
  114. //微信好友 1, 微信朋友圈 8
  115. type = type ? ((type == 1) ? 8 : 1) : '';
  116. var share = function () {
  117. var shareInfo = {
  118. 'url': config.url,
  119. 'title': config.title,
  120. 'description': config.desc,
  121. 'img_url': config.img,
  122. 'img_title': config.title,
  123. 'to_app': type,
  124. 'cus_txt': ''
  125. };
  126. if (window.browser) {
  127. browser.app && browser.app.share(shareInfo);
  128. } else if (window.qb) {
  129. qb.share && qb.share(shareInfo);
  130. }
  131. };
  132. if (qqBridgeLoaded) {
  133. share();
  134. } else {
  135. loadqqApi(share);
  136. }
  137. }
  138. /**
  139. * 對外暴露的接口函數
  140. * @method mShare
  141. * @param {Object} config 配置對象
  142. */
  143. function mShare(config) {
  144. this.config = config;
  145. this.init = function (type) {
  146. if (typeof type != 'undefined') this.config.type = type;
  147. try {
  148. if (uc) {
  149. ucShare(this.config);
  150. } else if (qq && !wx) {
  151. qqShare(this.config);
  152. }
  153. } catch (e) {}
  154. }
  155. }
  156. // 預加載 qq bridge
  157. loadqqApi(function () {
  158. qqBridgeLoaded = true;
  159. });
  160. if (typeof module === 'object' && module.exports) {
  161. module.exports = mShare;
  162. } else {
  163. window.mShare = mShare;
  164. }

好了,這樣就可以直接喚起微信進行分享啦

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

calc的使用

seo達人

       有張頁面是要求要一屏展示,我想到了媒體查詢,也想到了vw和vh。我先用vw和vh來布局,分為上,中,下三部分。每塊計算寬高,vw和vh可以實現響應式布局,所以就用上了。但媒體查詢用上了卻發現在這邊不好用,這時使用上了calc()屬性。因為上一個人引入了video.js并加上id:#myVideo ,這邊也做相應的計算處理。



注意:要有空格



calc()能計算的計算表達式里,在加號(“+”)和減號(“-”)兩邊要留空格,而乘號(“”)和除號(“”)沒有這個要求。 



.video_rel {

        height: calc(100% - 66px);

        width: calc(51.3% - 60px);

 

        #myVideo {

            width: 100%;

            height: 100%;

        }

    }

CSS3引入了一個有用的功能,就是calc()函數。在指定元素高度或寬度時,你可以基于計算設定,而不是簡單的使用固定數值。這種功能在自適應網頁布局設計中格外有用——針對不同尺寸的設備,你需要動態的調整元素的大小,產生適合屏幕大小的不同布局。

 

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

六、HTTP協議中的緩存

seo達人

一、緩存簡介

緩存無處不在,瀏覽器端的緩存、服務器端的緩存、代理服務器的緩存、對象緩存、數據庫也有緩存……HTTP中具有緩存功能的是瀏覽器緩存和代理服務器緩存。下面說一下緩存的優點:



1.減少冗余的數據傳輸,節省了傳輸時間



2.減少服務器的負擔,大大提高了網站的性能



3.加快了客戶端加載網頁的速度



二、使用Fiddler如何查看緩存的Header

與緩存相關的內容放在Header中的Cache項里;Requests和Responses均是這樣。如圖:







三、緩存的新鮮度(通過什么方式判斷其是否,如何刷新緩存)

Web服務器通過兩種方式判斷瀏覽器緩存是否:



(1)瀏覽器把緩存文件的最后修改時間通過Header“If-Modified-Since”項傳遞給Web服務器。



(2)瀏覽器把緩存文件的ETag通過Header“If-None-Match”項傳遞給Web服務器。



簡單描述一下,瀏覽器端想請求一個文檔,它首先檢查本地緩存,發現存在這個文檔的緩存,獲取緩存文檔的最后修改時間,發送請求,將值放在Header中的“If-Modified-Since”項傳遞給Web服務器。Web服務器接收到請求后,將服務器的文檔修改時間(Last-Modified)與HTTP請求中的header中的“If-Modified-Since”值相比較,有兩種情況,如下面圖示:



1.緩存有效:







2.緩存無效:







截圖舉例:







上面說的是If-Modified-Since值對比的方式;下面說一下ETa'g;



四、ETag

ETag(Entity Tag):實體標簽;是根據實體內容生成的一段hash字符串(類似MD5之后的結果),可以用來標識資源的狀態(當資源發送變化時,ETag也會跟著改變);ETag是Web服務端產生的,然后通過response響應給瀏覽器。使用ETag,主要解決Last-Modified無法解決的情況:



(1.某些服務器不能得到文件的If-Modified-Since來判斷文件是否更新;



(2.某些文件修改非常頻繁,以小于秒的單元進行修改,而Last-Modified最單元為秒;



(3.有些文件最后修改時間變化了,但是內容并沒有變化,所以我們不希望瀏覽器以為文件已變化了;







五、與緩存相關的header

字段名稱 釋義

Cache-Control:max-age=0 以秒為單位

If-Modified-Since:Fri, 11 Jan 2019 01:55:04 GMT 緩存文件的最后修改時間

If-None-Match:W/"5c37f778-732" 緩存文件的Etag的值

Cache-Control:no-cache 不使用緩存

Pragma:no-cache 不使用緩存

Cache-Control:public 響應被緩存,可以共享與多用戶

Cache-Control:private 響應只能私有緩存,不可共享

Cache-Control:no-store 絕對禁止緩存(機密、敏感文件)

Cache-Control:max-age=60 60秒后緩存過期(相對時間)

Date:Fri, 11 Jan 2019 01:55:04 GMT 當前發送時間

Expires:Fri, 11 Jan 2019 01:55:04 GMT 緩存過期時間設置(絕對時間)

Last-Modified:Fri, 11 Jan 2019 01:55:04 GMT 服務器端文件的最后修改時間

Etag:W/"5c37f778-732" 服務器端文件的Etag值

六、關于緩存的常識

1.如何讓瀏覽器不使用緩存?



答:【Ctrl+F5】快捷鍵強制刷新瀏覽器,讓瀏覽器不使用緩存;此時Fiddler抓包所看到的請求Header中都會帶有Cache-Control:no-cache;







2.如何讓瀏覽器直接使用緩存,不請求服務器進行緩存驗證?



答:第一次訪問與第二次訪問同一個網頁;(注意:第二次訪問時,輸入網址,直接回車)瀏覽器會直接使用有效的緩存,而不會發生HTTP請求去服務器驗證緩存,這種情況稱之為緩存命中;



使用Fiddler抓包,現象:第一次訪問,有70多個Session;第二次訪問,僅40多個請求;



3.瀏覽器均可在設置中設置不使用緩存;



4.公有緩存、私有緩存的區別:一個可以多個不同的客戶端使用,一個只可唯一的客戶端使用;


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計  ipad界面設計 、 包裝設計 、 圖標定制  用戶體驗 、交互設計、 網站建設 、平面設計服務。

JS中鉤子函數與回調函數的區別

seo達人

測試代碼

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <title>Title</title>

</head>

<body>

    <button id="btn">按鈕</button>

    <script>

        let btn = document.getElementById("btn");

        btn.onclick = () => { // 鉤子函數

            console.log('我是鉤子函數');

        }

 

        btn.addEventListener("click",() =>{ // 回調函數

            console.log('我是回調函數');

        });

        // 這是給btn綁定了一個監聽器,后面那個函數是它的回調函數,

        // 因為消息捕獲的過程我們并不能參與,而在捕獲執行完畢的時候,

        // 回調函數才會執行,我們可以把對消息的處理寫在回調函數里。

    </script>

</body>

</html>

點擊按鈕后代碼輸出如下:







回調函數和鉤子函數的區別根本上是

鉤子函數在捕獲消息的第一時間就執行,而回調函數是捕獲結束時,最后一個被執行的。



什么是鉤子函數

一般認為,鉤子函數就是回調函數的一種,其實還是有差異的,差異地方就是:觸發的時機不同。

鉤子(Hook)概念源于Windows的消息處理機制,通過設置鉤子,應用程序對所有消息事件進行攔截,然后執行鉤子函數。 



什么是回調函數

回調函數其實是調用者將回調函數的指針傳遞給了調用函數,當調用函數執行完畢后,通過函數指針來調用回調函數。



鉤子函數和回調函數都是事件處理函數


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計  cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制  用戶體驗 、交互設計、 網站建設 、平面設計服務。

數組常用的方法

seo達人

數組常見方法

數組的方法

一、join() 方法 ----->不會改變原數組

二、concat() 方法 ----->不會改變原數組

三、splice(index, num, item) ----->會改變原數組

  1. splice(index, num) 刪除功能
  2. splice(index, 0, ...item)
  3. splice(index, num, item)
  4. splice(index)

    四、slice() -----> 不會改變原數組

    五、push() 和 pop() ----->會改變原數組

    六、shift() 和 unshift() -----> 會改變原數組

    七、sort() -----> 會改變原數組

    八、reverse() ----->會改變原數組

    九、indexOf() 和 lastIndexOf()

    十、includes()

    十一、forEach()

    十二、map() -----> 不會改變原數組

    十三、filter() -----> 不會改變原數組

    十四、every()

    十五、some()

    十六、reduce() 和 reduceRight()

    十七、Array.from() 將類數組轉化為數組

    十八、Array.of() 方法用于將一組值轉化為數組

    十九、數組實例的 find() 和 findIndex()

    二十、扁平化數組 flat() 方法 -----> 不會改變原數組

    數組的方法

    一、join() 方法 ----->不會改變原數組

    該方法可以將數組里面的元素,通過指定的分隔符以字符串的形式連接起來

    返回值:返回新的字符串



    // join() 將數組轉化為字符串

    let arr = [1, 2, 3, 4, 5]

    let str1 = arr.join('|')

    console.log(arr) // [1, 2, 3, 4, 5]

    console.log(str1) // 1|2|3|4|5

    // 當傳空字符串時

    let str2 = arr.join('') // 12345

    // 當不傳時

    let str3 = arr.join() // 1,2,3,4,5

    1

    2

    3

    4

    5

    6

    7

    8

    9

    二、concat() 方法 ----->不會改變原數組

    該方法可以把兩個數組里的元素拼接成一個新的數組

    返回值:返回拼接后的新數組



    let arr1 = [0, 1, 2]

    let arr2 = [2, 3, 4]

    let arr = arr1.concat(arr2)

    // 傳入二維數組

    let arrCopy = arr1.concat([12, [17, 26]])

    console.log(arrCopy) // [0, 1, 2, 12, [17, 26]]

    console.log(arr) // [0, 1, 2, 2, 3, 4]

    console.log(arr1) // [0, 1, 2]

    console.log(arr2) // [2, 3, 4]



    // ES6 擴展運算符

    let a = [1, 2]

    let b = [2, 3]

    let ab = [...a, ...b] // [1, 2, 2, 3]

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    三、splice(index, num, item) ----->會改變原數組

    index 參數:必傳,整數,規定添加或者刪除的位置,使用負數時,從數組尾部規定位置

    num 參數:必傳,要刪除的數量,如果為 0,則不刪除項目

    item 參數:可選參數,可以是多個,想數組添加的新項目

    splice 具有刪除,插入,替換的功能


  5. splice(index, num) 刪除功能

    index 參數:開始位置的索引



    num 參數:要刪除元素的個數



    返回值:返回的是包含被刪除元素的數組對象



    // 刪除功能

    let array = [1, 2, 3, 4, 5]

    let newArr = array.splice(2, 2)

    console.log(newArr) // [1, 2, 5]

    console.log(array) // [3, 4]



    1

    2

    3

    4

    5

    6
  6. splice(index, 0, …item)

    index 參數:插入元素的索引值

    0 參數:不刪除

    // 插入功能

    let arr = ['a', 'b', 'c', 'd', 'e']

    let newArr = arr.splice(1, 0, ['插入', 1217])

    console.log(newArr) // []

    console.log(arr) // ['a', ['插入', 1217], 'b', 'c', 'd', 'e']



    1

    2

    3

    4

    5

    6
  7. splice(index, num, item)

    index 參數:開始的索引位置

    num 參數:刪除的項個數

    item 參數:替換項

    返回值:返回包含被刪除的元素的數組對象

    let arr = [1, 2, 3, 4, 5]

    let newArr = arr.splice(2, 2, '替換', '1226')

    console.log(newArr) // [3, 4]

    console.log(arr) // [1, 2, '替換', '1226', 5]



    1

    2

    3

    4

    5
  8. splice(index)

    當只傳一個值時,表示從傳入的 index 索引值開始截取到最后

    let arr = [1, 2, 3, 4, 5]

    let newArr = arr.splice(3)

    console.log(newArr) // [4, 5]

    console.log(arr) // [1, 2, 3]

    1

    2

    3

    4

    四、slice() -----> 不會改變原數組

    返回從原數組中指定開始下標到結束下標之間的項組成的新數組

    slice() 方法可以接受一或兩個參數,即要返回項的起始位置和結束位置

    array.slice(2) 若只設置一個參數,起始位置為2(包含下標2)開始到數組最后

    array.slice(2, 5) 若設置兩個參數,起始下標為2(包含下標2)到結束下標5(不包含下標5)的數組

    當 slice() 參數中有負數時,將負數加上數組的長度值來替換該位置的數

    let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]

    let copyArr1 = arr.slice(2) // [3, 4, 5, 6, 7, 8, 9]

    let copyArr2 = arr.slice(2, 5) // [3, 4, 5] 

    let copyArr3 = arr.slice(-2) // [8, 9]

    let copyArr4 = arr.slice(2, -2) // [3, 4, 5, 6, 7]

    let copyArr5 = arr.slice(-2, -5) // []

    let copyArr6 = arr.slice(-5, -2) // [5, 6, 7]

    console.log(arr) // [1, 2, 3, 4, 5, 6, 7, 8, 9]



    1

    2

    3

    4

    5

    6

    7

    8

    9

    五、push() 和 pop() ----->會改變原數組

    push() 可以接受任意數量的參數,將其逐個添加到數組的末尾,并返回修改后數組的長度(改變了原數組)

    pop() 刪掉數組末尾最后一項,改變了數組的 length 值,并返回刪除的項

    let arr = [1, 2, 3, 4, 5]

    let count = arr.push(0, 1217)

    console.log(count) // 7

    console.loh(arr) // [1, 2, 3, 4, 5, 0, 1217]



    let item = arr.pop()

    console.log(item) // 1217

    console.log(arr) // [1, 2, 3, 4, 5, 0]

    1

    2

    3

    4

    5

    6

    7

    8

    六、shift() 和 unshift() -----> 會改變原數組

    shift() 刪除原數組的第一項,并返回刪除元素的值,如果數組為空折返回 undefined

    unshift() 將參數添加到原數組的開頭,并返回數組的長度

    let arr = [1, 2, 3, 4, 5]

    let item = arr.shift()

    console.log(item) // 1

    console.log(arr) // [2, 3, 4, 5]



    let count = arr.unshift(0, 'Jack')

    console.log(count) // 6

    console.log(arr) // [0, 'Jack', 2, 3, 4, 5]

    1

    2

    3

    4

    5

    6

    7

    8

    七、sort() -----> 會改變原數組

    在排序時,sort() 方法會調用每個數組項的 toString() 轉型方法,然后比較得到的字符串,已確定如何排序,其本質是比較字符串的 ASCII 編碼

    即使數組中的每一項都是數值,sort() 方法比較的也是字符串,因此會出現以下情況:

    let arr1 = ['a', 'd', 'e', 'b', 'c']

    console.log(arr1.sort()) // ['a', 'b', 'c', 'd', 'e']



    let arr2 = [12, 26, 3, 99, 52]

    console.log(arr2.sort()) // [12, 26, 3, 52, 99]



    1

    2

    3

    4

    5

    6

    解決辦法



    let arr3 = [12, 26, 3, 99, 52]

    arr3.sort((a, b) => {

    return a -b

    })

    console.log(arr3) // [3, 12, 26, 52, 99]

    1

    2

    3

    4

    5

    冒泡排序(優化版)



    function mySort (arr) {

    let count = 0 // 記錄循環次數

    // 外層循環  控制循環的次數,每次找到最大值

    for (let i = 0; i < arr.length - 1; i++) {

    count++

    // 判斷是否排序好了

    let isSort = true // 初始值默認已經排序好了

    for (let j = 0; j < arr.length - 1 - i; j++) {

    count++

    if (arr[j] > arr[j + 1]) {

    isSort = false

    // 交換位置

    let tmp = arr[j]

    arr[j] = arr[j + 1]

    arr[j + 1] = tmp

    }

    }

    // 某一趟結束,判斷一下是否結束

    // 如何判斷是否排序好,根據是否發生了位置交換,如果發生了位置交換就說明沒有排序好

    if (isSort) {

    break

    }

    }

    console.log(count)

    return arr

    }

    mySort([12, 26, 17, 520, 99])



    // 打印結果:count 9

    // arr [12, 17, 26, 99, 520]



    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    八、reverse() ----->會改變原數組

    反轉數組項的順序

    let arr = [1, 2, 3, 4, 5]

    arr.reverse()

    console.log(arr) // [5, 4, 3, 2, 1]



    1

    2

    3

    4

    九、indexOf() 和 lastIndexOf()

    indexOf() 接受兩個參數:要查找的項和查找起點位置的索引(可選項),其中從數組的開頭開始向后查找

    lastIndexOf() 接受兩個參數:要查找的項和查找起點位置的索引(可選項),其中是從數組的末尾開始向前查找

    返回值:當存在時,返回要查找的項在數組中首次出現的索引值;當不存在時,返回 -1

    可以用來判斷一個值是否存在數組中



    let arr = [1, 2, 3, 5, 7, 7, 8, 5, 12, 17]

    console.log(arr.indexOf(5)) // 3

    console.log(arr.lastIndexOf(5)) // 7



    console.log(arr.indexOf(5, 2)) // 3

    console.log(arr.lastIndexOf(5, 4)) // 3



    console.log(arr.indexOf('5')) // -1

    1

    2

    3

    4

    5

    6

    7

    8

    十、includes()

    Array.prototype.includes() 數組實例的方法

    返回一個布爾值,表示某個數組是否包含給定的值

    推薦使用:可以用來判斷一個值是否存在數組中



    let arr = [1, 2, 3, 4, 5]

    console.log(arr.includes(3)) // true

    console.log(arr.includes(0)) // false

    1

    2

    3

    十一、forEach()

    對數組進行遍歷,對數組中的每一項運行給定函數,沒有返回值



    forEarch(function (item, index, array) {})



    參數 item:表示數組中的每一項

    參數 index:表示數組中每一項對應的索引值

    參數 array:表示數組本身

    let arr = [1, 2, 3, 4, 5]

    arr.forEach((item, index, array) => {

    console.log(item + '---' + index + '---' + (arr === array))

    })

    1

    2

    3

    4

    十二、map() -----> 不會改變原數組

    map() 方法是將數組中的每一項調用提供的函數,結果返回一個新數組,并沒有改變原來的數組

    映射



    let arr = [1, 2, 3, 4, 5]

    let newArr = arr.map(item => item * item)



    console.log(newArr) // [1, 4, 9, 16, 25]

    console.log(arr) // [1, 2, 3, 4, 5]

    1

    2

    3

    4

    5

    十三、filter() -----> 不會改變原數組

    filter() 方法是將數組中所有的元素進行判斷,將滿足條件的元素作為一個新數組返回

    過濾



    let arr = [12, 17, 26, 520, 1314]

    let newArr = arr.filter((item, index) => {

    return item > 20

    })

    console.log(newArr) // [26, 520, 1314]

    1

    2

    3

    4

    5

    十四、every()

    every() 判斷數組中每一項都是否滿足條件,只有所有項都滿足條件才返回 true,否則返回 false

    let arr = [1, 2, 3, 4, 5]

    let boolean1 = arr.every(item => item > 0)

    let boolean2 = arr.every(item => item > 3)



    console.log(boolean1) // true

    console.log(boolean2) // false

    1

    2

    3

    4

    5

    6

    十五、some()

    some() 判斷數組中是否存在滿足條件的項,只要有一項滿足條件,就會返回 true,否則返回 false

    let arr = [1, 2, 3, 4, 5]

    let boolean3 = arr.some(item => item > 3)

    let boolean4 = arr.some(item => item < 0)



    console.log(boolean3) // true

    console.log(boolean4) // false

    1

    2

    3

    4

    5

    6

    十六、reduce() 和 reduceRight()

    reduce() 方法是所有元素調用返回函數,返回值為最后結果,傳入的值必須是函數類型

    接受兩個參數:每一項調用的函數和作為歸并基礎的初始值(可選項)

    這個函數返回的任何值都會作為第一個參數自動傳給下一項。第一次迭代發生在數組的第二項上,因此第一個參數是數組的第一項,第二個參數就是數組的第二項。



    // 利用 reduce() 方法實現數組求和,給數組一開始家里一個初始值 3

    let arr = [1, 2, 3, 4, 5]

    let sum = arr.reduce((prev, cur, index, array) => {

    // 函數接受 4 個參數:

    // 前一個值、當前值、項的索引值、原數組對象

    console.log(prev, '---', cur, '---', index, '---', array)

    return prev + cur

    }, 3)

    console.log(sum) // 18 = 15 + 3

    1

    2

    3

    4

    5

    6

    7

    8

    9

    與之相對應的還有一個 Array.reduceRight() 方法,區別是這個是從右向左操作的



    十七、Array.from() 將類數組轉化為數組

    let arrayLike = {

    '0': 'a',

    '1': 'b',

    '2': 'c',

    '3': 'd',

    length: 4

    }

    // ES5 寫法

    let arr1 = [].slice.call(arrayLike) // ['a', 'b', 'c', 'd']



    // ES6

    let arr2 = Array.from(arrayLike) // ['a', 'b', 'c', 'd']

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    十八、Array.of() 方法用于將一組值轉化為數組

    Array.of總是返回參數值組成的數組。如果沒有參數,就返回一個空數組。



    Array.of(1, 2, 3, 4, 5) // [1, 2, 3, 4, 5]

    Array.of('abcd') // ['abcd']

    Array.of('abcd').length // 1

    Array.of() // []



    // Array.of 方法的實現

    function ArrayOf () {

    return [].slice.call(arguments)

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    十九、數組實例的 find() 和 findIndex()

    數組實例的 find() 方法,用于找出第一個符合條件的數組成員

    它的參數是一個回調函數,所有數組成員依次執行該回調函數,直到找出第一個返回值為 true 的成員,然后就返回該成員,如果沒有符合條件的成員,則返回 undefined

    let arr = [1, 2, 3, 4, 5]

    let value= arr.find((item, index, array) => {

    // item 表示循環遍歷數組的每一項

    // index 每一項對應的索引值

    // array 原數組對象

    return item > 3

    })

    console.log(value) // 4

    console.log(arr) // [1, 2, 3, 4, 5]



    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    數組實例的 findIndex方法的用法與find方法非常類似,返回第一個符合條件的數組成員的位置,如果所有成員都不符合條件,則返回 -1

    let arr = [1, 2, 3, 4, 5]

    let index = arr.findIndex((item, index, array) => {

    return item > 3

    })



    console.log(index) // 3



    [NaN].indexOf(NaN) // -1

    [NaN].findIndex(value => Object.is(NaN, value)) // 0

    [NaN].includes(NaN) // true

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    由此可見:一般用來判斷數組中是否存在某個值,推薦使用 includes



    二十、扁平化數組 flat() 方法 -----> 不會改變原數組

    let arr = [1, [2, 3, [4, 5, [6]]]]

    let arrFlat = arr.flat(Infinity)

    console.log(arrFlat) // [1, 2, 3, 4, 5, 6]

    console.log(arr) // [1, [2, 3, [4, 5, [6]]]]

    1

    2

    3

    4

    利用遞歸實現數組扁平化



    let arrayFlat = []

    let myFlat = (arr) => {

    for (let i = 0; i < arr.length; i++) {

    let item= arr[i]

    // 判斷 arr[i] 是否是數組

    if (Array.isArray(item)) {

    // 如果是數組,繼續調用函數 myFlat

    myFlat(item)

    } else {

    arrayFlat.push(item)

    }

    }

    return arrayFlat

    }



    藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務。

徹底解決小程序無法觸發SESSION問題

seo達人

一、首先找到第一次發起網絡請求的地址,將服務器返回set-cookie當全局變量存儲起來

wx.request({
  ......
  success: function(res) {
    console.log(res.header);
    //set-cookie:PHPSESSID=ic4vj84aaavqgb800k82etisu0; path=/; domain=.fengkui.net

    // 登錄成功,獲取第一次的sessionid,存儲起來
    // 注意:Set-Cookie(開發者工具中調試全部小寫)(遠程調試和線上首字母大寫)
    wx.setStorageSync("sessionid", res.header["Set-Cookie"]);
  }
}) 

二、請求時帶上將sessionid放入request的header頭中傳到服務器,服務器端可直接在cookie中獲取

wx.request({
  ......
  header: {
    'content-type': 'application/json', // 默認值
    'cookie': wx.getStorageSync("sessionid")
    //讀取sessionid,當作cookie傳入后臺將PHPSESSID做session_id使用
  },
  success: function(res) {
    console.log(res)
  }
}) 

三、后臺獲取cookie中的PHPSESSID,將PHPSESSID當作session_id使用

<?php
// 判斷$_COOKIE['PHPSESSID']是否存在,存在則作session_id使用
if ($_COOKIE['PHPSESSID']) {
    session_id($_COOKIE['PHPSESSID']);
}

session_start();
echo session_id(); 

jqGrid 表格底部匯總、合計行footerrow處理

seo達人

jqGrid提供了表格底部匯總、合計行功能,我們先看下user-guide關于jqGrid合計行都有哪些說明?然后再看個DEMO,看看jqGrid表格底部匯總、合計行到底如何實現。



1、user-guide關于jqGrid合計行的說明

1)表格配置:footerrow, boolean, 默認false

If set to true this will place a footer table with one row below the gird records and above the pager. The number of columns equal those specified in colModel

表格是否顯示底部合計行。



2)表格配置:userDataOnFooter,boolean,默認false

When set to true we directly place the user data array userData in the footer if the footerrow parameter is set to true. The rules are as follows: If the userData array contains a name which matches any name defined in colModel, then the value is placed in that column. If there are no such values nothing is placed. Note that if this option is used we use the current formatter options (if available) for that column. See footerData method.

如果設為true,則userData可以用來填充匯總行。



3)匯總行賦值:footerData([string action], [object data], [boolean format])

This method gets or sets data on the grid footer row. When set data in the footer row, the data is formatted according to the formatter (if defined) in coModel. The method can be used if footerrow option is set to true.

parameters

string action - can be ‘get’ or ‘set’. The default is get. ‘get’ returns an object of type name:value, where the name is a name from colModel. This will return data from the footer. The other two options have no effect in this case. ‘set’ takes a data object and places the values in the footer The value is formatted according to the definition of the formatter in colModel - see next parameter. The object should be in name:value pair, where the name is the name from colModel

object data - data to be set in the footer in name:value pair, where the name should correspond to the name of colModel in order to be set in the appropriate cell.

boolean format - default is true. This instruct the method to use the formatter (if set in colModel) when new values are set. A value of false will disable the using of formatter



2、一個DEMO,如何利用gridComplete事件進行表格數據匯總并賦值給合計行

1)案例截圖



2)html代碼



<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8" />

<title>jggrid底部匯總行</title>



<link rel="stylesheet" href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />

<link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.5.0/css/font-awesome.min.css" />

<link rel="stylesheet" href="https://cdn.bootcss.com/jqueryui/1.11.0/jquery-ui.min.css" />

<link rel="stylesheet" href="https://js.cybozu.cn/jqgrid/v5.3.1/css/ui.jqgrid.css" />

<script src=";

<script src="
;

<script src="
;

</head>

<body>

<div class="page-content container">

<div class="page-body"> <!-- page-body -->

<div class="panel panel-default" id="panel-orders">

<table id="orders"></table>

</div>

</div>

</div>

<script type="text/javascript">

var data = [];

function getBills() {

var rowCount = 10;

for (var i = 0; i < rowCount; i ++) {

data.push({

sid: i,

goods_no: i + 1,

goods_name: '零件名稱' + rowCount + i,

car_type_name: '車型' + rowCount + i,

package_name: '包裝器具' + rowCount + i,

unit_name: '件',

snp: 0.89,

bill_amount: rowCount + i,

goods_count: rowCount + i,

bill_no: 'BN0000000' + i,

qrcode: '1000000000' + i,

barcode: '1000000000' + i,

})

}

$("#orders").jqGrid("clearGridData").jqGrid('setGridParam',{data: data || []}).trigger('reloadGrid');

}

$(function() {

$("#orders").jqGrid({

colModel: [

{label: "零件號", name: "goods_no", width: 60},

{label: "零件名稱", name: "goods_name", search:false, width: 180},

{label: "車型", name: "car_type_name", width: 70},

{label: "包裝器具", name: "package_name", width: 70},

{label: "單位", name: "unit_name", width: 40},

{label: "訂單號", name: "bill_no", width: 120},

{label: "訂單數量", name: "goods_count", width: 80},

],

datatype: 'local',

rownumbers: true,

height: 300,

rowNum: 1000,

footerrow: true,

gridComplete: function() {

var rows = $("#orders").jqGrid("getRowData"), total_count = 0;

        for(var i = 0, l = rows.length; i<l; i++) {

        total_count += (rows[i].goods_count - 0);

        }

        $("#orders").jqGrid("footerData", "set", {goods_name:"--合計--",goods_count:total_count});

        }

});

getBills();

});

</script>

</body>

</html>



3)代碼說明:



表格構建時,設置:footerrow: true

gridComplete(jqGridGridComplete)事件處理,進行數據匯總并賦值給合計行

gridComplete fires after all the data is loaded into the grid and all other processes are complete. Also the event fires independent from the datatype parameter and after sorting paging and etc. Does not fire if datatype is a defined as function.



4)獲取匯總行數據

var row = $("#orders").jqGrid(“footerData”, “get”);

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計  cs界面設計 、 ipad界面設計  包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

vue-router的router-link詳解

seo達人

<router-link>

<router-link> 組件支持用戶在具有路由功能的應用中 (點擊) 導航。 通過 to 屬性指定目標地址,默認渲染成帶有正確鏈接的 <a> 標簽,可以通過配置 tag 屬性生成別的標簽.。另外,當目標路由成功激活時,鏈接元素自動設置一個表示激活的 CSS 類名。



<router-link> 比起寫死的 <a href="..."> 會好一些,理由如下:



無論是 HTML5 history 模式還是 hash 模式,它的表現行為一致,所以,當你要切換路由模式,或者在 IE9 降級使用 hash 模式,無須作任何變動。

在 HTML5 history 模式下,router-link 會守衛點擊事件,讓瀏覽器不再重新加載頁面。

當你在 HTML5 history 模式下使用 base 選項之后,所有的 to 屬性都不需要寫 (基路徑) 了。

示例代碼:



字符串形式,會默認在當前路由下給字符串前面加



<router-link to='propsView'>字符串形式One</router-link><br>

<router-link :to="{path: 'propsView', query: {id: 1}}" replace>字符串形式Two</router-link><br>

路徑形式 



<router-link to='/test/propsView'>路徑形式One</router-link><br>

<router-link :to="{path: '/test/propsView'}">路徑形式Two</router-link><br>

命名的路由 



<router-link :to="{name: 'test', params: {userId: 123}}">跳轉至test路由</router-link><br>

想要 <router-link> 渲染成某種標簽,例如 <li>。 于是我們使用 tag prop 類指定何種標簽, 同樣它還是會監聽點擊,觸發導航。默認值: "a"



<router-link :to="{name: 'test'}" tag="li">渲染成li標簽</router-link><br>

設置 replace 屬性的話,當點擊時,會調用 router.replace() 而不是 router.push(),于是導航后不會留下 history 記錄。 



<router-link :to="{name: 'test'}" replace>replace導航后不會留下 history 記錄</router-link>


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計  包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務。

日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
日韩高清av一区二区三区| 久久免费国产精品| 亚洲一线二线三线久久久| 日本欧美精品久久久| 国产免费观看久久| 3p视频在线观看| 国产视频一区二区三区四区| 尤物yw午夜国产精品视频明星| 91久久精品美女高潮| 久久久久99精品久久久久| 91高清免费视频| 欧美精品中文字幕一区二区| 亚洲激情女人| 国产日韩在线一区二区三区| 亚洲+变态+欧美+另类+精品| 日本在线观看天堂男亚洲| 热久久久久久久| 色猫猫成人app| 国产91丝袜在线播放九色| 大片免费在线观看| 久久精品国产www456c0m| 99热99精品| 国产精品欧美一区二区三区奶水| 欧美va亚洲va在线观看蝴蝶网| 欧美黑人又粗大| silk一区二区三区精品视频| 欧美乱妇20p| 国产精品极品在线观看| 亚洲按摩av| 美女的胸无遮挡在线观看| 第一福利在线| 欧美日韩不卡合集视频| 中文字幕一区二区日韩精品绯色| 国产精品伦一区二区三级视频| 久久99国产精品久久99大师| 91免费国产视频网站| 成人自拍在线| 欧美二区三区91| 99热最新在线| 激情小说亚洲图片| 在线中文字幕一区| 高清日韩欧美| 亚洲一区www| 久久精品女人天堂| 欧美激情综合五月色丁香| 亚洲精品一卡二卡三卡四卡| 久久99视频免费| 高清在线观看av| 91伊人久久| 91亚洲精品一区二区| 欧美精品资源| 最好看的2019年中文视频| 亚洲先锋影音| 91亚洲欧美| 免费短视频成人日韩| 99国产欧美另类久久久精品| 图片区小说区区亚洲五月| 久久99热这里只有精品| 亚洲激情欧美激情| 最新电影电视剧在线观看免费观看| 神马一区二区影院| 亚洲精品小视频| 岛国视频午夜一区免费在线观看| 在线观看视频欧美| 日韩精品一级中文字幕精品视频免费观看| 欧美午夜xxx| 亚洲国产精品久久久久| 久久久久久草| 国产原创精品视频| 国产激情一区二区三区四区| 免费成人av在线播放| 国产一区二区在线影院| 91视频在线免费观看| 国产精品ⅴa有声小说| 99久久久精品免费观看国产蜜| 免费av网站在线观看| 欧美区在线观看| 美女国产一区二区| 99久久婷婷国产综合精品首页| 欧美精品一区二区久久婷婷| 欧美亚洲国产一区二区三区| 卡通动漫精品一区二区三区| 欧美婷婷六月丁香综合色| 福利一区福利二区微拍刺激| 午夜国产欧美理论在线播放| 久久精品一区四区| 欧美一区二区三区白人| 96成人在线视频| 黑人另类精品××××性爽| 亚洲国产成人久久| 精品乱人伦一区二区三区| 日韩有码在线播放| 九九热精品视频在线观看| 九义人在线观看完整免费版电视剧| 91黑丝高跟在线| 茄子视频成人在线观看| 在线免费观看不卡av| 日本强好片久久久久久aaa| 99久久精品网| 婷婷成人综合网| 偷拍亚洲精品| 蜜桃在线一区二区三区精品| 午夜精品123| 日韩中文字在线| 欧美一卡二卡在线观看| 91在线一区| 一区二区三区成人在线视频| 日韩欧美国产成人一区二区| 1024精品一区二区三区| 欧美18免费视频| 僵尸再翻生在线观看| 性欧美亚洲xxxx乳在线观看| 国产一区二区女| 亚洲国产美女久久久久| 精品国产一区二区在线观看| 九色91视频| 91高清免费在线观看| 在线观看欧美日本| 久久视频免费观看| 视频一区在线视频| 欧美aa国产视频| 日韩高清中文字幕| 涩涩涩视频在线观看| 欧美日韩免费| 天天影视网天天综合色在线播放| 久久婷婷丁香| 亚洲精品亚洲人成在线观看| 欧美激情一区二区三区在线视频观看| 色诱亚洲精品久久久久久| 亚洲国产精选| 亚洲国模精品一区| 国产精品剧情在线亚洲| 欧美激情aⅴ一区二区三区| 亚洲国产精品ⅴa在线观看| 免费电影网站在线视频观看福利| 亚洲欧美另类国产| 久久亚洲电影天堂| www.神马久久| 国产成人精品三级高清久久91| 欧美视频在线看| 免费欧美电影| 超碰国产精品一区二页| 日韩视频国产视频| 午夜免费电影一区在线观看| 污视频在线免费观看一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美人与物videos| 成人黄色av免费在线观看| 欧美三级华人主播| 在线观看av不卡| 国产精品一二二区| lutube成人福利在线观看| 性做久久久久久久久| 超碰在线网站| 91麻豆精品国产| 日韩精品视频在线播放| 亚洲97在线观看| 久久久精品网| 国产伦精品一区二区三区四区视频| 制服丝袜日韩国产| 国产精品美女久久久久久| 成人片免费看| 国产免费成人| 制服丝袜激情欧洲亚洲|