自己在项目中写的一个Jquery插件和Jquery tab 功能

后台查询结果 PDFSearchResult实体类:

  [DataContract(Name = "PDFSearchResult")]
    public class PDFSearchResult
    {

        public PDFSearchResult(string title, string fileUrl)
        {
            Title = title;
            FileUrl = fileUrl;
        }

        [DataMember(Name = "title")]
        public string Title { get; set; }

        [DataMember(Name = "fileUrl")]
        public string FileUrl { get; set; }

    }

另外,有一个PagedResult泛型类,PagedResult<T>

  [DataContract(Name = "pagedCollection", Namespace = "")]
    public class PagedResult<T>
    {
        public PagedResult(long totalItems, long pageNumber, long pageSize);

        [DataMember(Name = "items")]
        public IEnumerable<T> Items { get; set; }
        [DataMember(Name = "pageNumber")]
        public long PageNumber { get; }
        [DataMember(Name = "pageSize")]
        public long PageSize { get; }
        [DataMember(Name = "totalItems")]
        public long TotalItems { get; }
        [DataMember(Name = "totalPages")]
        public long TotalPages { get; }

        //
        // Summary:
        //     Calculates the skip size based on the paged parameters specified
        //
        // Remarks:
        //     Returns 0 if the page number or page size is zero
        public int GetSkipSize();
    }

后台,采用Web Api (/api/SearchApi/GetPDFSearchResults/), 返回值类型为 PagedResult<PDFSearchResult>, 是Json类型返回值

在页面表现UI层,有两个tab,左边的tab显示的是页面的搜索结果searchResult, 右边的tab显示的是pdf文件的搜索结果PDFSearchResult

页面SearchResult.cshtml如下:

<section id="searchListing" class="row search">
        <div>

            <div class="tabs">
                <ul class="tab">
                    <li data-ui="tab-nav"><a href="#">Web Page Results</a></li>
                    <li data-ui="tab-nav"><a href="#">PDF Results</a></li>
                </ul>
            </div>
                <div class="tabContent">
                    <div id="resultsArea" class="search-results" style="display:block;" data-ui="tab-content">
                        <div id="NoResultsMessage" style="display:none;">
                            <p class="results-title">No Results For<strong class="search-term"></strong>‘</p>
                        </div>
                        <div id="HasResultsMessage" style="display:none;">
                            <p class="results-title">Search Results For<strong class="search-term"></strong>‘</p>
                        </div>
                        <div class="results" id="SearchResultsContainer">
                            <article class="row">
                                <a href="#">
                                    <div>
                                        <h2></h2>
                                        <p></p>

                                        <p class="link">Read more</p>
                                    </div>
                                </a>
                            </article>
                        </div>
                        <ul class="pagination">
                            <li><a href="#" class="prev"><i class="gi icon-arrow"></i></a></li>
                            <li class="page"><a href="#"></a></li>
                            <li><a href="#" class="next"><i class="gi icon-arrow"></i></a></li>
                        </ul>
                    </div>
                    <div id="PDFResultArea" class="search-results" style="display:none;" data-ui="tab-content">
                        <div id="NoPDFResultsMessage" style="display:none;">
                            <p class="results-title">No Results For<strong class="search-term"></strong>‘</p>
                        </div>
                        <div id="HasPDFResultsMessage" style="display:none;">
                            <p class="results-title">Search Results For<strong class="search-term"></strong>‘</p>
                        </div>
                        <div class="results" id="SearchPDFResultsContainer">
                            <article class="row">
                                <a href="#">

                                </a>
                            </article>
                        </div>
                        <ul class="pagination">
                            <li><a href="#" class="prev"><i class="gi icon-arrow"></i></a></li>
                            <li class="page"><a href="#"></a></li>
                            <li><a href="#" class="next"><i class="gi icon-arrow"></i></a></li>
                        </ul>

                    </div>
                </div>
            </div>
</section>

这里,在页面展示上,应该看上去如下图:

为了在同一个页面,也就是SearchResult.cshtml中实现这个tab功能,我用JQuery写了个tab功能,如下

tab.js

