Tuesday, June 14, 2016

How to defer the update at the client side after async postback in updatepanel

Leave a Comment

I have an old system which uses UpdatePanels of asp.net

After the postback is completed, we know that the inside of UpdatePanel is updated

Can i delay this update somehow on the client side ? is that possible?

So it will be like, when the postback is started, i set a javascript datetime object on the client side

Once the postback is completed, and the data is returned from the server, before updating the client side interface, i check how many miliseconds has passed and I delay the update of the client side until certain miliseconds has passed

is this possible?

asp.net 4.5 c#

let me clarify better

i want each update of the page to be exactly 500 miliseconds after the ajax postback request started

however the server delay is unknown and changes for the every location

let say that for person 1 the server delay is 122 ms

for person 2 the server delay is 234

for person 3 the server delay is 444

so i would be have to delay the page update at the client side

for the person 1 : 378 ms

for the person 2 : 266 ms

for the person 3 : 56 ms

i have checked and i found that there is a function :

Sys.WebForms.PageRequestManager pageLoading Event 

so if i can somehow override the function that this function calls to update the page i can achieve

(i still dont know what function it calls to complete the update operation on the client side)

lets assume that inside

Sys.WebForms.PageRequestManager pageLoading Event  

updateTheChanges function is called

so if i can override this updateTheChanges function and call it with a delay i can achieve what i want

I need exactly something like this which will overwrite the update function of the updatepanel. So i can call this function with a delay

ASP.Net Webforms w/ AJAX Slow Rendering

ty

here the web resource files

  1. script resource 1 : http://pastebin.com/0rSCMn3g
  2. script resource 2 : http://pastebin.com/GvqwpPv8

script resource 3 below

    function WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) {     this.eventTarget = eventTarget;     this.eventArgument = eventArgument;     this.validation = validation;     this.validationGroup = validationGroup;     this.actionUrl = actionUrl;     this.trackFocus = trackFocus;     this.clientSubmit = clientSubmit; }  function WebForm_DoPostBackWithOptions(options) {     var validationResult = true;     if (options.validation) {         if (typeof(Page_ClientValidate) == 'function') {             validationResult = Page_ClientValidate(options.validationGroup);         }     }     if (validationResult) {         if ((typeof(options.actionUrl) != "undefined") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {             theForm.action = options.actionUrl;         }         if (options.trackFocus) {             var lastFocus = theForm.elements["__LASTFOCUS"];             if ((typeof(lastFocus) != "undefined") && (lastFocus != null)) {                 if (typeof(document.activeElement) == "undefined") {                     lastFocus.value = options.eventTarget;                 } else {                     var active = document.activeElement;                     if ((typeof(active) != "undefined") && (active != null)) {                         if ((typeof(active.id) != "undefined") && (active.id != null) && (active.id.length > 0)) {                             lastFocus.value = active.id;                         } else if (typeof(active.name) != "undefined") {                             lastFocus.value = active.name;                         }                     }                 }             }         }     }     if (options.clientSubmit) {         __doPostBack(options.eventTarget, options.eventArgument);     } } var __pendingCallbacks = new Array(); var __synchronousCallBackIndex = -1;  function WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) {     var postData = __theFormPostData +         "__CALLBACKID=" + WebForm_EncodeCallback(eventTarget) +         "&__CALLBACKPARAM=" + WebForm_EncodeCallback(eventArgument);     if (theForm["__EVENTVALIDATION"]) {         postData += "&__EVENTVALIDATION=" + WebForm_EncodeCallback(theForm["__EVENTVALIDATION"].value);     }     var xmlRequest, e;     try {         xmlRequest = new XMLHttpRequest();     } catch (e) {         try {             xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");         } catch (e) {}     }     var setRequestHeaderMethodExists = true;     try {         setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);     } catch (e) {}     var callback = new Object();     callback.eventCallback = eventCallback;     callback.context = context;     callback.errorCallback = errorCallback;     callback.async = useAsync;     var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback);     if (!useAsync) {         if (__synchronousCallBackIndex != -1) {             __pendingCallbacks[__synchronousCallBackIndex] = null;         }         __synchronousCallBackIndex = callbackIndex;     }     if (setRequestHeaderMethodExists) {         xmlRequest.onreadystatechange = WebForm_CallbackComplete;         callback.xmlRequest = xmlRequest;         // e.g. http:         var action = theForm.action || document.location.pathname,             fragmentIndex = action.indexOf('#');         if (fragmentIndex !== -1) {             action = action.substr(0, fragmentIndex);         }         if (!__nonMSDOMBrowser) {             var queryIndex = action.indexOf('?');             if (queryIndex !== -1) {                 var path = action.substr(0, queryIndex);                 if (path.indexOf("%") === -1) {                     action = encodeURI(path) + action.substr(queryIndex);                 }             } else if (action.indexOf("%") === -1) {                 action = encodeURI(action);             }         }         xmlRequest.open("POST", action, true);         xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");         xmlRequest.send(postData);         return;     }     callback.xmlRequest = new Object();     var callbackFrameID = "__CALLBACKFRAME" + callbackIndex;     var xmlRequestFrame = document.frames[callbackFrameID];     if (!xmlRequestFrame) {         xmlRequestFrame = document.createElement("IFRAME");         xmlRequestFrame.width = "1";         xmlRequestFrame.height = "1";         xmlRequestFrame.frameBorder = "0";         xmlRequestFrame.id = callbackFrameID;         xmlRequestFrame.name = callbackFrameID;         xmlRequestFrame.style.position = "absolute";         xmlRequestFrame.style.top = "-100px"         xmlRequestFrame.style.left = "-100px";         try {             if (callBackFrameUrl) {                 xmlRequestFrame.src = callBackFrameUrl;             }         } catch (e) {}         document.body.appendChild(xmlRequestFrame);     }     var interval = window.setInterval(function() {         xmlRequestFrame = document.frames[callbackFrameID];         if (xmlRequestFrame && xmlRequestFrame.document) {             window.clearInterval(interval);             xmlRequestFrame.document.write("");             xmlRequestFrame.document.close();             xmlRequestFrame.document.write('<html><body><form method="post"><input type="hidden" name="__CALLBACKLOADSCRIPT" value="t"></form></body></html>');             xmlRequestFrame.document.close();             xmlRequestFrame.document.forms[0].action = theForm.action;             var count = __theFormPostCollection.length;             var element;             for (var i = 0; i < count; i++) {                 element = __theFormPostCollection[i];                 if (element) {                     var fieldElement = xmlRequestFrame.document.createElement("INPUT");                     fieldElement.type = "hidden";                     fieldElement.name = element.name;                     fieldElement.value = element.value;                     xmlRequestFrame.document.forms[0].appendChild(fieldElement);                 }             }             var callbackIdFieldElement = xmlRequestFrame.document.createElement("INPUT");             callbackIdFieldElement.type = "hidden";             callbackIdFieldElement.name = "__CALLBACKID";             callbackIdFieldElement.value = eventTarget;             xmlRequestFrame.document.forms[0].appendChild(callbackIdFieldElement);             var callbackParamFieldElement = xmlRequestFrame.document.createElement("INPUT");             callbackParamFieldElement.type = "hidden";             callbackParamFieldElement.name = "__CALLBACKPARAM";             callbackParamFieldElement.value = eventArgument;             xmlRequestFrame.document.forms[0].appendChild(callbackParamFieldElement);             if (theForm["__EVENTVALIDATION"]) {                 var callbackValidationFieldElement = xmlRequestFrame.document.createElement("INPUT");                 callbackValidationFieldElement.type = "hidden";                 callbackValidationFieldElement.name = "__EVENTVALIDATION";                 callbackValidationFieldElement.value = theForm["__EVENTVALIDATION"].value;                 xmlRequestFrame.document.forms[0].appendChild(callbackValidationFieldElement);             }             var callbackIndexFieldElement = xmlRequestFrame.document.createElement("INPUT");             callbackIndexFieldElement.type = "hidden";             callbackIndexFieldElement.name = "__CALLBACKINDEX";             callbackIndexFieldElement.value = callbackIndex;             xmlRequestFrame.document.forms[0].appendChild(callbackIndexFieldElement);             xmlRequestFrame.document.forms[0].submit();         }     }, 10); }  function WebForm_CallbackComplete() {     for (var i = 0; i < __pendingCallbacks.length; i++) {         callbackObject = __pendingCallbacks[i];         if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {             if (!__pendingCallbacks[i].async) {                 __synchronousCallBackIndex = -1;             }             __pendingCallbacks[i] = null;             var callbackFrameID = "__CALLBACKFRAME" + i;             var xmlRequestFrame = document.getElementById(callbackFrameID);             if (xmlRequestFrame) {                 xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);             }             WebForm_ExecuteCallback(callbackObject);         }     } }  function WebForm_ExecuteCallback(callbackObject) {     var response = callbackObject.xmlRequest.responseText;     if (response.charAt(0) == "s") {         if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) {             callbackObject.eventCallback(response.substring(1), callbackObject.context);         }     } else if (response.charAt(0) == "e") {         if ((typeof(callbackObject.errorCallback) != "undefined") && (callbackObject.errorCallback != null)) {             callbackObject.errorCallback(response.substring(1), callbackObject.context);         }     } else {         var separatorIndex = response.indexOf("|");         if (separatorIndex != -1) {             var validationFieldLength = parseInt(response.substring(0, separatorIndex));             if (!isNaN(validationFieldLength)) {                 var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);                 if (validationField != "") {                     var validationFieldElement = theForm["__EVENTVALIDATION"];                     if (!validationFieldElement) {                         validationFieldElement = document.createElement("INPUT");                         validationFieldElement.type = "hidden";                         validationFieldElement.name = "__EVENTVALIDATION";                         theForm.appendChild(validationFieldElement);                     }                     validationFieldElement.value = validationField;                 }                 if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) {                     callbackObject.eventCallback(response.substring(separatorIndex + validationFieldLength + 1), callbackObject.context);                 }             }         }     } }  function WebForm_FillFirstAvailableSlot(array, element) {     var i;     for (i = 0; i < array.length; i++) {         if (!array[i]) break;     }     array[i] = element;     return i; } var __nonMSDOMBrowser = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1); var __theFormPostData = ""; var __theFormPostCollection = new Array(); var __callbackTextTypes = /^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;  function WebForm_InitCallback() {     var formElements = theForm.elements,         count = formElements.length,         element;     for (var i = 0; i < count; i++) {         element = formElements[i];         var tagName = element.tagName.toLowerCase();         if (tagName == "input") {             var type = element.type;             if ((__callbackTextTypes.test(type) || ((type == "checkbox" || type == "radio") && element.checked)) && (element.id != "__EVENTVALIDATION")) {                 WebForm_InitCallbackAddField(element.name, element.value);             }         } else if (tagName == "select") {             var selectCount = element.options.length;             for (var j = 0; j < selectCount; j++) {                 var selectChild = element.options[j];                 if (selectChild.selected == true) {                     WebForm_InitCallbackAddField(element.name, element.value);                 }             }         } else if (tagName == "textarea") {             WebForm_InitCallbackAddField(element.name, element.value);         }     } }  function WebForm_InitCallbackAddField(name, value) {     var nameValue = new Object();     nameValue.name = name;     nameValue.value = value;     __theFormPostCollection[__theFormPostCollection.length] = nameValue;     __theFormPostData += WebForm_EncodeCallback(name) + "=" + WebForm_EncodeCallback(value) + "&"; }  function WebForm_EncodeCallback(parameter) {     if (encodeURIComponent) {         return encodeURIComponent(parameter);     } else {         return escape(parameter);     } } var __disabledControlArray = new Array();  function WebForm_ReEnableControls() {     if (typeof(__enabledControlArray) == 'undefined') {         return false;     }     var disabledIndex = 0;     for (var i = 0; i < __enabledControlArray.length; i++) {         var c;         if (__nonMSDOMBrowser) {             c = document.getElementById(__enabledControlArray[i]);         } else {             c = document.all[__enabledControlArray[i]];         }         if ((typeof(c) != "undefined") && (c != null) && (c.disabled == true)) {             c.disabled = false;             __disabledControlArray[disabledIndex++] = c;         }     }     setTimeout("WebForm_ReDisableControls()", 0);     return true; }  function WebForm_ReDisableControls() {     for (var i = 0; i < __disabledControlArray.length; i++) {         __disabledControlArray[i].disabled = true;     } }  function WebForm_SimulateClick(element, event) {     var clickEvent;     if (element) {         if (element.click) {             element.click();         } else {             clickEvent = document.createEvent("MouseEvents");             clickEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);             if (!element.dispatchEvent(clickEvent)) {                 return true;             }         }         event.cancelBubble = true;         if (event.stopPropagation) {             event.stopPropagation();         }         return false;     }     return true; }  function WebForm_FireDefaultButton(event, target) {     if (event.keyCode == 13) {         var src = event.srcElement || event.target;         if (src &&             ((src.tagName.toLowerCase() == "input") &&                 (src.type.toLowerCase() == "submit" || src.type.toLowerCase() == "button")) ||             ((src.tagName.toLowerCase() == "a") &&                 (src.href != null) && (src.href != "")) ||             (src.tagName.toLowerCase() == "textarea")) {             return true;         }         var defaultButton;         if (__nonMSDOMBrowser) {             defaultButton = document.getElementById(target);         } else {             defaultButton = document.all[target];         }         if (defaultButton) {             return WebForm_SimulateClick(defaultButton, event);         }     }     return true; }  function WebForm_GetScrollX() {     if (__nonMSDOMBrowser) {         return window.pageXOffset;     } else {         if (document.documentElement && document.documentElement.scrollLeft) {             return document.documentElement.scrollLeft;         } else if (document.body) {             return document.body.scrollLeft;         }     }     return 0; }  function WebForm_GetScrollY() {     if (__nonMSDOMBrowser) {         return window.pageYOffset;     } else {         if (document.documentElement && document.documentElement.scrollTop) {             return document.documentElement.scrollTop;         } else if (document.body) {             return document.body.scrollTop;         }     }     return 0; }  function WebForm_SaveScrollPositionSubmit() {     if (__nonMSDOMBrowser) {         theForm.elements['__SCROLLPOSITIONY'].value = window.pageYOffset;         theForm.elements['__SCROLLPOSITIONX'].value = window.pageXOffset;     } else {         theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();         theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();     }     if ((typeof(this.oldSubmit) != "undefined") && (this.oldSubmit != null)) {         return this.oldSubmit();     }     return true; }  function WebForm_SaveScrollPositionOnSubmit() {     theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();     theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();     if ((typeof(this.oldOnSubmit) != "undefined") && (this.oldOnSubmit != null)) {         return this.oldOnSubmit();     }     return true; }  function WebForm_RestoreScrollPosition() {     if (__nonMSDOMBrowser) {         window.scrollTo(theForm.elements['__SCROLLPOSITIONX'].value, theForm.elements['__SCROLLPOSITIONY'].value);     } else {         window.scrollTo(theForm.__SCROLLPOSITIONX.value, theForm.__SCROLLPOSITIONY.value);     }     if ((typeof(theForm.oldOnLoad) != "undefined") && (theForm.oldOnLoad != null)) {         return theForm.oldOnLoad();     }     return true; }  function WebForm_TextBoxKeyHandler(event) {     if (event.keyCode == 13) {         var target;         if (__nonMSDOMBrowser) {             target = event.target;         } else {             target = event.srcElement;         }         if ((typeof(target) != "undefined") && (target != null)) {             if (typeof(target.onchange) != "undefined") {                 target.onchange();                 event.cancelBubble = true;                 if (event.stopPropagation) event.stopPropagation();                 return false;             }         }     }     return true; }  function WebForm_TrimString(value) {     return value.replace(/^\s+|\s+$/g, '') }  function WebForm_AppendToClassName(element, className) {     var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';     className = WebForm_TrimString(className);     var index = currentClassName.indexOf(' ' + className + ' ');     if (index === -1) {         element.className = (element.className === '') ? className : element.className + ' ' + className;     } }  function WebForm_RemoveClassName(element, className) {     var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';     className = WebForm_TrimString(className);     var index = currentClassName.indexOf(' ' + className + ' ');     if (index >= 0) {         element.className = WebForm_TrimString(currentClassName.substring(0, index) + ' ' +             currentClassName.substring(index + className.length + 1, currentClassName.length));     } }  function WebForm_GetElementById(elementId) {     if (document.getElementById) {         return document.getElementById(elementId);     } else if (document.all) {         return document.all[elementId];     } else return null; }  function WebForm_GetElementByTagName(element, tagName) {     var elements = WebForm_GetElementsByTagName(element, tagName);     if (elements && elements.length > 0) {         return elements[0];     } else return null; }  function WebForm_GetElementsByTagName(element, tagName) {     if (element && tagName) {         if (element.getElementsByTagName) {             return element.getElementsByTagName(tagName);         }         if (element.all && element.all.tags) {             return element.all.tags(tagName);         }     }     return null; }  function WebForm_GetElementDir(element) {     if (element) {         if (element.dir) {             return element.dir;         }         return WebForm_GetElementDir(element.parentNode);     }     return "ltr"; }  function WebForm_GetElementPosition(element) {     var result = new Object();     result.x = 0;     result.y = 0;     result.width = 0;     result.height = 0;     if (element.offsetParent) {         result.x = element.offsetLeft;         result.y = element.offsetTop;         var parent = element.offsetParent;         while (parent) {             result.x += parent.offsetLeft;             result.y += parent.offsetTop;             var parentTagName = parent.tagName.toLowerCase();             if (parentTagName != "table" &&                 parentTagName != "body" &&                 parentTagName != "html" &&                 parentTagName != "div" &&                 parent.clientTop &&                 parent.clientLeft) {                 result.x += parent.clientLeft;                 result.y += parent.clientTop;             }             parent = parent.offsetParent;         }     } else if (element.left && element.top) {         result.x = element.left;         result.y = element.top;     } else {         if (element.x) {             result.x = element.x;         }         if (element.y) {             result.y = element.y;         }     }     if (element.offsetWidth && element.offsetHeight) {         result.width = element.offsetWidth;         result.height = element.offsetHeight;     } else if (element.style && element.style.pixelWidth && element.style.pixelHeight) {         result.width = element.style.pixelWidth;         result.height = element.style.pixelHeight;     }     return result; }  function WebForm_GetParentByTagName(element, tagName) {     var parent = element.parentNode;     var upperTagName = tagName.toUpperCase();     while (parent && (parent.tagName.toUpperCase() != upperTagName)) {         parent = parent.parentNode ? parent.parentNode : parent.parentElement;     }     return parent; }  function WebForm_SetElementHeight(element, height) {     if (element && element.style) {         element.style.height = height + "px";     } }  function WebForm_SetElementWidth(element, width) {     if (element && element.style) {         element.style.width = width + "px";     } }  function WebForm_SetElementX(element, x) {     if (element && element.style) {         element.style.left = x + "px";     } }  function WebForm_SetElementY(element, y) {     if (element && element.style) {         element.style.top = y + "px";     } } 

4 Answers

Answers 1

If you don't mind the user interface being frozen while waiting, you can delay the refresh by keeping the pageLoad event handler busy until the delay expires:

<script type="text/javascript">     var updateTime = 0;      function setUpdateTime() {         updateTime = new Date(Date.now() + 500);     }      function pageLoad(sender, e) {         if (e.get_isPartialLoad()) {             while (Date.now() < updateTime) {                  // Loop until the delay expires             }         }     } </script> 

You can initialize the update time before triggering the asynchronous postback:

<asp:UpdatePanel runat="server" UpdateMode="Conditional">     <ContentTemplate>         ...         <asp:Button ID="btn1" runat="server" OnClientClick="setUpdateTime();" ... />     </ContentTemplate> </asp:UpdatePanel> 

Answers 2

Here is a way to delay the UpdatePanel refresh without freezing the user interface:

  1. In the pageLoading event handler, save the ID and the previous HTML of the panels to be updated
  2. In the pageLoad event handler, save the new HTML of the panels but replace it by the old one
  3. After the delay expires, set the new HTML in the updated panels

Here is the client code:

<script type="text/javascript">     var updateTime = 0;     var updatedPanelArray = [];      function setUpdateTime() {         updateTime = new Date(Date.now() + 500);     }      function pageLoading(sender, e) {         updatedPanelArray.length = 0;         var panels = e.get_panelsUpdating();         for (var i = 0; i < panels.length; i++) {             var pnl = panels[i];             updatedPanelArray.push({ id: pnl.id, oldHTML: pnl.innerHTML });         }     }      function pageLoad(sender, e) {         if (e.get_isPartialLoad()) {             for (var i = 0; i < updatedPanelArray.length; i++) {                 var updatedPanel = updatedPanelArray[i];                 var pnl = document.getElementById(updatedPanel.id);                 updatedPanel.newHTML = pnl.innerHTML;                 pnl.innerHTML = updatedPanel.oldHTML;                 setTimeout(refreshUpdatePanel, updateTime - Date.now());             }         }     }      function refreshUpdatePanel() {         for (var i = 0; i < updatedPanelArray.length; i++) {             var updatedPanel = updatedPanelArray[i];             var pnl = document.getElementById(updatedPanel.id);             pnl.innerHTML = updatedPanel.newHTML;         }     }      Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(pageLoading); </script> 

The update time is set before triggering the asynchronous postback:

<asp:UpdatePanel runat="server" UpdateMode="Conditional">     <ContentTemplate>         ...         <asp:Button ID="btn1" runat="server" OnClientClick="setUpdateTime();" ... />     </ContentTemplate> </asp:UpdatePanel> 

Answers 3

You could delay the server side, so all the delays would be more or less equals for everyone.

If this is not an option, you could have a hidden field inside the update panel (or somewhere else). The function that handles the update (in the server side) would calculate the time it took execute, and before finishing, would update this hidden field. Now back in the client side, check the value of this field and calculate the difference between this value and yours 500ms. You could use datetimes or milliseconds.

It's not the prettiest solution but imho, this is not a frequent problem that people want to handle (in fact, I dont think that you should delay a faster response to the slowest one)

Answers 4

Use UpdatePanel.UpdateMode Property to gets or sets a value that indicates when an UpdatePanel control's content is updated. For more details visit this link.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment