>  기사  >  웹 프론트엔드  >  Ajax 롤백 및 페이지 새로고침 문제 해결

Ajax 롤백 및 페이지 새로고침 문제 해결

韦小宝
韦小宝원래의
2018-01-09 09:49:551492검색

이 글은 Ajax 롤백 문제 해결과 페이지 새로 고침에 대한 관련 정보를 주로 소개하고 있어 참고 및 Ajax 학습의 가치가 있습니다. :

AJAX는 "Asynchronous Javascript And XML"(Asynchronous JavaScript and XML)의 약자로, 대화형 웹 애플리케이션을 만들기 위한 웹 개발 기술을 말합니다.

AJAX = 비동기 JavaScript 및 XML(표준 범용 마크업 언어의 하위 집합).

AJAX는 빠르고 동적인 웹 페이지를 만드는 기술입니다.


AJAX는 백그라운드에서 서버와 소량의 데이터를 교환함으로써 웹 페이지를 비동기적으로 업데이트할 수 있습니다. 이는 전체 페이지를 다시 로드하지 않고도 웹페이지의 일부를 업데이트할 수 있음을 의미합니다.


AJAX를 사용하지 않는 기존 웹페이지에서는 콘텐츠를 업데이트해야 하는 경우 전체 웹페이지를 다시 로드해야 합니다.


문제가 있습니다

Firefox와 같은 브라우저를 사용하여 RMS 웹 사이트에 액세스하는 경우 페이지 간 전환이 AJAX 비동기 요청을 통해 구현되고 페이지의 URL이 변경되지 않는 것을 확인할 수 있습니다. 페이지의 버튼을 통해 액세스할 수 있지만 AJAX 비동기 요청을 통해 롤백 새로 고침을 구현하지만 브라우저는 새로 고침 및 백업 후 매번 페이지가 원래 시작 페이지로 돌아갑니다. AJAX는 페이지의 부분 새로 고침을 실현하고 매우 좋은 데이터 로딩 효과를 얻을 수 있으며 사용자에게 매우 좋은 경험을 제공할 수 있지만 AJAX는 브라우저의 기록 세션에서 기록을 유지할 수 없습니다. 페이지를 클릭하면 AJAX가 다양한 데이터를 로딩합니다. 예를 들어, 목록 페이지는 비동기 로딩을 사용하여 넘길 수 있습니다. 그러나 사용자가 실수로 페이지를 새로 고치면 사용자가 세션 상태(브라우저 앞으로, 뒤로, 새로 고침)를 변경하면 페이지 번호를 다시 계산해야 합니다. ) ) AJAX는 관련 데이터를 잃게 됩니다.

기존 AJAX에는 다음과 같은 문제가 있습니다.

1. 페이지 내용은 새로 고침 없이 변경할 수 있지만 페이지 URL은 변경할 수 없습니다.2 시스템의 특정 모듈에 대한 직접 액세스를 지원할 수 없습니다. URL을 입력하고 작업을 클릭해야 합니다

3. 개발자 자신이 가장 먼저 롤백 및 새로 고침을 수행해야 하며 이는 개발자의 작업량을 증가시킬 뿐만 아니라 사용자 습관에도 맞지 않습니다

4. 브라우저는 onhashchange 인터페이스를 도입했으며 이를 지원하지 않는 브라우저는 해시가 변경되었는지 정기적으로 확인만 할 수 있습니다

5. 그러나 이 방법은 검색 엔진에 매우 비우호적입니다

기술을 사용합니다

기존 Ajax로 인해 발생하는 문제를 해결하기 위해 HTML5에 새로운 API가 도입되었습니다. 즉, History.pushState, History.replaceState는 pushState 및 replacementState 인터페이스를 통해 브라우저 기록을 조작하고 현재 페이지의 URL을 변경할 수 있습니다.

pushState는 지정된 URL을 브라우저 기록에 추가하는 것이고, replacementState는 현재 URL을 지정된 URL로 바꾸는 것입니다.

