Override "Page load error" for network failure in js file

I have a jQuery Mobile-1.0.js file .

// Load a page into the DOM. $.mobile.loadPage = function (url, options) { // This function uses deferred notifications to let callers // know when the page is done loading, or if an error has occurred. var deferred = $.Deferred(), // The default loadPage options with overrides specified by // the caller. settings = $.extend({}, $.mobile.loadPage.defaults, options), // The DOM element for the page after it has been loaded. page = null, // If the reloadPage option is true, and the page is already // in the DOM, dupCachedPage will be set to the page element // so that it can be removed after the new version of the // page is loaded off the network. dupCachedPage = null, // determine the current base url findBaseWithDefault = function () { var closestBase = ($.mobile.activePage && getClosestBaseUrl($.mobile.activePage)); return closestBase || documentBase.hrefNoHash; }, // The absolute version of the URL passed into the function. This // version of the URL may contain dialog/subpage params in it. absUrl = path.makeUrlAbsolute(url, findBaseWithDefault()); // If the caller provided data, and we're using "get" request, // append the data to the URL. if (settings.data && settings.type === "get") { absUrl = path.addSearchParams(absUrl, settings.data); settings.data = undefined; } // If the caller is using a "post" request, reloadPage must be true if (settings.data && settings.type === "post") { settings.reloadPage = true; } // The absolute version of the URL minus any dialog/subpage params. // In otherwords the real URL of the page to be loaded. var fileUrl = path.getFilePath(absUrl), // The version of the Url actually stored in the data-url attribute of // the page. For embedded pages, it is just the id of the page. For pages // within the same domain as the document base, it is the site relative // path. For cross-domain pages (Phone Gap only) the entire absolute Url // used to load the page. dataUrl = path.convertUrlToDataUrl(absUrl); // Make sure we have a pageContainer to work with. settings.pageContainer = settings.pageContainer || $.mobile.pageContainer; // Check to see if the page already exists in the DOM. page = settings.pageContainer.children(":jqmData(url='" + dataUrl + "')"); // If we failed to find the page, check to see if the url is a // reference to an embedded page. If so, it may have been dynamically // injected by a developer, in which case it would be lacking a data-url // attribute and in need of enhancement. if (page.length === 0 && dataUrl && !path.isPath(dataUrl)) { page = settings.pageContainer.children("#" + dataUrl) .attr("data-" + $.mobile.ns + "url", dataUrl); } // If we failed to find a page in the DOM, check the URL to see if it // refers to the first page in the application. If it isn't a reference // to the first page and refers to non-existent embedded page, error out. if (page.length === 0) { if ($.mobile.firstPage && path.isFirstPageUrl(fileUrl)) { // Check to make sure our cached-first-page is actually // in the DOM. Some user deployed apps are pruning the first // page from the DOM for various reasons, we check for this // case here because we don't want a first-page with an id // falling through to the non-existent embedded page error // case. If the first-page is not in the DOM, then we let // things fall through to the ajax loading code below so // that it gets reloaded. if ($.mobile.firstPage.parent().length) { page = $($.mobile.firstPage); } } else if (path.isEmbeddedPage(fileUrl)) { deferred.reject(absUrl, options); return deferred.promise(); } } // Reset base to the default document base. if (base) { base.reset(); } // If the page we are interested in is already in the DOM, // and the caller did not indicate that we should force a // reload of the file, we are done. Otherwise, track the // existing page as a duplicated. if (page.length) { if (!settings.reloadPage) { enhancePage(page, settings.role); deferred.resolve(absUrl, options, page); return deferred.promise(); } dupCachedPage = page; } var mpc = settings.pageContainer, pblEvent = new $.Event("pagebeforeload"), triggerData = { url: url, absUrl: absUrl, dataUrl: dataUrl, deferred: deferred, options: settings }; // Let listeners know we're about to load a page. mpc.trigger(pblEvent, triggerData); // If the default behavior is prevented, stop here! if (pblEvent.isDefaultPrevented()) { return deferred.promise(); } if (settings.showLoadMsg) { // This configurable timeout allows cached pages a brief delay to load without showing a message var loadMsgDelay = setTimeout(function () { $.mobile.showPageLoadingMsg(); }, settings.loadMsgDelay), // Shared logic for clearing timeout and removing message. hideMsg = function () { // Stop message show timer clearTimeout(loadMsgDelay); // Hide loading message $.mobile.hidePageLoadingMsg(); }; } if (!($.mobile.allowCrossDomainPages || path.isSameDomain(documentUrl, absUrl))) { deferred.reject(absUrl, options); } else { // Load the new page. $.ajax({ url: fileUrl, type: settings.type, data: settings.data, dataType: "html", success: function (html, textStatus, xhr) { //pre-parse html to check for a data-url, //use it as the new fileUrl, base path, etc var all = $("<div></div>"), //page title regexp newPageTitle = html.match(/<title[^>]*>([^<]*)/) && RegExp.$1, // TODO handle dialogs again pageElemRegex = new RegExp("(<[^>]+\\bdata-" + $.mobile.ns + "role=[\"']?page[\"']?[^>]*>)"), dataUrlRegex = new RegExp("\\bdata-" + $.mobile.ns + "url=[\"']?([^\"'>]*)[\"']?"); // data-url must be provided for the base tag so resource requests can be directed to the // correct url. loading into a temprorary element makes these requests immediately if (pageElemRegex.test(html) && RegExp.$1 && dataUrlRegex.test(RegExp.$1) && RegExp.$1) { url = fileUrl = path.getFilePath(RegExp.$1); } if (base) { base.set(fileUrl); } //workaround to allow scripts to execute when included in page divs all.get(0).innerHTML = html; page = all.find(":jqmData(role='page'), :jqmData(role='dialog')").first(); //if page elem couldn't be found, create one and insert the body element contents if (!page.length) { page = $("<div data-" + $.mobile.ns + "role='page'>" + html.split(/<\/?body[^>]*>/gmi)[1] + "</div>"); } if (newPageTitle && !page.jqmData("title")) { if (~newPageTitle.indexOf("&")) { newPageTitle = $("<div>" + newPageTitle + "</div>").text(); } page.jqmData("title", newPageTitle); } //rewrite src and href attrs to use a base url if (!$.support.dynamicBaseTag) { var newPath = path.get(fileUrl); page.find("[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]").each(function () { var thisAttr = $(this).is('[href]') ? 'href' : $(this).is('[src]') ? 'src' : 'action', thisUrl = $(this).attr(thisAttr); // XXX_jblas: We need to fix this so that it removes the document // base URL, and then prepends with the new page URL. //if full path exists and is same, chop it - helps IE out thisUrl = thisUrl.replace(location.protocol + '//' + location.host + location.pathname, ''); if (!/^(\w+:|#|\/)/.test(thisUrl)) { $(this).attr(thisAttr, newPath + thisUrl); } }); } //append to page and enhance // TODO taging a page with external to make sure that embedded pages aren't removed // by the various page handling code is bad. Having page handling code in many // places is bad. Solutions post 1.0 page .attr("data-" + $.mobile.ns + "url", path.convertUrlToDataUrl(fileUrl)) .attr("data-" + $.mobile.ns + "external-page", true) .appendTo(settings.pageContainer); // wait for page creation to leverage options defined on widget page.one('pagecreate', $.mobile._bindPageRemove); enhancePage(page, settings.role); // Enhancing the page may result in new dialogs/sub pages being inserted // into the DOM. If the original absUrl refers to a sub-page, that is the // real page we are interested in. if (absUrl.indexOf("&" + $.mobile.subPageUrlKey) > -1) { page = settings.pageContainer.children(":jqmData(url='" + dataUrl + "')"); } //bind pageHide to removePage after it hidden, if the page options specify to do so // Remove loading message. if (settings.showLoadMsg) { hideMsg(); } // Add the page reference and xhr to our triggerData. triggerData.xhr = xhr; triggerData.textStatus = textStatus; triggerData.page = page; // Let listeners know the page loaded successfully. settings.pageContainer.trigger("pageload", triggerData); deferred.resolve(absUrl, options, page, dupCachedPage); }, error: function (xhr, textStatus, errorThrown) { //set base back to current path if (base) { base.set(path.get()); } // Add error info to our triggerData. triggerData.xhr = xhr; triggerData.textStatus = textStatus; triggerData.errorThrown = errorThrown; var plfEvent = new $.Event("pageloadfailed"); // Let listeners know the page load failed. settings.pageContainer.trigger(plfEvent, triggerData); // If the default behavior is prevented, stop here! // Note that it is the responsibility of the listener/handler // that called preventDefault(), to resolve/reject the // deferred object within the triggerData. if (plfEvent.isDefaultPrevented()) { return; } // Remove loading message. if (settings.showLoadMsg) { // Remove loading message. hideMsg(); //show error message $("<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all'><h1>" + $.mobile.pageLoadErrorMessage + "</h1></div>") .css({ "display": "block", "opacity": 0.96, "top": $window.scrollTop() + 100 }) .appendTo(settings.pageContainer) .delay(800) .fadeOut(400, function () { $(this).remove(); }); } deferred.reject(absUrl, options); } }); } return deferred.promise(); }; 

This is the code for displaying the "Error Loading Page" error message for the error on the page. Here I want to show a warning message about a network connection error as "Please check your net connection" instead of the image below.

Error Loading Page

Note. I do not want to modify pageloaderrormessage. want to stop receiving page error messages, instead I will turn on the status of my network error, as in Show network error in android . If the user clicked “OK” in the warning dialog box, I will go to them in Reload.html.

Please tell me where can I check this condition and where do I need to change the error message?

+4
source share
3 answers

Since both @shkschneider and @codemonkey suggested you set this option to mobileinit

Example:

 $(document).bind("mobileinit", function(){ $.mobile.pageLoadErrorMessage = "Please check your net connection"; }); 

Linking jQM 1.0.1 documents:

Here is an example:

Now, if you have the opportunity to upgrade jQM to 1.1.1, you can try something like this:

 //use theme swatch "b", a custom message, and no spinner $.mobile.showPageLoadingMsg("b", "Please check your net connection", true); // hide after delay setTimeout( $.mobile.hidePageLoadingMsg, 1500 ); 

Docs:

UPDATE:

Another thought is to use the plugin to achieve something, how do you want, something like this work?

+4
source

Install pageLoadErrorMessage as described here http://jquerymobile.com/demos/1.1.1/docs/api/globalconfig.html

EDIT

If you want to handle the behavior in your own way, set the loadingMessage parameter to false. This prevents the loading message from being displayed. You can bind to pageloadfailed (described here http://jquerymobile.com/demos/1.1.1/docs/api/events.html ) and add add your own processing logic to the event handler.

+3
source

Just use:

 $(document).bind("mobileinit", function(){ $.mobile.pageLoadErrorMessage("Please check your netconnection"); }); 

http://jquerymobile.com/test/docs/api/globalconfig.html

+3
source

All Articles