亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jQuery返回定位插件詳解

2019-11-19 16:35:07
字體:
來源:轉載
供稿:網友

一、jQuery 提供開發者開發插件的幾種模式

1.$.extend();     //這個方法是綁定在$上面的??梢酝ㄟ^$直接調用

2.$.fn.方法名     //這個方法是綁定在Dom對象上面的可以通過$('').方法名();調用

3.$.widget   //通過jQuery UI 部件工廠模式創建。

二、插件的開發過程

1.$.extend();

這個方法其實很簡單,只是像$上面添加了一個靜態的方法而已。主要用途是對插件api的擴展.

eg:

//$.extend();為了防止,變量和方法之間的相互污染,我們采用閉包的模式。  (function($,factory){    var obj = factory();    $.extend({      sayHelloWorld:obj.firstApply,    })    $.secondApply = obj.secondApply;  })(jQuery,function(){    var obj = {      firstApply(){        console.log('hello world');      },      secondApply(){        console.log('直接綁定到$上');      },    };     return obj;  });  $.sayHelloWorld();//hello world  $.secondApply(); //直接綁定到$上   /*從上面的2種綁定方式可以看出用$.extend();對jQuery方法進行拓展,   其實和直接綁定到$上是一樣的效果*/

2.$.fn.方法名。   (方法名 其實就是插件名)。

a.插件結構

<div id="app">app</div>//$.fn.插件名字 (logText);  (function($,factory){    $.fn.logText = factory();  })(jQuery,function(){    var logText = function(){      console.log(this.text());      return this;    }    return logText;  });  $("#app").logText(); //app  通過DOM元素之間調用該方法。并返回該對象。這也是jQuery實現鏈式操作的技巧。  var h = $("#app").logText().height(); // app  console.log(h); //18 //這樣就可以自定義方法了。

在jQuery插件的開發過程中,其實主要是通過第二種模式($.fn.插件名)開發的。因為jQuery的強大之處就是對Dom的操作.

b.一個插件的強大之處就是參提供周全的參數。以及方便使用者對參數進行擴展。

<div id="app">app</div>   //$.fn.插件名字 (myPuglin);  (function(global,$,factory){    var common = factory(); //封裝插件使用到的函數。    $.fn.myPuglin = function(opts){  //插件的名稱      var defaults = {}; //默認的api      opts = $.extend(defaults,opts || {}); //對api的拓展      /*       *       * 要執行的功能       *        */      console.log(opts.hello);      return this;    }  })(window,jQuery,function(){    var common = {      a(opt){        return opt;      },    };    return common;  });  $("#app").myPuglin({hello:'hello world'}); //hello world

準備工作已經完畢。那么下面會一個插件為列子,來講解

3.工作中經常用到的列表到詳情。返回來需要保留該位置的插件。(返回定位) savePositon();  $.fn.savePosition

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">  <title>Title</title>  <style>    @media screen and (max-width: 319px) {      html {        font-size: 85.33333px; } }    @media screen and (min-width: 320px) and (max-width: 359px) {      html {        font-size: 85.33333px; } }    @media screen and (min-width: 360px) and (max-width: 374px) {      html {        font-size: 96px; } }    @media screen and (min-width: 375px) and (max-width: 383px) {      html {        font-size: 100px; } }    @media screen and (min-width: 384px) and (max-width: 399px) {      html {        font-size: 102.4px; } }    @media screen and (min-width: 400px) and (max-width: 413px) {      html {        font-size: 106.66667px; } }    @media screen and (min-width: 414px) {      html {        font-size: 110.4px; } }    /*CSS Reset*/    body,    div,    dl,    dt,    dd,    ul,    ol,    li,    h1,    h2,    h3,    h4,    h5,    h6,    pre,    code,    form,    fieldset,    legend,    input,    textarea,    p,    blockquote,    th,    td,    header,    hgroup,    nav,    section,    article,    aside,    footer,    figure,    figcaption,    menu,    button {      margin: 0;      padding: 0; }    li{      list-style: none;    }    #app{      width: 100%;      max-width: 640px;     }    li {      height: 1.2rem;      width: 100%;      border-bottom: 1px solid #cccccc;      text-align: center;      line-height: 1.2rem;      font-size: 20px;    }  </style>  <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script></head><body>  <div id="app">    <ul>      <li data-page="1" data-url="http://baidu.com?id=1">第一頁 第1個li</li>      <li data-page="1" data-url="http://baidu.com?id=2">第一頁 第2個li</li>      <li data-page="1" data-url="http://baidu.com?id=3">第一頁 第3個li</li>      <li data-page="1" data-url="http://baidu.com?id=4">第一頁 第4個li</li>      <li data-page="1" data-url="http://baidu.com?id=5">第一頁 第5個li</li>      <li data-page="1" data-url="http://baidu.com?id=6">第一頁 第6個li</li>      <li data-page="1" data-url="http://baidu.com?id=7">第一頁 第7個li</li>      <li data-page="1" data-url="http://baidu.com?id=8">第一頁 第8個li</li>      <li data-page="1" data-url="http://baidu.com?id=9">第一頁 第9個li</li>      <li data-page="1" data-url="http://baidu.com?id=10">第一頁 第10個li</li>      <li data-page="1" data-url="http://baidu.com?id=11">第一頁 第11個li</li>      <li data-page="1" data-url="http://baidu.com?id=12">第一頁 第12個li</li>      <li data-page="1" data-url="http://baidu.com?id=13">第一頁 第13個li</li>      <li data-page="1" data-url="http://baidu.com?id=14">第一頁 第14個li</li>      <li data-page="1" data-url="http://baidu.com?id=15">第一頁 第15個li</li>      <li data-page="2" data-url="http://baidu.com?id=16">第二頁 第1個li</li>      <li data-page="2" data-url="http://baidu.com?id=17">第二頁 第2個li</li>      <li data-page="2" data-url="http://baidu.com?id=18">第二頁 第3個li</li>      <li data-page="2" data-url="http://baidu.com?id=19">第二頁 第4個li</li>      <li data-page="2" data-url="http://baidu.com?id=20">第二頁 第5個li</li>      <li data-page="2" data-url="http://baidu.com?id=21">第二頁 第6個li</li>      <li data-page="2" data-url="http://baidu.com?id=22">第二頁 第7個li</li>      <li data-page="2" data-url="http://baidu.com?id=23">第二頁 第8個li</li>      <li data-page="2" data-url="http://baidu.com?id=24">第二頁 第9個li</li>      <li data-page="2" data-url="http://baidu.com?id=25">第二頁 第10個li</li>      <li data-page="2" data-url="http://baidu.com?id=26">第二頁 第11個li</li>      <li data-page="2" data-url="http://baidu.com?id=27">第二頁 第12個li</li>      <li data-page="2" data-url="http://baidu.com?id=28">第二頁 第13個li</li>      <li data-page="2" data-url="http://baidu.com?id=29">第二頁 第14個li</li>      <li data-page="2" data-url="http://baidu.com?id=30">第二頁 第15個li</li>    </ul>  </div></body><script type="text/javascript">  /*   * 1.為什么我要返回定位呢??隙ㄊ窃黾佑脩舻捏w驗度。比如你剛看的那條信息挺感   * 興趣的,點進詳情看完了,回來一看,不見了,是不是很嘔心啊。   * 2.難點在哪里?   *  難點1:當我們有很多的列表的時候,列表肯定是滾動加載。于是我們直接保存滾動條的位置   *  的方式可以放棄了。   *  難點2:我們怎么確定是從詳情返回來的?   * 3.我們該怎么實現呢?   *  其實我們實現的方式跟保存滾動條的位置差不多。但要對scrollTop的距離進行處理。   *  a.我們點擊這點詳情的時候,可視區域列表的條數,可以是一頁的數據,可能會是2頁數據。   *  這種情況下我們都要把結果保留下來。   *  b.當我們點擊這條數據的時候存現當前頁滾動了多少就可以了。   *   *  下面具體看代碼:   */  (function(global,$,factory){    var keepScrollTop = 0; //用于最后保存的滾動條的位置    var tool =factory();    $.fn.savePosition = function(options){      var dataPage,logo,objLogo,prevNum,containerHeight = 0,scrollTopDistance = 0,elIndex = 0,       prevHeight = 0,prevCountPage = 0,prevCountPageDistance = 0,prevDistance = 0,       prevPageScrollDistance = 0;      var elements = this;      var defaults = {        container:$(window),  //滾動的容器        logo:"data-url",   // 用于計算在這個容器中的每個LI中的唯一標識量。一般為去詳情的連接        currentPage:"data-page",  //點擊當前的li的頁碼        pageResize:30,        //與后臺交互的每頁返回的數量。 默認是30,        goToDetailElement:$(".go-detail") ,  //滾動的每個列的總對象        nodeLi:"", //元素節點        getPageNum:"getPageNum",       //1表示單頁數據,2表示雙頁數據。設置是請求單頁數據還是雙頁數據的標識量。放在URL上。        urlPageNum:"pageNum",        //用于放到URL上面的參數標識表示當前是幾頁. pageNum = currentPage  //返回來的時候用這個參數來判斷是不是需要滾動      };      var settings = $.extend(defaults,options || {});      dataPage = elements.attr(settings.currentPage);  //求出點擊對象位于哪一個頁碼      logo = elements.attr(settings.logo);   //求出當前對象的唯一標識量      containerHeight = parseInt(settings.container.outerHeight());  //容器的高度      scrollTopDistance = parseInt(settings.container.scrollTop()); //滾動的距離      elements.parent().find(""+ settings.nodeLi + "["+settings.currentPage + "=" + dataPage +"]").each(function(index, obj){        objLogo = $(obj).attr(settings.logo);        elIndex = index;        if(logo == objLogo){          prevNum = elements.prevAll().length;          prevHeight = tool.getDistance(elements.parent().children(),prevNum - elIndex);          prevCountPage = parseInt(prevNum / settings.pageResize);          if(scrollTopDistance < prevHeight){            elements.parent().children().each(function(index,target){              if(prevCountPage > 0 ){                if(index < (prevCountPage - 1) * settings.pageResize){                  prevCountPageDistance += parseInt($(target).outerHeight());                };              };            });            tool.changeUrlPar(settings.urlPageNum,dataPage - 1);     //當前的頁數            tool.changeUrlPar(settings.getPageNum,2);       //獲取雙頁數據            keepScrollTop = scrollTopDistance - prevCountPageDistance;          //請求雙頁數據 向上 減 1;          }else{            prevDistance = tool.getDistance(elements.parent().children(),(prevCountPage + 1) * settings.pageResize);            prevPageScrollDistance = tool.getDistance(elements.parent().children(),prevCountPage * settings.pageResize);            if(prevDistance < (scrollTopDistance + containerHeight)){              tool.changeUrlPar(settings.urlPageNum,dataPage);    //點擊對象位于當前的頁數              tool.changeUrlPar(settings.getPageNum,2);        //請求雙頁數據              keepScrollTop = scrollTopDistance - prevPageScrollDistance;            }else{              tool.changeUrlPar(settings.urlPageNum,dataPage);    //點擊對象位于當前的頁數              tool.changeUrlPar(settings.getPageNum,1);  //請求單頁數據              keepScrollTop = scrollTopDistance - prevPageScrollDistance;            };          };        };      });      tool.setSessionStorage("keepScrollTop",keepScrollTop);   //保存滾動條的位置      return this;    };    $.getSessionStorage = function(opt){      opt = sessionStorage.getItem(opt);      return opt;    };  })(window,jQuery,function(){    var tool = {      changeUrlPar(arg, val){  //改變URL參數        function changeU(destiny, par, par_value) {          var pattern = par+'=([^&]*)';          var replaceText = par+'='+par_value;          if (destiny.match(pattern))          {            var tmp = '///'+par+'=[^&]*/';            tmp = destiny.replace(eval(tmp), replaceText);            return (tmp);          }          else {            if (destiny.match('[/?]'))            {              return destiny+'&'+ replaceText;            }            else            {              return destiny+'?'+replaceText;            }          }          return destiny+'/n'+par+'/n'+par_value;        }        var hash = window.location.hash;        history.replaceState(null,'',location.pathname+location.search);        url = window.location.href;        var newUrl = changeU(url,arg,val) + hash;        history.replaceState(null,'',newUrl);        return false;      },      removeUrlPar(options){        history.replaceState(null,'',location.pathname+location.search);        var newParamStr = "";        var quotes = window.location.href.indexOf("?");        if(quotes != -1){          var webUrl = window.location.href.split("?")[0];          var paramsStr = window.location.href.split("?")[1].toString();          if(paramsStr.indexOf("&") != -1){            var pageIndex = paramsStr.indexOf(options);            if(pageIndex != -1){              var pageArr = paramsStr.split("&");              for(var i = 0; i < pageArr.length; i++){                if(pageArr[i].match(options)){                  pageArr.splice(i,1);                };              };              newParamStr = pageArr.join("&");            }else{              newParamStr = paramsStr;            } ;          }else{            if(paramsStr.match(options)){              newParamStr = "";            }else {              newParamStr = paramsStr;            };          };          history.replaceState(null,'',webUrl + "?" + newParamStr);        }else{          history.replaceState(null,'',w.location.href);        }      },      getDistance(obj,maxNum){        var h = 0;        obj.each(function(index,target){          if(index < maxNum){            h += parseInt($(target).outerHeight());          }        });        return h;      },      setSessionStorage(keyName,opt){        sessionStorage.setItem(keyName,opt);        console.log(opt)      },    }    return tool;  })  $("li").on("click",function(){    $(this).savePosition({pageResize:15});    /*     *  1.http://localhost/index.php/Home/Web?pageNum=2&getPageNum=1     * 點擊玩了以后url就變成這樣了。這時候表示 返回來的時候請求第二頁的數據。只請求一次。從第二頁開始     *     * 2.http://localhost/index.php/Home/Web?pageNum=1&getPageNum=2     * 這樣表示請求也數據。從第一頁的數據開始     *     */    var _herf = $(this).attr("data-url");    window.location.href = _herf;  });  //當我們初始化的時候  var pageNum = 1,getPageNum = 2; //這兩個數的值是從URL中獲取的。只有從詳情返回來 時候,才有  if(!!pageNum && !!getPageNum){    //其中還有很多判定,肯定是先獲取數據在滾動。。。    $(window).scrollTop($.getSessionStorage('keepScrollTop'));  }else{  }</script></html>

這個返回定位的插件基本就開發完畢了。當然對于實際的項目中,還有很多的改動。比如返回的時候,一定要把設置的標志參數去掉。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
伊人久久久久久久久久久| 精品国产精品自拍| 91在线免费视频| 亚洲第一男人天堂| 91精品国产成人www| 久久精品成人欧美大片古装| 日韩欧美成人精品| 狠狠久久五月精品中文字幕| 日韩日本欧美亚洲| 国产欧美中文字幕| 在线观看免费高清视频97| 懂色av中文一区二区三区天美| 中文字幕亚洲色图| 久久久国产视频91| 奇米成人av国产一区二区三区| 欧美在线观看www| 亚洲欧美国产va在线影院| 国色天香2019中文字幕在线观看| 秋霞av国产精品一区| 国产精品一区二区久久国产| 大量国产精品视频| 国产69精品99久久久久久宅男| 孩xxxx性bbbb欧美| 欧美一级视频一区二区| 国产欧美日韩专区发布| 国产剧情久久久久久| 在线成人激情视频| 性欧美暴力猛交69hd| 欧美日韩亚洲视频一区| xxx成人少妇69| 午夜精品久久久久久久久久久久久| 久久精品青青大伊人av| 欧美国产日韩一区二区| 俺也去精品视频在线观看| 亚洲欧洲xxxx| 欧美性xxxxxx| 欧美大片在线看| 欧美性色视频在线| 亚洲美女福利视频网站| 亚洲精品国产精品久久清纯直播| 亚洲电影第1页| 日韩av高清不卡| 91在线高清免费观看| 91精品国产综合久久久久久久久| 欧美成人一区二区三区电影| 在线亚洲国产精品网| 国产亚洲一区二区精品| 国产精品久久77777| 亚洲午夜女主播在线直播| 国产欧美日韩中文字幕| 亚洲国产一区二区三区在线观看| 欧美国产日韩xxxxx| 久久99亚洲热视| www.久久草.com| 亚洲已满18点击进入在线看片| 亚洲美女久久久| 97在线免费观看视频| 97在线观看免费| 国产精品高潮呻吟久久av无限| 欧美极品少妇全裸体| 欧美大尺度电影在线观看| 亚洲黄色av网站| 精品国产视频在线| 亚洲图片欧美午夜| 久久久久久久久久久久久久久久久久av| 欧美日本啪啪无遮挡网站| 国外色69视频在线观看| 亚洲欧美日本伦理| 九九热精品视频在线播放| 日韩av电影在线播放| 久久久久久亚洲精品不卡| 91国产高清在线| 国产精品亚发布| 亚洲伦理中文字幕| 欧美精品免费在线| 国产精品欧美日韩久久| 久久精品91久久香蕉加勒比| 欧美劲爆第一页| 欧美激情手机在线视频| 日韩毛片中文字幕| 国产精品成人免费电影| 日韩精品中文字| 亚洲欧美激情视频| 中文字幕欧美专区| 美女久久久久久久| 国产精品视频精品视频| 亚洲第一区在线| 97高清免费视频| 亚洲a在线播放| 亚洲91精品在线观看| 26uuu久久噜噜噜噜| 精品久久久国产精品999| 久久频这里精品99香蕉| 久久电影一区二区| 成人夜晚看av| 操日韩av在线电影| 亚洲乱码一区av黑人高潮| 成人在线国产精品| 57pao国产成人免费| 国产成人中文字幕| 中文.日本.精品| 久久国产精品99国产精| 国产人妖伪娘一区91| 一本一本久久a久久精品牛牛影视| 成人在线播放av| 国产精品精品久久久久久| 亚洲综合自拍一区| 日韩女优人人人人射在线视频| 欧美大片在线看免费观看| 亚洲国产日韩欧美综合久久| 国产免费一区二区三区香蕉精| 性欧美在线看片a免费观看| 国产亚洲欧洲黄色| 91精品国产91久久久久久最新| 日韩成人小视频| 色妞欧美日韩在线| 国色天香2019中文字幕在线观看| 在线视频欧美日韩精品| 日韩欧美aⅴ综合网站发布| 精品久久久久久亚洲国产300| 色婷婷综合久久久久中文字幕1| 久久久久久69| 久久人人爽人人爽人人片av高请| 日韩欧美在线国产| 亚洲国产精品va| 欧美电影免费看| 国产成人精品在线视频| 国产精品一区专区欧美日韩| 欧美多人爱爱视频网站| 国产成人福利网站| 精品久久久久人成| 久久久久久久久久亚洲| 亚洲电影免费观看高清完整版| 在线性视频日韩欧美| 2021国产精品视频| 欧美电影免费观看电视剧大全| 日韩精品视频免费| 国产中文字幕日韩| 欧美一级高清免费播放| 久久久久久网址| 亚洲一区999| 欧美最猛性xxxxx(亚洲精品)| 国产一区二区三区丝袜| 中文字幕免费精品一区高清| 日韩欧美国产成人| 91亚洲精品视频| 国产精品久久av| 伊人成人开心激情综合网| 久久国产精品久久久久久| 亚洲国产成人精品久久久国产成人一区| 国产精品三级在线| 亚洲电影在线观看| 欧美丰满少妇xxxx| 国产91ⅴ在线精品免费观看| 日韩在线欧美在线| 美女av一区二区三区| 日韩精品极品毛片系列视频| 亚洲嫩模很污视频| 国产一区二区三区四区福利| 亚洲精品电影网在线观看| 久久精品在线视频| 亚洲专区国产精品| 久久久久久69| 日本91av在线播放|