history.pushState(state, title, url)


현재 URL과 History.state를 기록에 추가하고 새 상태와 URL을 현재에 추가하세요. 페이지가 새로 고쳐지지는 않습니다.


state: 이동할 URL에 해당하는 상태 정보입니다.

title: 제목(이제 무시되고 처리되지 않음).

url: 이동할 URL 주소는 도메인을 넘을 수 없습니다.

history.replaceState(state, title, url)


History.replaceState() 작업은 교체 상태() 메서드가 새 기록 항목을 만드는 대신 현재 기록 항목을 수정한다는 점을 제외하고는 History.pushState()와 유사합니다.


state: 이동할 URL에 해당하는 상태 정보입니다.

title: 제목(이제 무시되고 처리되지 않음).

url: 이동할 URL 주소는 도메인을 넘을 수 없습니다.

addEventListener(type,listener)

addEventListener는 이벤트를 수신하고 그에 따라 처리하는 함수입니다.

type: 이벤트 유형입니다.


listener: 이벤트를 청취한 후 처리하는 기능입니다. 이 함수는 Event

개체

를 유일한 매개변수로 허용해야 하며 어떤 결과도 반환할 수 없습니다.

Solution

AJAX는 새로고침 없이 페이지 콘텐츠를 변경하므로 페이지의 URL은 항상 동일합니다. 페이지의 다른 콘텐츠를 구별하려면 먼저 각 페이지의 URL을 다시 정의해야 합니다. RMS 대부분의 웹사이트는 $.post 비동기 요청을 사용하여 post 요청의 다양한 매개변수(요청 주소, 전송 매개변수)를 기록할 수 있습니다. 브라우저가 새로 고침 및 롤백 작업을 수행하면 post 요청이 자동으로 전송됩니다. URL에 기록된 정보를 기반으로 해당 페이지를 입력하면 원하는 기능을 얻을 수 있습니다.

URL 구문 정의:

다음 주소를 예로 들어보세요.

“http://localhost/rms_hold/index.php/Home/Index/loadHomePage#/rms_hold/index.php/Home/ 리소스 Request/getRequestPage@apply_type=1&resource_name=ADM_BIZCARD!1”

“http://localhost/rms_hold/index.php/Home/Index/loadHomePage”是原先页面的URL,如果在问题解决之前在RMS网站上进行任何点按操作,网址一直不会有任何变动。现在我们使用“#”分割网址,“#”之后就是我们所记录的ajax请求“/rms_hold/index.php/Home/ResourceRequest/getRequestPage”是请求的地址,它由“#”与“@”分割,而在“@”与“!”之间的这是发向请求地址的各个参数,“apply_type=1”与“resource_name=ADM_BIZCARD”由“&”进行分割。

刷新、回退监听处理:


if (history.pushState) {
window.addEventListener("popstate", function() {
back_ajax_mod_url();
back_ajax_post();
if(location.href.indexOf("#")==-1){
window.location.reload();
}
});
back_ajax_mod_url();
back_ajax_post();
}


如以上代码所示,window对象上提供了onpopstate事件,可以使用addEventListener方法监听onpopstate事件,每当URL因为浏览器回退时都会对得到的URL在back_ajax_mod_url()与back_ajax_post()函数中进行解析、处理,而当浏览器刷新时,根据history.pushState的返回值不空,依然会对得到的URL在back_ajax_mod_url()与back_ajax_post()函数中进行解析、处理。

对外接口:


function back_ajax_mod_url(){
var url_ajax=ajaxback_url.pop();
var title ="Home | UniqueSoft RMS";
if(url_ajax){
history.pushState({ title: title }, title,location.href.split("#")[0] + "#"+ url_ajax);
}
}


介绍一下back_ajax_mod_url()函数,它与数组ajaxback_url组成对外接口,ajaxback_url是一个全局数组,用来存放需要加入到history中的URL,然后由back_ajax_mod_url()函数在无页面刷新的情况下将当前URL和history.state加入到history中。


$("#reportTable tbody").on("click", "trtd img[alt = 'Detail']",
function() {
var id = $(this).attr("business_leave_id");
$.post("MODULE/ReportCenter/getReportDetailPage",{
"report_name": "ADM_TRAVEL_REP",
"item_id": id,
},
function(data) {
ajaxback_url.push("MODULE/ReportCenter/getReportDetailPage"+ "@" + "item_id=" + id + "&" +"report_name=ADM_TRAVEL_REP");
$("#container").html(data);
back_ajax_mod_url();
});
});


以上函数是RMS系统里的一个AJAX异步请求事件,会造成页面无刷新变化,加粗部分就是我们提供的对外接口,使用该接口后在history中会产生一条新的URL用来记录达到该页面的post方法。

URL解析处理器:

如下面函数所示back_ajax_post()为RMS系统的URL解析处理器,根据之前提到的URL语法,读出页面上改变内容的AJAX请求,并且自动发送AJAX请求,获取需要的页面


function back_ajax_post() {
if (location.href.indexOf("#")!= -1) {
var post_href =location.href.split("#")[1];
if (location.href.indexOf("@")!= -1) {
var post_url =post_href.split("@")[0];
var post_params =post_href.split("@")[1];
if(post_params.indexOf("!") != -1) {
var post_page_index =post_params.split("!")[1];
post_params =post_params.split("!")[0];
};
} else {
var post_url = post_href;
var post_params = "";
var post_page_index = "";
}
var get_resource_href =location.href;
if(get_resource_href.indexOf("!") != -1) {
get_resource_href =get_resource_href.split("!")[0];
};
if(get_resource_href.indexOf("resource_name=") != -1) {
var has_resource_name =get_resource_href.split("resource_name=")[1];
var siderbar_index =has_resource_name;
} else if(get_resource_href.indexOf("report_name=") != -1) {
var has_resource_name =get_resource_href.split("report_name=")[1];
var siderbar_index =has_resource_name.split("_REP")[0];
};
if (!post_page_index ||$("#personalInfo").length <= 0) {
if (!post_url) {
window.location.href ="MODULE";
}
$.ajax({
type: "post",
url: post_url,
data: post_params,
success: function(res){
$(&#39;#pageContainer&#39;).html(res);
if(post_page_index) {
location.href= location.href.split("!")[0] + "!1";
} else {
location.href= location.href.split("!")[0];
};
},
error: function(res) {
window.location.href = "MODULE";
},
});
}
//for request page next&back
if (post_page_index) {
var previous_index =$(".navbar,.steps .navbar-innerul.row-fluid").find("li.active").find(".number").text();
var differ =post_page_index - previous_index;
lock_for_req_back_next =1;
if (differ > 0) {
for (var i = 0; i <differ; a="" bar="" differ="-differ;" else="" for="" i="0;" if="" li="" lock_for_req_back_next="0;" resource_name="$(this).attr("href").split("resource_name=")[1];" side="" siderbar_index="=" ul.page-sidebar-menuli="" ul.sub-menu="" var=""> span.arrow&#39;).addClass(&#39;open&#39;);
$(this).parents(&#39;.sub-menu&#39;).show();
});
$(this).parent(&#39;li&#39;).parents(&#39;li&#39;).addClass(&#39;active open&#39;);
return false;
} else {
$(&#39;.sub-menu&#39;).hide();
}
});
$("ul.page-sidebar-menuli").not(".open").find("ul").hide();
}
}
</differ;>


以上所述是小编给大家介绍的Ajax回退刷新页面问题的解决办法的相关知识,希望对大家有所帮助!!

相关推荐:

javascript - ajax刷新的问题

phpajax刷新分页

phpajax刷新留言板

위 내용은 Ajax 롤백 및 페이지 새로고침 문제 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.