Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在搜索比较中通过jquery在页面内排列搜索结果_Javascript_Jquery_Pagination - Fatal编程技术网

Javascript 在搜索比较中通过jquery在页面内排列搜索结果

Javascript 在搜索比较中通过jquery在页面内排列搜索结果,javascript,jquery,pagination,Javascript,Jquery,Pagination,我正在做一个预订比较引擎,我有一个非常敏感的问题 交易是我有3-4个不同的来源来比较结果。每个数据提供程序都有自己的API,在每个搜索方法中都有另一个分页,因此可以向它们发送请求: 页面大小 页码 搜索参数 你基本上得到了回报: 搜索结果 结果量 使用给定搜索参数返回的对象数 所以我通过JQuery填充它们。实际上,一个Ajax GET请求被发送到我的 www.mysite.com/search_script.php 结果被填充 假设我们有: Source1.com/api.php Source

我正在做一个预订比较引擎,我有一个非常敏感的问题

交易是我有3-4个不同的来源来比较结果。每个数据提供程序都有自己的API,在每个搜索方法中都有另一个分页,因此可以向它们发送请求:

页面大小 页码 搜索参数 你基本上得到了回报:

搜索结果 结果量 使用给定搜索参数返回的对象数 所以我通过JQuery填充它们。实际上,一个Ajax GET请求被发送到我的

www.mysite.com/search_script.php

结果被填充

假设我们有:

Source1.com/api.php Source2.com/api.php 在我们的网站上,我们需要安排好分页。说好,我的意思是专业制作,这样我们就不会加载太多的浏览器,服务器也不会有太多的API查询

我想我可以这样做:

如果在我的站点中,我的分页是每页10个结果,那么我会查询这两个源,请求每页返回5个结果

但我将面临两类问题:

第1页返回第5页,共23页,仅返回第2页4页 5+4,5+0,5+0

两者都有5个以上,但一个比第二个早结束,比如说12和5 5-5,5-0,5/0

不是一个好的解决方案

对于这种情况,什么是训练

第一个是soap调用

    SOAP 1.2

The following is a sample SOAP 1.2 request and response. The placeholders shown need to be replaced with actual values.

POST /partnerV3/Webservice.asmx HTTP/1.1
Host: webservices.interhome.com
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Header>
    <ServiceAuthHeader xmlns="http://www.interhome.com/webservice">
      <Username>string</Username>
      <Password>string</Password>
    </ServiceAuthHeader>
  </soap12:Header>
  <soap12:Body>
    <Search xmlns="http://www.interhome.com/webservice">
      <inputValue>
        <Page>int</Page>
        <PageSize>int</PageSize>
        <OrderDirection>NotSet or Ascending or Descending</OrderDirection>
        <OrderBy>NotSet or Favorite or Price or Place</OrderBy>
        <LanguageCode>string</LanguageCode>
        <CurrencyCode>string</CurrencyCode>
        <SalesOfficeCode>string</SalesOfficeCode>
        <Quicksearch>string</Quicksearch>
        <CountryCode>string</CountryCode>
        <RegionCode>string</RegionCode>
        <PlaceCode>string</PlaceCode>
        <CheckIn>string</CheckIn>
        <Duration>int</Duration>
        <ThemeFilter>NotSet or Cheepcheep or Countryside or Familyfriendly or HolidayVillage or LakesAndMountains or Nightlife or Selection or SomewhereQuiet or SummerHoliday or Cities or SuitableForSeniors</ThemeFilter>
        <HouseApartmentType>NotSet or Apartment or DetachedHouse or House</HouseApartmentType>
        <Facilities>
          <Facilities>NotSet or Aircondition or Balcony or BBQ or Cot or Dishwasher or Fireplace or Internet or InternetWiFi or Jacuzzi or LuxuriousFurnishings or ModernFurnishings or NiceKitchen or NiceSourroundings or Parking or LiftsInhouse or NonSmoker or Pets1 or Pets2 or Pets3 or PetsNo or PoolAll or PoolChildren or PoolIndoor or PoolPrivate or Sauna or Swimmingpool or TV or WashingMachine or Wheelchair</Facilities>
          <Facilities>NotSet or Aircondition or Balcony or BBQ or Cot or Dishwasher or Fireplace or Internet or InternetWiFi or Jacuzzi or LuxuriousFurnishings or ModernFurnishings or NiceKitchen or NiceSourroundings or Parking or LiftsInhouse or NonSmoker or Pets1 or Pets2 or Pets3 or PetsNo or PoolAll or PoolChildren or PoolIndoor or PoolPrivate or Sauna or Swimmingpool or TV or WashingMachine or Wheelchair</Facilities>
        </Facilities>
        <Accessibilities>
          <Accessibilities>NotSet or FamilyFrienldy or LiftsInhouse or NonSmoking or PetsWelcome or PetsNotAllowed or SuitableForSeniors or WheelchairAccessible</Accessibilities>
          <Accessibilities>NotSet or FamilyFrienldy or LiftsInhouse or NonSmoking or PetsWelcome or PetsNotAllowed or SuitableForSeniors or WheelchairAccessible</Accessibilities>
        </Accessibilities>
        <Activities>
          <Activities>NotSet or Biking or CrossCountrySkiing or Golfing or Hiking or MountainBiking or Nightlife or NordicWalking or Riding or Sailing or Skiing or Snowboarding or Surfing or Tennis or ThemeParkNearby or Toboggan or Windsurfing or SkiingSnowboarding</Activities>
          <Activities>NotSet or Biking or CrossCountrySkiing or Golfing or Hiking or MountainBiking or Nightlife or NordicWalking or Riding or Sailing or Skiing or Snowboarding or Surfing or Tennis or ThemeParkNearby or Toboggan or Windsurfing or SkiingSnowboarding</Activities>
        </Activities>
        <Situations>
          <Situations>NotSet or ByTheSea or InAHistoricTown or InAMajorCity or InTheCountryside or InALakesideTown or SomewhereQuiet or OnAIsland or Center100 or Center500 or Center1000 or Golf200 or Golf500 or Golf5000 or Lake50 or Lake1000 or Lake10000 or Sea50 or Sea1000 or Sea10000 or Skilift50 or Skilift500 or Skilift10000 or CountryView or LakeView or MountainView or SeaView</Situations>
          <Situations>NotSet or ByTheSea or InAHistoricTown or InAMajorCity or InTheCountryside or InALakesideTown or SomewhereQuiet or OnAIsland or Center100 or Center500 or Center1000 or Golf200 or Golf500 or Golf5000 or Lake50 or Lake1000 or Lake10000 or Sea50 or Sea1000 or Sea10000 or Skilift50 or Skilift500 or Skilift10000 or CountryView or LakeView or MountainView or SeaView</Situations>
        </Situations>
        <PropertyTypes>
          <PropertyTypes>NotSet or Apartment or Bungalow or CastleManor or Chalet or DetachedHouse or Farmhouse or HistoricProperty or HolidayVillage or SpecialProperty or Villa</PropertyTypes>
          <PropertyTypes>NotSet or Apartment or Bungalow or CastleManor or Chalet or DetachedHouse or Farmhouse or HistoricProperty or HolidayVillage or SpecialProperty or Villa</PropertyTypes>
        </PropertyTypes>
        <SpecialOffer>NotSet or AnySpecialOffer or EarlyBooker or LastMinute</SpecialOffer>
        <PaxMin>int</PaxMin>
        <PaxMax>int</PaxMax>
        <RoomsMin>int</RoomsMin>
        <RoomsMax>int</RoomsMax>
        <BedroomsMin>int</BedroomsMin>
        <BedroomsMax>int</BedroomsMax>
        <BathroomsMin>int</BathroomsMin>
        <BathroomsMax>int</BathroomsMax>
        <QualityMin>int</QualityMin>
        <QualityMax>int</QualityMax>
        <DistanceToCenter>int</DistanceToCenter>
        <DistanceToGolfCourse>int</DistanceToGolfCourse>
        <DistanceToLake>int</DistanceToLake>
        <DistanceToSea>int</DistanceToSea>
        <DistanceToSeaOrLake>int</DistanceToSeaOrLake>
        <DistanceToSkiLifts>int</DistanceToSkiLifts>
      </inputValue>
    </Search>
  </soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <SearchResponse xmlns="http://www.interhome.com/webservice">
      <SearchResult>
        <ResultCount>int</ResultCount>
        <Items>
          <SearchResultItem>
            <AccommodationCode>string</AccommodationCode>
            <Country>string</Country>
            <CountryCode>string</CountryCode>
            <Region>string</Region>
            <RegionCode>string</RegionCode>
            <Place>string</Place>
            <PlaceCode>string</PlaceCode>
            <Zip>string</Zip>
            <CurrencyCode>string</CurrencyCode>
            <Price>decimal</Price>
            <Quality>int</Quality>
            <Type>string</Type>
            <Pax>int</Pax>
            <Rooms>int</Rooms>
            <BedRooms>int</BedRooms>
            <Pets>int</Pets>
            <Cots>int</Cots>
            <AdditionBeds>int</AdditionBeds>
            <Parking>boolean</Parking>
            <TV>boolean</TV>
            <Dishwasher>boolean</Dishwasher>
            <Washingmachine>boolean</Washingmachine>
            <Aircondition>boolean</Aircondition>
            <Pool>boolean</Pool>
            <Tennis>boolean</Tennis>
            <Sauna>boolean</Sauna>
            <Wheelchair>boolean</Wheelchair>
            <GeoLng>decimal</GeoLng>
            <GeoLat>decimal</GeoLat>
            <InsideDescription>string</InsideDescription>
            <Picture>string</Picture>
          </SearchResultItem>
          <SearchResultItem>
            <AccommodationCode>string</AccommodationCode>
            <Country>string</Country>
            <CountryCode>string</CountryCode>
            <Region>string</Region>
            <RegionCode>string</RegionCode>
            <Place>string</Place>
            <PlaceCode>string</PlaceCode>
            <Zip>string</Zip>
            <CurrencyCode>string</CurrencyCode>
            <Price>decimal</Price>
            <Quality>int</Quality>
            <Type>string</Type>
            <Pax>int</Pax>
            <Rooms>int</Rooms>
            <BedRooms>int</BedRooms>
            <Pets>int</Pets>
            <Cots>int</Cots>
            <AdditionBeds>int</AdditionBeds>
            <Parking>boolean</Parking>
            <TV>boolean</TV>
            <Dishwasher>boolean</Dishwasher>
            <Washingmachine>boolean</Washingmachine>
            <Aircondition>boolean</Aircondition>
            <Pool>boolean</Pool>
            <Tennis>boolean</Tennis>
            <Sauna>boolean</Sauna>
            <Wheelchair>boolean</Wheelchair>
            <GeoLng>decimal</GeoLng>
            <GeoLat>decimal</GeoLat>
            <InsideDescription>string</InsideDescription>
            <Picture>string</Picture>
          </SearchResultItem>
        </Items>
      </SearchResult>
    </SearchResponse>
  </soap12:Body>
</soap12:Envelope>

第二个也是一样的….

您需要为每个连接创建对象

此对象将加载加载到数组中的内容。它们可以表示为:

function Connection( searchQuery, callback )
{
    var result = []; // use to save what you load
    this.total; // total searching found

    this.getResult = function( start, length, callback ){}; // it's is one of the possibilities.
    // this function should verify if the content is already loaded in result[] or not. If not, load then. There is no problem of loading more then needed.
}
当您得出结论时,其工作方式应类似于:

var conn = new Connection( "...", objectIsWorkable ); // load the first XX results and get the total found stuff.
conn.getResult( 0, 5, whenLoaded );
完成这项工作后,您可以做您真正想做的事情:

var pageController = function( queries, callback )
{
    var ITEM_PER_CONNECTION = 5;
    var ITEM_PER_PAGE = 10;
    var conns = []; // used to save all connections
    var pages = []; // use to save the pages to be loaded
    var loaded = 0;

    var onLoadedCallback = callback;

    var totalConnPage;
    var onPageLoadedCallback;
    var tempPage; // the items loaded are saved here.
    var appendToTempPage = function( value )
    {
        for( var i in value ) tempPage.push( value[i] );
        loaded++;
        if( loaded == totalConnPage ) onPageLoadedCallback( tempPage );
    }

    this.loadPage = function( num, callback )
    {
        onPageLoadedCallback = callback;

        loaded = 0;
        tempPage = [];
        totalConnPage = 0;
        var current = pages[num];
        for( var i = 0; i < current.length; i++ )
        {
            if( current[i] != null )
            {
                conns[i].getResult( current[i][0], current[i][1], appendToTempPage );
                totalConnPage++;
            }
        }
    }

    var makePages = function()
    {
        // get the total
        var total = 0;
        var totals = [];
        for( var i in conns )
        {
            total += conns[i].total;
            totals.push( 0 );
        }

        // create the page list
        while( total > 0 )
        {
            var temp = total > ITEMS_PER_PAGE ? ITEMS_PER_PAGE : total;
            total -= temp;
            var page = [];
            var index = 0;
            while( temp > 0 )
            {
                if( totals[index] < conns[index].total )
                {
                    if( conns[index].total - totals[index] >= ITEM_PER_CONNECTION )
                    {
                        var next = temp > ITEM_PER_CONNECTION ? ITEM_PER_CONNECTION : temp;
                        page.push( [totals[index], next] );
                        totals[index] += next;
                        temp -= next;
                    }
                    else
                    {
                        var next = conns[index].total - totals[index];
                        next = next > temp ? temp : next;
                        page.push( [totals[index], next] );
                        totals[index] += next;
                        temp -= next;
                    }
                }
                else
                    page.push( null );


                index++;
            }

            pages.push( page );
        }
    }

    var inited = function()
    {
        pages[loaded] = 0;
        loaded++;

        if( loaded == conns.length )
        {
            makePages();
            onLoadedCallback();
        }
    }

    // init
    for( var i in queries )
        conns.push( new Connection( queries[i], inited ) );
}
最重要的是makePages,这可能就是你想做的。但你的问题有点长,然后我又多提了一点,以免混淆


您可以更改makePage以自己的方式工作。其思想是将所有页面内容保存在页面变量中。

您需要为每个连接创建对象

此对象将加载加载到数组中的内容。它们可以表示为:

function Connection( searchQuery, callback )
{
    var result = []; // use to save what you load
    this.total; // total searching found

    this.getResult = function( start, length, callback ){}; // it's is one of the possibilities.
    // this function should verify if the content is already loaded in result[] or not. If not, load then. There is no problem of loading more then needed.
}
当您得出结论时,其工作方式应类似于:

var conn = new Connection( "...", objectIsWorkable ); // load the first XX results and get the total found stuff.
conn.getResult( 0, 5, whenLoaded );
完成这项工作后,您可以做您真正想做的事情:

var pageController = function( queries, callback )
{
    var ITEM_PER_CONNECTION = 5;
    var ITEM_PER_PAGE = 10;
    var conns = []; // used to save all connections
    var pages = []; // use to save the pages to be loaded
    var loaded = 0;

    var onLoadedCallback = callback;

    var totalConnPage;
    var onPageLoadedCallback;
    var tempPage; // the items loaded are saved here.
    var appendToTempPage = function( value )
    {
        for( var i in value ) tempPage.push( value[i] );
        loaded++;
        if( loaded == totalConnPage ) onPageLoadedCallback( tempPage );
    }

    this.loadPage = function( num, callback )
    {
        onPageLoadedCallback = callback;

        loaded = 0;
        tempPage = [];
        totalConnPage = 0;
        var current = pages[num];
        for( var i = 0; i < current.length; i++ )
        {
            if( current[i] != null )
            {
                conns[i].getResult( current[i][0], current[i][1], appendToTempPage );
                totalConnPage++;
            }
        }
    }

    var makePages = function()
    {
        // get the total
        var total = 0;
        var totals = [];
        for( var i in conns )
        {
            total += conns[i].total;
            totals.push( 0 );
        }

        // create the page list
        while( total > 0 )
        {
            var temp = total > ITEMS_PER_PAGE ? ITEMS_PER_PAGE : total;
            total -= temp;
            var page = [];
            var index = 0;
            while( temp > 0 )
            {
                if( totals[index] < conns[index].total )
                {
                    if( conns[index].total - totals[index] >= ITEM_PER_CONNECTION )
                    {
                        var next = temp > ITEM_PER_CONNECTION ? ITEM_PER_CONNECTION : temp;
                        page.push( [totals[index], next] );
                        totals[index] += next;
                        temp -= next;
                    }
                    else
                    {
                        var next = conns[index].total - totals[index];
                        next = next > temp ? temp : next;
                        page.push( [totals[index], next] );
                        totals[index] += next;
                        temp -= next;
                    }
                }
                else
                    page.push( null );


                index++;
            }

            pages.push( page );
        }
    }

    var inited = function()
    {
        pages[loaded] = 0;
        loaded++;

        if( loaded == conns.length )
        {
            makePages();
            onLoadedCallback();
        }
    }

    // init
    for( var i in queries )
        conns.push( new Connection( queries[i], inited ) );
}
最重要的是makePages,这可能就是你想做的。但你的问题有点长,然后我又多提了一点,以免混淆


