When creating a portfolio, blog or image gallery webpage, we often want to show a limited number of projects, articles or images at first load, but give visitors the possibility to load more with a button. In this recipe, we will go through the steps needed to implement such a solution.
More on AJAX
Again we loop through the projects as before in the HTML template and call the same snippet. This time, we store everything in the $html variable, which we add to the $json array together with the $more variable defined in the controller. Finally, we encode the array so that the template returns the data in JSON format.
But what if JavaScript is disabled? Then our fancy load-more button is of no use anymore. To make our content accessible for users when JavaScript is disabled, we need a basic fallback solution that always works, and the load-more button provides progressive enhancement for supporting browsers.
If JavaScript is enabled, we hide the pagination controls, if JavaScript is disabled, we hide the load-more button. To make the pagination look a little bit nicer, we also align the next page text on the right for some basic styling.
This should run the load_posts() function when you're 100px from the bottom of the page. In the case of the tutorial on my site you can add a check to see if the posts are loading (to prevent firing of the ajax twice), and you can fire it when the scroll reaches the top of the footer
Uncaught ReferenceError: misha_loadmore_params is not defined at HTMLDivElement. (neo-loadmore.js:7) at HTMLDivElement.dispatch (jquery-1.10.1.min.js:5) at HTMLDivElement.v.handle (jquery-1.10.1.min.js:5)
Do you have any video for this tutorial ?? I want to add it into divi theme blog module .. Basically i had first implement it on index page. When I click on view more button , nothing happned . Then I check the console .. I got following error ..ReferenceError: misha_loadmore_params is not defined
An update:I found that my request is always "ORDER BY wp_posts.menu_order, wp_posts.post_date DESC", and it only happens using ajax. I tried to put orderby in all argurments and reseting wp_query but I can`t change the order.
For who having same problem, that the posts inside ajax is not ordering, you have to suppress the filters, because it goes through ajax-admin and add some weird order filter. Just add in args:'suppress_filters' => true;
Hey Misha, this is so good. Thank you so much for putting this online.I got it working in custom theme, but now I want to use it on different pages where the pages only show posts from a certain category (only ever 1 cat per page) but I am really struggling as to where I pass the category from the page to the scripts so that when I click the button to show more it only shows more of the same category.
The benefit of using Ajax to load more posts is that our page will not refresh. This means that we can remember things in plain javascript, without the need of storing data in localStorage or using some sort of $store as we have in React or Vue. A simple variable in javascript will do just fine.
I hope my article was clear and helpful for you to create your own ajax load more button. You can play with this to update our code that instead of clicking on the load more button, you will trigger our load-more function when we reach the bottom of the page. This is a way to create a simple infinite-scroll without any plugins.
Hi Alessandro, thank you for your message. To combine the load more with filters, you need to pass your current filters into the load-more function as well. I will try to add a section to this post later this week. But for your JS it would look like this:
Hi Alessandro! I am also trying to add this load more button to a category page. I updated my code to match the updates you made but I am still having issues. Can you update where you added the additional currentPage reset?
In this article, we will see the example of load more data in laravel using ajax jquery. Many websites have huge content, when you scroll down the page for more content at that time it will take some time to load more data. So, here we will auto load more data on page scroll using ajax.
To use pagination, you must tell Select2 to add any necessary pagination parameters to the request by overriding the ajax.data setting. The current page to be retrieved is stored in the params.page property.
If your server-side code does not generate the pagination.more property in the response, you can use processResults to generate this value from other information that is available. For example, suppose your API returns a count_filtered value that tells you how many total (unpaginated) results are available in the data set. If you know that your paginated API returns 10 results at a time, you can use this along with the value of count_filtered to compute the value of pagination.more:
You can tell Select2 to wait until the user has finished typing their search term before triggering the AJAX request. Simply use the ajax.delay configuration option to tell Select2 how long to wait after a user has stopped typing before sending the request:
If there isn't a single url for your search results, or you need to call a function to determine the url to use, you can specify a callback for the ajax.url option to generate the url. The current search query will be passed in through the params option:
I have inherited a project using a child theme based on the Avada theme. The previous developer has created a plugin to add custom elements to the Avada fusion builder. One of those elements, the Community Filter element, loops through a CPT named 'custom_people' and asks that you specify one or more taxonomy terms to be displayed within that loop on the front end. This element also functions with AJAX, where you can filter the results using the filter form, that sits above the cards, or you can click a load more button below the cards that will load the next 8 (or whatever number you specify) cards.
However, if I click the 'load more' button that's underneath the second row of cards in the photo, all cards disappear. So this leads me to believe that there is something that I've left out in my AJAX function, now that I've added the code snippets mentioned above.
(From original post: All is working fine if only one term is selected, but if two terms are selected, the filter and load more buttons, when clicked, produce no results. In other words, if you click the load more button, or perform a filter submission, no additional results get populated, and all currently displayed posts disappear.)
Looking at !topics!forms_api_reference.html/7.x because I haven't seen a page updated for Drupal 8, it seems like only a select few form elements are allowed to have #ajax on them. Isn't this too limiting? I want to do Ajax on a markup element. There are a lot of scenarios in which I would want to do Ajax with my own custom HTML, but I don't want to lose the functionality of the Form API, like getting the $form and $form_state.
You\u2019re ready to thrive, learn, share, and connect with others. And you\u2019re not alone.", "imageupload.max_uploaded_images_per_upload" : 10, "imageupload.max_uploaded_images_per_user" : 5000, "integratedprofile.connect_mode" : "", "tkb.toc_maximum_heading_level" : "", "tkb.toc_heading_list_style" : "disc", "sharedprofile.show_hovercard_score" : true, "config.search_before_post_scope" : "community", "tkb.toc_heading_indent" : "", "p13n.cta.recommendations_feed_dismissal_timestamp" : -1, "imageupload.max_file_size" : 4000, "layout.show_batch_checkboxes" : false, "integratedprofile.cta_connect_slim_dismissal_timestamp" : -1 }, "isAnonymous" : true, "policies" : "image-upload.process-and-remove-exif-metadata" : false , "registered" : false, "emailRef" : "", "id" : -1, "login" : "Community Alums" }, "Server" : "communityPrefix" : "/community/s/cgfwn76974", "nodeChangeTimeStamp" : 1675880607242, "tapestryPrefix" : "/community", "deviceMode" : "DESKTOP", "responsiveDeviceMode" : "DESKTOP", "membershipChangeTimeStamp" : "0", "version" : "22.12", "branch" : "22.12-release", "showTextKeys" : false , "Config" : "phase" : "prod", "integratedprofile.cta.reprompt.delay" : 30, "profileplus.tracking" : "profileplus.tracking.enable" : false, "profileplus.tracking.click.enable" : false, "profileplus.tracking.impression.enable" : false , "app.revision" : "2302010131-s48b13a6fef-b73", "navigation.manager.community.structure.limit" : "2500" , "Activity" : "Results" : [ ] , "NodeContainer" : "viewHref" : " -p/it-operations-management", "description" : "", "id" : "it-operations-management", "shortTitle" : "IT Operations Management", "title" : "ITOM", "nodeType" : "category" , "Page" : "skins" : [ "servicenow", "theme_hermes", "responsive_peak" ], "authUrls" : "loginUrl" : "/community/s/plugins/common/feature/oidcss/sso_login_redirect/providerid/default?referer=https%3A%2F%2Fwww.servicenow.com%2Fcommunity%2Fitom-forum%2Freturn-multiple-values-from-glide-ajax%2Fm-p%2F907755%2Fthread-id%2F14655", "loginUrlNotRegistered" : "/community/s/plugins/common/feature/oidcss/sso_login_redirect/providerid/default?redirectreason=notregistered&referer=https%3A%2F%2Fwww.servicenow.com%2Fcommunity%2Fitom-forum%2Freturn-multiple-values-from-glide-ajax%2Fm-p%2F907755%2Fthread-id%2F14655", "loginUrlNotRegisteredDestTpl" : "/community/s/plugins/common/feature/oidcss/sso_login_redirect/providerid/default?redirectreason=notregistered&referer=%7B%7BdestUrl%7D%7D" , "name" : "ForumTopicPage", "rtl" : false, "object" : "viewHref" : "/community/itom-forum/return-multiple-values-from-glide-ajax/td-p/907755", "subject" : "Return multiple values from Glide Ajax", "id" : 907755, "page" : "ForumTopicPage", "type" : "Thread" , "WebTracking" : "Activities" : , "path" : "Community:ServiceNow Community/Category:Products/Category:IT Operations Management/Board:ITOM forum/Message:Return multiple values from Glide Ajax" , "Feedback" : "targeted" : , "Seo" : "markerEscaping" : "pathElement" : "prefix" : "@", "match" : "^[0-9][0-9]$" , "enabled" : false , "TopLevelNode" : "viewHref" : " ", "description" : "", "id" : "cgfwn76974", "shortTitle" : "ServiceNow Community", "title" : "ServiceNow Community", "nodeType" : "Community" , "Community" : "viewHref" : " ", "integratedprofile.lang_code" : "en", "integratedprofile.country_code" : "US", "id" : "cgfwn76974", "shortTitle" : "ServiceNow Community", "title" : "ServiceNow Community" , "CoreNode" : "conversationStyle" : "forum", "viewHref" : " -forum/bd-p/it-operations-management-forum", "settings" : , "description" : "", "id" : "it-operations-management-forum", "shortTitle" : "ITOM forum", "title" : "ITOM forum", "nodeType" : "Board", "ancestors" : [ "viewHref" : " -p/it-operations-management", "description" : "", "id" : "it-operations-management", "shortTitle" : "IT Operations Management", "title" : "ITOM", "nodeType" : "category" , "viewHref" : " -p/product-discussions", "description" : "", "id" : "product-discussions", "shortTitle" : "Products", "title" : "Products", "nodeType" : "category" , "viewHref" : " ", "description" : "", "id" : "cgfwn76974", "shortTitle" : "ServiceNow Community", "title" : "ServiceNow Community", "nodeType" : "Community" ] };LITHIUM.Components.RENDER_URL = '/community/util/componentrenderpage/component-id/#component-id?render_behavior=raw';LITHIUM.Components.ORIGINAL_PAGE_NAME = 'forums/v5/ForumTopicPage';LITHIUM.Components.ORIGINAL_PAGE_ID = 'ForumTopicPage';LITHIUM.Components.ORIGINAL_PAGE_CONTEXT = 'z1AXDqaQxu4goDC2ZkoJju3TzPRX7mN-mj0twfIuLiD5MVJL2zy4KBifUETkAV2aPLlWvI495VKgSzKV43Mcnyxt1Ztznf5f8qQ0jyZ7MXFKa7FvJbiFBXqxs8ZK9UG8L5EdnRxlfSa1cwg96Aiwwf77Z9C1_QX_0Ha5AnKj9bMCrHURfGL7Aqj57R2ih_5__NzKW-dji_vHNF_zK7bO6GWMppSaCe6GiLngR3rmp5RJ9zlFo4qenRcp-nv1otLGGnqFWesY0WxW5YYBdNWs9IicWGOuyNlCtOYWtSJt-aOXrE1o51RvPaLU9c2DWWKYVaoAuQrUTE2QECNts25SPiz6I-iW7a_iJlm8jubk-Kdz1FPKVYLzitVIS95VBZjEikVwDsTnLirR4NWvH6vX5kn8l_2Lp80jEAuKB6szqEvgPd16TBRUo5d97WX_lJWQ';LITHIUM.Css = "BASE_DEFERRED_IMAGE" : "lia-deferred-image", "BASE_BUTTON" : "lia-button", "BASE_SPOILER_CONTAINER" : "lia-spoiler-container", "BASE_TABS_INACTIVE" : "lia-tabs-inactive", "BASE_TABS_ACTIVE" : "lia-tabs-active", "BASE_AJAX_REMOVE_HIGHLIGHT" : "lia-ajax-remove-highlight", "BASE_FEEDBACK_SCROLL_TO" : "lia-feedback-scroll-to", "BASE_FORM_FIELD_VALIDATING" : "lia-form-field-validating", "BASE_FORM_ERROR_TEXT" : "lia-form-error-text", "BASE_FEEDBACK_INLINE_ALERT" : "lia-panel-feedback-inline-alert", "BASE_BUTTON_OVERLAY" : "lia-button-overlay", "BASE_TABS_STANDARD" : "lia-tabs-standard", "BASE_AJAX_INDETERMINATE_LOADER_BAR" : "lia-ajax-indeterminate-loader-bar", "BASE_AJAX_SUCCESS_HIGHLIGHT" : "lia-ajax-success-highlight", "BASE_CONTENT" : "lia-content", "BASE_JS_HIDDEN" : "lia-js-hidden", "BASE_AJAX_LOADER_CONTENT_OVERLAY" : "lia-ajax-loader-content-overlay", "BASE_FORM_FIELD_SUCCESS" : "lia-form-field-success", "BASE_FORM_WARNING_TEXT" : "lia-form-warning-text", "BASE_FORM_FIELDSET_CONTENT_WRAPPER" : "lia-form-fieldset-content-wrapper", "BASE_AJAX_LOADER_OVERLAY_TYPE" : "lia-ajax-overlay-loader", "BASE_FORM_FIELD_ERROR" : "lia-form-field-error", "BASE_SPOILER_CONTENT" : "lia-spoiler-content", "BASE_FORM_SUBMITTING" : "lia-form-submitting", "BASE_EFFECT_HIGHLIGHT_START" : "lia-effect-highlight-start", "BASE_FORM_FIELD_ERROR_NO_FOCUS" : "lia-form-field-error-no-focus", "BASE_EFFECT_HIGHLIGHT_END" : "lia-effect-highlight-end", "BASE_SPOILER_LINK" : "lia-spoiler-link", "BASE_DISABLED" : "lia-link-disabled", "FACEBOOK_LOGOUT" : "lia-component-users-action-logout", "FACEBOOK_SWITCH_USER" : "lia-component-admin-action-switch-user", "BASE_FORM_FIELD_WARNING" : "lia-form-field-warning", "BASE_AJAX_LOADER_FEEDBACK" : "lia-ajax-loader-feedback", "BASE_AJAX_LOADER_OVERLAY" : "lia-ajax-loader-overlay", "BASE_LAZY_LOAD" : "lia-lazy-load";LITHIUM.noConflict = true;LITHIUM.useCheckOnline = false;LITHIUM.RenderedScripts = [ "ElementQueries.js", "jquery.effects.slide.js", "jquery.ui.position.js", "PolyfillsAll.js", "Components.js", "jquery.ui.resizable.js", "jquery.lithium-selector-extensions.js", "jquery.position-toggle-1.0.js", "HelpIcon.js", "MessageViewDisplay.js", "AjaxSupport.js", "InlineMessageEditor.js", "jquery.blockui.js", "jquery.autocomplete.js", "InlineMessageReplyContainer.js", "jquery.function-utils-1.0.js", "jquery.appear-1.1.1.js", "Throttle.js", "ActiveCast3.js", "Auth.js", "InlineMessageReplyEditor.js", "prism.js", "Link.js", "AutoComplete.js", "LiModernizr.js", "jquery.json-2.6.0.js", "Attachments.js", "jquery.ui.core.js", "ElementMethods.js", "jquery.iframe-transport.js", "Events.js", "OoyalaPlayer.js", "MessageBodyDisplay.js", "jquery.ajax-cache-response-1.0.js", "ForceLithiumJQuery.js", "Forms.js", "SearchForm.js", "DataHandler.js", "DropDownMenuVisibilityHandler.js", "jquery.placeholder-2.0.7.js", "Text.js", "Globals.js", "Loader.js", "jquery.delayToggle-1.0.js", "Lithium.js", "addthis_widget.js", "Video.js", "jquery.css-data-1.0.js", "NoConflict.js", "ProductTagList.js", "jquery.ui.dialog.js", "Sandbox.js", "jquery.ui.widget.js", "jquery.tools.tooltip-1.2.6.js", "Cache.js", "jquery.ui.mouse.js", "jquery.effects.core.js", "InformationBox.js", "jquery.fileupload.js", "Placeholder.js", "DropDownMenu.js", "jquery.viewport-1.0.js", "SearchAutoCompleteToggle.js", "jquery.ui.draggable.js", "jquery.iframe-shim-1.0.js", "LazyLoadComponent.js", "jquery.js", "json2.js", "ResizeSensor.js", "ThreadedDetailMessageList.js", "jquery.hoverIntent-r6.js", "CustomEvent.js", "EarlyEventCapture.js", "DeferredImages.js", "Tooltip.js", "jquery.tmpl-1.1.1.js", "AjaxFeedback.js", "Namespace.js", "jquery.clone-position-1.0.js", "SpoilerToggle.js", "jquery.scrollTo.js", "PartialRenderProxy.js"];(function(){LITHIUM.AngularSupport=function(){function g(a,c)var d,f,b=coreModule:"li.community",coreModuleDeps:[],noConflict:!0,bootstrapElementSelector:".lia-page .min-width .lia-content",bootstrapApp:!0,debugEnabled:!1,useCsp:!0,useNg2:!1,k=function()var a;return function(b)();LITHIUM.Angular=;return{preventGlobals:LITHIUM.Globals.preventGlobals,restoreGlobals:LITHIUM.Globals.restoreGlobals,init:function(){var a=[],c=document.querySelector(b.bootstrapElementSelector);a.push(b.coreModule);b.customerModules&&0(window.BOOMR_mq=window.BOOMR_mq[]).push(["addVar","rua.upush":"false","rua.cpush":"true","rua.upre":"false","rua.cpre":"false","rua.uprl":"false","rua.cprl":"false","rua.cprf":"false","rua.trans":"SJ-8bd54bd4-e065-4933-9b9a-e7e527c4d3c4","rua.cook":"false","rua.ims":"false","rua.ufprl":"false","rua.cfprl":"false","rua.isuxp":"false","rua.texp":"norulematch"]); !function(a){var e=" -mpulse.net/boomerang/",t="addEventListener";if("True"=="True")a.BOOMR_config=a.BOOMR_config,a.BOOMR_config.PageParams=a.BOOMR_config.PageParams,a.BOOMR_config.PageParams.pci=!0,e=" -mpulse.net/boomerang/";if(window.BOOMR_API_key="RL5JW-PHDQ7-UYYZD-J2FGS-FE4LN",function(){function n(e)a.BOOMR_onload=e&&e.timeStampif(!a.BOOMR!a.BOOMR.version&&!a.BOOMR.snippetExecuted){a.BOOMR=a.BOOMR,a.BOOMR.snippetExecuted=!0;var i,_,o,r=document.createElement("iframe");if(a[t])a[t]("load",n,!1);else if(a.attachEvent)a.attachEvent("onload",n);r.src="javascript:void(0)",r.title="",r.role="presentation",(r.frameElementr).style.cssText="width:0;height:0;border:0;display:none;",o=document.getElementsByTagName("script")[0],o.parentNode.insertBefore(r,o);try_=r.contentWindow.documentcatch(O)i=document.domain,r.src="javascript:var d=document.open();d.domain='"+i+"';void(0);",_=r.contentWindow.document_.open()._l=function()var a=this.createElement("script");if(i)this.domain=i;a.id="boomr-if-as",a.src=e+"RL5JW-PHDQ7-UYYZD-J2FGS-FE4LN",BOOMR_lstart=(new Date).getTime(),this.body.appendChild(a),_.write(" 2ff7e9595c
Comments