function tabs(state,control,show){

    $(control + "> li").on(state, function(){

        $(this).addClass("on").siblings().removeClass("on");

        var index = $(this).index();

        $(show + "> div").eq(index).show().siblings().hide();
 })

    $(control + "> li").eq(0).attr("class", "on");
    $(show + "> div").eq(0).show();
}

tabs("click", ".tab", ".tabContent");

The css style 如下

.tabs {
  position: relative;
  margin-top: 60px;
  margin-bottom: 20px; }
  .tabs > ul {
    list-style: none;
    border-bottom: 1px solid #c0c0c0;
    margin-top: 0;
    padding: 0; }
    .tabs > ul > li {
      float: left;
      margin-bottom: -1px; }
      [dir="rtl"] .tabs > ul > li {
        float: right; }
      .tabs > ul > li a {
        display: block;
        line-height: 2;
        margin-right: .2rem;
        padding: 0 1rem;
        border: 1px solid transparent;
        text-decoration: none;
        cursor: pointer; }
        [dir="rtl"] .tabs > ul > li a {
          margin-right: 0;
          margin-left: .2rem; }
        .tabs > ul > li a:hover {
          background: #fff !important;
          border: 1px solid #fff !important;
          color: #ff7900; }
      .tabs > ul > li > [aria-selected="true"], .tabs > ul > li > [aria-selected="true"]:hover {
        background: red !important; }
    .tabs > ul li.on {
      background-color: #fff;
      border: 1px solid #c0c0c0;
      border-bottom-color: transparent;
      color: #454545;
      cursor: default; }
    .tabs > ul li.on a {
      color: #ff7900; }
  .tabs > * {
    display: none; }
  .tabs > ul,
  .tabs [tabIndex="0"] {
    display: block; }

然后,我写了一个Jquery Plugin来实现PDFSearchResult的展示功能,也就是说JSON结果,展示到SearchResult.cshtml页面上

在这个Jquery plugin中,调用ajax来调用web api (/api/SearchApi/GetPDFSearchResults/),返回json结果,展现到web页面上

view.pdfsearch.js

(function ($) {

    $.fn.PDFSearch = function (options) {

        return this.each(function () {

            var pdfSearch = $(this);

            pdfSearch.pdfResultArea = pdfSearch.find("#PDFResultArea");

            pdfSearch.noPDFResultMessage = pdfSearch.pdfResultArea.find("#NoPDFResultsMessage");
            pdfSearch.hasPDFResultMessage = pdfSearch.pdfResultArea.find("#HasPDFResultsMessage");
            pdfSearch.PDFResultContainer = pdfSearch.pdfResultArea.find("#SearchPDFResultsContainer");

            pdfSearch.searchPDFResultTemplate = pdfSearch.PDFResultContainer.find("article").clone();

            pdfSearch.queryField = $("input[name=‘search‘]");

            pdfSearch.searchTermLabel = $(".search-term");

            pdfSearch.oldTerm = undefined;
            pdfSearch.term = pdfSearch.queryField.val();

            //Paging elements
            pdfSearch.paginationWrapper = pdfSearch.pdfResultArea.find(‘ul.pagination‘);
            pdfSearch.pageTemplate = pdfSearch.paginationWrapper.find(‘.page‘).clone();
            pdfSearch.pagePrevious = pdfSearch.paginationWrapper.find(‘.prev‘);
            pdfSearch.pageNext = pdfSearch.paginationWrapper.find(‘.next‘);

            // Page tracking
            pdfSearch.pageSize = 10;
            pdfSearch.pageNumber = 1;
            pdfSearch.totalPages = 0;

            // Sets up pagination for search results.
            pdfSearch.paginate = function (data) {

                pdfSearch.totalPages = data.totalPages;
                pdfSearch.paginationWrapper.find(‘.page‘).remove();
                if (pdfSearch.totalPages > 1) {
                    pdfSearch.pagePrevious.toggle(data.pageNumber > 1);
                    pdfSearch.pageNext.toggle(data.pageNumber < pdfSearch.totalPages);

                    for (i = 1; i < pdfSearch.totalPages + 1; i++) {
                        var page = pdfSearch.pageTemplate.clone();
                        var link = page.find(‘a‘);
                        if (i == data.pageNumber)
                            page.addClass(‘active‘);
                        page.data(‘page‘, i);
                        link.text(i);

                        pdfSearch.pageNext.parent().before(page).before(‘\n\r‘);
                    }

                    pdfSearch.paginationWrapper.show(0);
                } else {
                    pdfSearch.paginationWrapper.hide(0);
                }
            }

            pdfSearch.previous = function (evt) {
                return pdfSearch.goToPage(evt, pdfSearch.pageNumber - 1);
            }

            pdfSearch.next = function (evt) {
                return pdfSearch.goToPage(evt, pdfSearch.pageNumber + 1);
            }

            pdfSearch.goToPage = function (evt, pageNumber) {
                pdfSearch.pageNumber = pageNumber || $(this).data(‘page‘);
                if (pdfSearch.pageNumber > pdfSearch.totalPages) pdfSearch.pageNumber = pdfSearch.totalPages - 1;
                if (pdfSearch.pageNumber < 1) pdfSearch.pageNumber = 1;

                pdfSearch.searchPDF();
                return false;
            }

            // filter change handler
            pdfSearch.handleQuery = function (evt) {

                pdfSearch.term = $(this).val();
                if (pdfSearch.oldTerm != pdfSearch.term) {
                    pdfSearch.oldTerm = pdfSearch.term;
                    pdfSearch.searchPDF();
                }
                return false;
            }

            pdfSearch.searchPDF = function () {
                pdfSearch.pdfResultArea.addClass("loading");

                $.ajax({
                    type: "GET",
                    url: "/umbraco/api/SearchApi/GetPDFSearchResults/",
                    dataType: "json",
                    data: {
                        filter: pdfSearch.term,
                        pageNumber: pdfSearch.pageNumber,
                        pageSize: pdfSearch.pageSize
                    },
                    success: function (data) {
                        pdfSearch.searchTermLabel.text(pdfSearch.term);
                        pdfSearch.noPDFResultMessage.hide();
                        pdfSearch.hasPDFResultMessage.hide();
                        pdfSearch.paginate(data);
                        pdfSearch.PDFResultContainer.empty();

                        if (!data.items || data.items.length == 0) {
                            pdfSearch.noPDFResultMessage.show();
                        }
                        else {
                            // Binding search result to UI
                            for (var i = 0; i < data.items.length; i++) {
                                var pdfResult = data.items[i];
                                var PdfResultTemplate = pdfSearch.searchPDFResultTemplate.clone();

                                _populatePDFContent(pdfResult, PdfResultTemplate);

                                pdfSearch.PDFResultContainer.append(PdfResultTemplate);
                            }
                            pdfSearch.hasPDFResultMessage.show();
                        }
                    },
                    complete: function () {
                        pdfSearch.searchTermLabel.text(pdfSearch.term);
                        pdfSearch.pdfResultArea.removeClass("loading");
                    }
                });
            };

            _populatePDFContent = function (result, template) {

                var pdfLinkElem = $(template.find("a"));
                pdfLinkElem.attr("href", result.fileUrl);
                pdfLinkElem.attr("target", "_blank");
                pdfLinkElem.html(result.title);

            };

            pdfSearch.queryField.on("keyup", pdfSearch.handleQuery);

            // Setup pagination triggers.
            pdfSearch.pagePrevious.on("click", pdfSearch.previous);
            pdfSearch.pageNext.on("click", pdfSearch.next);

            // Bind to all future page clicks.
            pdfSearch.paginationWrapper.on(‘click‘, ‘li.page‘, pdfSearch.goToPage);

            pdfSearch.searchPDF();

        });
    }
}(jQuery));

$(function () {
    $(‘section.search‘).PDFSearch();

});
时间: 2024-10-04 13:44:59

自己在项目中写的一个Jquery插件和Jquery tab 功能的相关文章

wg_pagenation 1.0 自己写的一个分页插件_基于Jquery

前言: 现在这个分页插件也不少,感觉缺点什么,所以自己就写了一个,喜欢的人就拿去用......有bug和建议可以回复,我有空就修改和答复..... 感谢我的基友,刘总...他主要给本插件写配套主题css; 特点: 整合ajax可以异步和后台交互数据,定制化选项多.和Jquery的pagenation比较类似,但是功能更多,选择性更多. 当前版本:1.0 完成日期:20150815 效果图: White.css的效果图: default.css效果图: 上图上向下的箭头表示的是每一个可选择和更改的

在类库或winform项目中打开另一个winform项目的窗体

假设类库或winform项目为A,另一个winform项目为B.那麽在A中添加一个接口,里面有一个Show方法,然后在B中写一个类b继承这个接口,并重写这个方法,具体内容为弹出某个窗体.然后在A中另一个类a中实例化B中的b类,并把它赋给A中的接口,然后调用接口的Show方法就可以弹出B中指定的窗体. 需要注意的是项目A和项目B需要互相引入对方的EXE或DLL文件. 转自:http://blog.csdn.net/a1027/article/details/2766396 以下为代码部分: 1 n

自定义Button供整个项目使用,一个项目中只用这一个Button即可

在做项目的过程中会发现经常需要自定义Button以便实现图片和文字的随意摆放,这样整个项目中就会有很多多余的类,具体的缺点我先列举几个场景. 1.一个button里面放置一个图片和一个文字,上面是图片,下面是文字,产品要求图片的尺寸必须是30*30,这时我们可以自定义一个button把图片尺寸写死.突然有一天又来了一个新的需求,图片要求40*40,又要新建一个类,突然有一天又来了一个需求,图片在下面,又要新建一个类,突然有一天又来了一个需求,图片的大小要根据屏幕的尺寸变化而变化,又新建了一个类,

MES项目中出现的一个事务嵌套的使用场景

昨天在MES项目中,需要在业务逻辑的几个关键点记录错误信息,需要把错误信息写入数据表. 但是由于整个业务逻辑都是包在一个事务模板里面的 比如这样的: WhhTransactionTemplate transactionTemplate2 = new WhhTransactionTemplate(true); transactionTemplate2.execute(new WhhTransactionCallback() { @SuppressWarnings({ "unchecked"

【Atom】在一个中/大型项目中,那些好用而强大的atom功能

作为一个学生党,一开始使用atom时候并没有意识到atom一些小功能的巨大作用,直到自己实习参与了项目,才知道这些功能在一个项目中是能极大提高工作效率的开发利器 下面是一位不愿意透露其姓名的彭湖湾同学(其实就是我啦)的使用体会,我们姑且称之为W同学 1.通过关键字段全项目检索目标代码文件command+shift+F(mac)ctrl+shift+F(windows) [场景一]:W同学在tower(一个团队协作工具)上接到了一个小任务,他要在公司运营的一个站点上站点模块里,对一个公告栏的bug

最近写的一个弹窗插件

最近因为项目需要,写了一个模拟弹窗的插件,代码不是很优雅,有时间改一下,欢迎拍砖 js代码: 1 /* 2 *selfWindow组建,主要是用于模拟移动网站的alert(),confirm()窗口点解某一按钮跳转到某一个页面的效果, 3 *因为给予移动web,所以没有兼容低版本ie 4 *调用方法:var win = new SelfWinsow({ 5 * types : "confirm",//这里可以选择的参数有,alert,confirm,confirm2,link 6 *

jquery插件之jquery.extend和jquery.fn.extend的区别

jquery.extend jquery.extend(),是拓展jquery这个类,即可以看作是jquery这个类本身的静态方法,例如: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/

jQuery插件实现的页面功能介绍引导页效果

新产品上线或是改版升级,我们会在用户第一次使用产品时建立一个使用向导,引导用户如何使用产品,如使用演示的方式逐一介绍界面上的功能模块,从而提升了用户体验和产品的亲和力. Helloweba.com之前也有相关文章介绍:<构建一个用于产品介绍的WEB应用>,相信对有需要的朋友有帮助.本文将介绍另一款基于jQuery的页面引导页插件:pagewalkthrough.js,来看如何使用它. 先点击这里可以看在线演示效果 HTML 首先记得加载所需的css文件和jQuery库文件,以及pagewalk

JQuery插件之Jquery.datatables.js用法及api

1.DataTables的默认配置 $(document).ready(function() { $('#example').dataTable(); } ); 示例:http://www.guoxk.com/html/DataTables/Zero-configuration.html 2.DataTables的一些基础属性配置 "bPaginate": true, //翻页功能 "bLengthChange": true, //改变每页显示数据数量 "