您可以更改makePage以自己的方式工作。想法是将所有页面内容保存在pages var.

中。我试图编辑您的问题,以便更准确地表示您的问题,但这两类问题需要您做更多的工作,以便其他人而不是您自己能够理解。这两种api中是否有参数可以返回可以检索的全部结果,不仅仅是你要求的最大值?然后,您可以使用每个api的总整数作为变量来计算如何实现分页。@除“是”之外,我还可以从两个部分查询100个结果。。或者200。。。但例如,当我检索到1000个结果时?@Nicolás噢,非常感谢。我认为我的问题是非常实际的,应该有一个很好的解决方案,我找不到,因为缺乏ajax搜索方面的经验……也许我们的一些专家可以挖掘momondo.com或swoodoo.com jquery脚本来了解这些大兄弟是如何做的?说实话,我无法理解自己……我试图编辑你的问题,以便更准确地表达你的问题,但这两类问题需要你做更多的工作,以便其他人而不是你自己能够理解。这两种api中是否都有一个参数可以返回可检索的全部结果,不仅仅是你要求的最大值?然后,您可以使用每个api的总整数作为变量来计算如何实现分页。@除“是”之外,我还可以从两个部分查询100个结果。。或者200。。。但例如,当我检索到1000个结果时?@Nicolás噢,非常感谢。我认为我的问题是非常实际的,应该有一个很好的解决方案,我找不到,因为缺乏ajax搜索方面的经验……也许我们的一些专家可以挖掘momondo.com或swoodoo.com jquery脚本来了解这些大兄弟是如何做的?说实话,我想不起来自己了……谢谢你抽出时间。我想我明天应该在你的代码里挖一点。我现在很困…:谢谢你抽出时间。我想我明天应该在你的代码里挖一点。我现在很困…: