웹 프론트엔드 JS 튜토리얼 Ajax 롤백 및 페이지 새로고침 문제 해결

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

Jan 09, 2018 am 09:49 AM
ajax 페이지

이 글은 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로 바꾸는 것입니다.

1

history.pushState(state, title, url)

로그인 후 복사


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


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

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

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

1

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”由“&”进行分割。

刷新、回退监听处理:


1

2

3

4

5

6

7

8

9

10

11

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()函数中进行解析、处理。

对外接口:


1

2

3

4

5

6

7

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中。


1

2

3

4

5

6

7

8

9

10

11

12

13

$("#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请求,获取需要的页面


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

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){

$('#pageContainer').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').addClass('open');

$(this).parents('.sub-menu').show();

});

$(this).parent('li').parents('li').addClass('active open');

return false;

} else {

$('.sub-menu').hide();

}

});

$("ul.page-sidebar-menuli").not(".open").find("ul").hide();

}

}

</differ;>

로그인 후 복사


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

相关推荐:

javascript - ajax刷新的问题

phpajax刷新分页

phpajax刷新留言板

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

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

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Word에서 페이지를 복사하는 방법 Word에서 페이지를 복사하는 방법 Feb 20, 2024 am 10:09 AM

Word에서 페이지를 복사하는 방법

jQuery AJAX 요청에서 발생한 403 오류를 해결하는 방법 jQuery AJAX 요청에서 발생한 403 오류를 해결하는 방법 Feb 20, 2024 am 10:07 AM

jQuery AJAX 요청에서 발생한 403 오류를 해결하는 방법

jQuery AJAX 요청 403 오류를 해결하는 방법 jQuery AJAX 요청 403 오류를 해결하는 방법 Feb 19, 2024 pm 05:55 PM

jQuery AJAX 요청 403 오류를 해결하는 방법

Laravel 페이지에서 CSS를 올바르게 표시할 수 없는 문제를 해결하는 방법 Laravel 페이지에서 CSS를 올바르게 표시할 수 없는 문제를 해결하는 방법 Mar 10, 2024 am 11:33 AM

Laravel 페이지에서 CSS를 올바르게 표시할 수 없는 문제를 해결하는 방법

웹페이지를 빠르게 새로 고치는 방법은 무엇입니까? 웹페이지를 빠르게 새로 고치는 방법은 무엇입니까? Feb 18, 2024 pm 01:14 PM

웹페이지를 빠르게 새로 고치는 방법은 무엇입니까?

3초 안에 페이지 점프를 구현하는 방법: PHP 프로그래밍 가이드 3초 안에 페이지 점프를 구현하는 방법: PHP 프로그래밍 가이드 Mar 25, 2024 am 10:42 AM

3초 안에 페이지 점프를 구현하는 방법: PHP 프로그래밍 가이드

Ajax를 사용하여 PHP 메소드에서 변수를 얻는 방법은 무엇입니까? Ajax를 사용하여 PHP 메소드에서 변수를 얻는 방법은 무엇입니까? Mar 09, 2024 pm 05:36 PM

Ajax를 사용하여 PHP 메소드에서 변수를 얻는 방법은 무엇입니까?

Word에서 콘텐츠 페이지를 삭제하는 방법 소개 Word에서 콘텐츠 페이지를 삭제하는 방법 소개 Mar 26, 2024 am 10:06 AM

Word에서 콘텐츠 페이지를 삭제하는 방법 소개

See all articles