Welcome to Community Week 2025! Join us to learn, connect, and be recognized as we celebrate the spirit of Community and the power of AI. Get the details  

Scroll Automatically to the Bottom of the Page in Service Portal

salu
Mega Guru

Hello,

Consider I have a list of questions. When I click on the first question, it should automatically take me to the bottom of the page.

window.scrollTo(0,document.body.scrollHeight); won't work as document won't work in API.

Thanks

Saranya

1 ACCEPTED SOLUTION

Hello Mansoor,


I got the solution for the same.



$scope.scrollTo = function(id) {



var old = $location.hash();


$location.hash(id);


$anchorScroll();


//reset to old to keep any additional routing logic from kicking in


$location.hash(old);


};



<sp-model form-model="::data.sc_cat_item" mandatory="mandatory" ng-click="scrollTo('e30904d54f83e200bb603f828110c721')"   ></sp-model>


View solution in original post

23 REPLIES 23

mansoor3
Tera Contributor

Hi Saranya,



For that thing, I am not sure how that is possible. Though I did something with onchange below try this.


$scope.$on("field.change", function(evt, parms){


  if (parms.field.sys_id == "sys_id shown in elements") {// can see the sys id by clicking F12 and in elements tab


//here use that scroll option and check


  $rootScope.$broadcast("location.updated", parms.field.value);}


  });



Check this link to understand the concept of rootscope " https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/ "



-Mansoor


-Mark correct or helpful as applicable.


mansoor


Hello Mansoor,



I have used the below code and its scrolling down to bottom but once it scrolled bottom its redirecting to the first question.Can you help me to fix it.


$scope.$on("field.change", function(evt, parms){


  if (parms.field.sys_id == "7b389a854fee6240bb603f828110c710") {


  $location.hash('b810f4d14fd22e00670df0318110c760');    


  $anchorScroll();




  $rootScope.$broadcast("location.updated", parms.field.value);


  }


  });



Thanks


Saranya


Hello Mansoor,


I got the solution for the same.



$scope.scrollTo = function(id) {



var old = $location.hash();


$location.hash(id);


$anchorScroll();


//reset to old to keep any additional routing logic from kicking in


$location.hash(old);


};



<sp-model form-model="::data.sc_cat_item" mandatory="mandatory" ng-click="scrollTo('e30904d54f83e200bb603f828110c721')"   ></sp-model>


renakhanna
Kilo Contributor

Hello Saranya



This Is My UI Script




(function() {


var contentWindow = '',


iframeArray = [],


pollingDelay = 250,


prevHeight,


src = '',


blacklist = [],


bottomMargin = 30;




/**


  * Executes the proper calculation strategy and returns the internal height of the iframe.   You should edit this function if you find strategies that are not accounted for


  * @function getHeight


  */


var getHeight = function() {


if (contentWindow.$j('body')[0].style.overflow != 'hidden') {


contentWindow.$j('body')[0].style.overflow = 'hidden';


}


//if (iframePageIs('$knowledge.do') || iframePageIs('knowledge_home_launcher.do')) {


if (iframePageIs('$knowledge.do')) {


// Knowledge v3 UI


// Shrink iframe when the src changes to force a recalculation


if (src != contentWindow.location.href) {


src = contentWindow.location.href;


return 700;


}




return getTotalHeight(['.application'], 0);


}


else if (iframePageIs('kb_view.do')) {


return getTotalHeight([


'body > .outputmsg_div',


'body > .navbar',


'.kb-view-content-wrapper',


'.snc-article-header-author',


'.snc-article-footer-section',


'.snc-article-footer'


], 0);


}


else if (iframePageIs('kb_home.do')) {


return getTotalHeight([


'body .navbar',


'body > .kb_main'


], bottomMargin);


}


else


return null;


};




/**


  * @function getTotalHeight


  * @param {array} divs - Array of CSS selectors that identify the div's whose height should be added in the calculation


  * @param {int} modifier - Number of additional pixels to add as a modifier


  */


var getTotalHeight = function(divs, modifier) {


var h = 0;




$j.each(divs, function(ix, val) {


h = h + contentWindow.$j(val).height();


});




return h + modifier;


};




/**


  * Determines if the url contains the given fragment


  * @function iframePageIs


  * @param {string} urlFragment - String to search for in the iframe url


  *


  */


var iframePageIs = function (urlFragment) {


return (contentWindow.location.href.indexOf(urlFragment) != -1);


};




/**


  * A recursive polling function that gets the internal height of the iframe and resizes the it accordingly.


  * @function resizeIframeFix


  */


var resizeIframeFix = function(iframe) {


setTimeout(function() {


var curHeight;


var i;




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


if (iframePageIs(blacklist[i])) {


return;


}


}




if ($j && contentWindow.$j) {


curHeight = getHeight();




if (curHeight !== null && prevHeight != curHeight) {


$j(iframe).height(curHeight);


prevHeight = getHeight();


}


}




resizeIframeFix(iframe);


}, pollingDelay);


};




// Initiate knowledge page resize if we are in iframe and not in platform UI iframe


if (top != window && top.location.pathname != '/navpage.do' && top.location.pathname != '/nav_to.do') {


//detect end of page - scrolling


$j(top).scroll(function() {


if(top && typeof angular !== 'undefined'){


if($j(top).scrollTop() + $j(top).height() == $j(top.document).height()) {


var articleScope = angular.element($j('div[articles-container]')[0]).scope(),


searchScope = angular.element($j('.search-results')[0]).scope();




if(articleScope)


articleScope.$parent.$parent.getArticlesAndQuestions();


if(searchScope)


searchScope.$parent.$parent.executeSearch(searchScope.filterQuery.keywords);


}


}


});


//resizing


parent.addAfterPageLoadedEvent(function() {


contentWindow = window; //iframe window


resizeIframeFix(parent.window.$j('iframe'));


});


}


})();


Bill Bonnett
Kilo Expert

I found this also works:



<input type="button" onclick="$('#c')[0].focus()" value="test focus" />


<div>


      <div id="c" tabindex="1" style="margin-top:800px;">testing</div>


</div>



Edit fiddle - JSFiddle



So I had a widget that displayed KB categories. When clicked, it would populate the kb_article_list widget. But the issue I had was the the category widget was very long and when you clicked on an article, it wouldn't focus on the kb_article_list. So I did this:



In the kb_article_list widget, I added this:


            <div id="articles_section" tabindex="1" class="panel-heading">



Then in the category widget I put this into the client controller:


          $('#articles_section')[0].focus(); // jump to articles_section of the public_kb_article widget



It's a lot less coding than the alternatives. I hope this helps.