JQuery-전역 변수에 ajax 응답 저장
Im 여전히 jQuery 및 ajax 장면에 대한 초보자이지만 일부 XML 파일 (~ 6KB 이하)을 검색하기 위해 GET을 수행하는 $ .ajax 요청이 있지만 사용자가 해당 페이지에서 XML 콘텐츠를 사용해야하는 시간 동안 변경되지 않음 (이 디자인은 변경할 수 없으며 다른 곳에서 읽는 동안 XML 파일을 변경할 수있는 권한도 없습니다). 따라서 응답 데이터를 저장하는 전역 변수가 있으며 데이터에 대한 후속 조회가이 변수에서 수행되므로 여러 요청을 할 필요가 없습니다.
XML 파일이 증가 할 수 있다는 사실을 감안할 때 이것이 최선의 방법인지 확실하지 않으며 Java 배경에서 온 전역 공용 변수에 대한 제 생각은 일반적으로 아니오입니다.
그래서 내가 가진 질문은 이것을 수행하는 더 좋은 방법이 있는지 여부와 파일이 우스꽝스러운 파일 크기로 확장되면 메모리 문제가 발생하는지 여부에 대한 질문입니다.
데이터가 xml 객체 내부의 일부 getter / setter 유형 함수로 전달 될 수 있다고 생각합니다. 그러면 전역 공용 변수 문제를 해결할 수 있지만 여전히 응답을 객체 자체 내부에 저장해야하는지에 대한 질문이 제기됩니다.
예를 들어, 현재 내가하는 일은 다음과 같습니다.
// top of code
var xml;
// get the file
$.ajax({
type: "GET",
url: "test.xml",
dataType: "xml",
success : function(data) {
xml = data;
}
});
// at a later stage do something with the 'xml' object
var foo = $(xml).find('something').attr('somethingElse');
그것을 저장하는 것 외에는 주위에 방법이 없습니다. 메모리 페이징은 잠재적 인 문제를 줄여야합니다.
'xml'이라는 전역 변수를 사용하는 대신 다음과 같은 작업을 수행하는 것이 좋습니다.
var dataStore = (function(){
var xml;
$.ajax({
type: "GET",
url: "test.xml",
dataType: "xml",
success : function(data) {
xml = data;
}
});
return {getXml : function()
{
if (xml) return xml;
// else show some error that it isn't loaded yet;
}};
})();
다음으로 액세스하십시오.
$(dataStore.getXml()).find('something').attr('somethingElse');
다음은 작업을 잘 수행하는 기능입니다. 위의 베스트 답변이 작동하지 않았습니다.
jQuery.extend({
getValues: function(url) {
var result = null;
$.ajax({
url: url,
type: 'get',
dataType: 'xml',
async: false,
success: function(data) {
result = data;
}
});
return result;
}
});
그런 다음 액세스하려면 다음과 같이 변수를 만듭니다.
var results = $.getValues("url string");
이것은 나를 위해 일했습니다.
var jqxhr = $.ajax({
type: 'POST',
url: "processMe.php",
data: queryParams,
dataType: 'html',
context: document.body,
global: false,
async:false,
success: function(data) {
return data;
}
}).responseText;
alert(jqxhr);
// or...
return jqxhr;
참고 사항 : global: false
, async:false
그리고 마지막으로 요청에 responseText
연결됩니다 $.ajax
.
이 중 어떤 것도 할 필요가 없습니다. 내 프로젝트에서 같은 문제가 발생했습니다. 당신이하는 일은 성공 콜백 내부에서 함수를 호출하여 전역 변수를 재설정하는 것입니다. 비동기 자바 스크립트를 false로 설정하면 올바르게 작동합니다. 다음은 내 코드입니다. 도움이 되었기를 바랍니다.
var exists;
//function to call inside ajax callback
function set_exists(x){
exists = x;
}
$.ajax({
url: "check_entity_name.php",
type: "POST",
async: false, // set to false so order of operations is correct
data: {entity_name : entity},
success: function(data){
if(data == true){
set_exists(true);
}
else{
set_exists(false);
}
}
});
if(exists == true){
return true;
}
else{
return false;
}
이것이 도움이되기를 바랍니다.
전역 적으로 액세스 할 수 있으므로 응답 값을 DOM 요소에 저장하는 것이 더 쉬울 수 있습니다.
<input type="hidden" id="your-hidden-control" value="replace-me" />
<script>
$.getJSON( '/uri/', function( data ) {
$('#your-hidden-control').val( data );
} );
</script>
이것은 async를 false로 설정할 필요가 없다는 장점이 있습니다. 분명히 이것이 적절한 지 여부는 달성하려는 목표에 달려 있습니다.
문제는 "성공"함수 실행과 변수에서 데이터를 꺼내려고하는 시간 사이의 서버 지연 문제에 대한 로컬 또는 글로벌 범위와 관련이 없을 수 있습니다.
ajax "성공"함수가 실행되기 전에 변수의 내용을 인쇄하려고 할 가능성이 있습니다.
function getJson(url) {
return JSON.parse($.ajax({
type: 'GET',
url: url,
dataType: 'json',
global: false,
async: false,
success: function (data) {
return data;
}
}).responseText);
}
var myJsonObj = getJson('/api/current');
작동합니다 !!!
function get(a){
bodyContent = $.ajax({
url: "/rpc.php",
global: false,
type: "POST",
data: a,
dataType: "html",
async:false
}
).responseText;
return bodyContent;
}
이것도 만났습니다. 많은 답변이 있지만 제가 제공 할 간단한 정답은 하나뿐입니다. 열쇠는 $ .ajax 호출을하는 것입니다 ..sync!
$.ajax({
async: false, ...
이벤트의 "document.ready"단계에서 jQuery ajax의 결과를 내 변수로 가져 오는 데 정말 고생했습니다.
페이지가 이미로드 된 후 사용자가 선택 상자의 "onchange"이벤트를 트리거하면 jQuery의 ajax가 내 변수에로드되지만 페이지가 처음로드 될 때 데이터가 변수를 공급하지 않습니다.
I tried many, many, many different methods, but in the end, it was Charles Guilbert's method that worked best for me.
Hats off to Charles Guilbert! Using his answer, I am able to get data into my variables, even when my page first loads.
Here's an example of the working script:
jQuery.extend
(
{
getValues: function(url)
{
var result = null;
$.ajax(
{
url: url,
type: 'get',
dataType: 'html',
async: false,
cache: false,
success: function(data)
{
result = data;
}
}
);
return result;
}
}
);
// Option List 1, when "Cats" is selected elsewhere
optList1_Cats += $.getValues("/MyData.aspx?iListNum=1&sVal=cats");
// Option List 1, when "Dogs" is selected elsewhere
optList1_Dogs += $.getValues("/MyData.aspx?iListNum=1&sVal=dogs");
// Option List 2, when "Cats" is selected elsewhere
optList2_Cats += $.getValues("/MyData.aspx?iListNum=2&sVal=cats");
// Option List 2, when "Dogs" is selected elsewhere
optList2_Dogs += $.getValues("/MyData.aspx?iListNum=2&sVal=dogs");
IMO you can store this data in global variable. But it will be better to use some more unique name or use namespace:
MyCompany = {};
...
MyCompany.cachedData = data;
And also it's better to use json for these purposes, data in json format is usually much smaller than the same data in xml format.
I'd suggest that fetching large XML files from the server should be avoided: the variable "xml" should used like a cache, and not as the data store itself.
In most scenarios, it is possible to examine the cache and see if you need to make a request to the server to get the data that you want. This will make your app lighter and faster.
cheers, jrh.
.get responses are cached by default. Therefore you really need to do nothing to get the desired results.
I know the thread is old but i thought someone else might find this useful. According to the jquey.com
var bodyContent = $.ajax({
url: "script.php",
global: false,
type: "POST",
data: "name=value",
dataType: "html",
async:false,
success: function(msg){
alert(msg);
}
}).responseText;
would help to get the result to a string directly. Note the .responseText; part.
Similar to previous answer:
<script type="text/javascript">
var wait = false;
$(function(){
console.log('Loaded...');
loadPost(5);
});
$(window).scroll(function(){
if($(window).scrollTop() >= $(document).height() - $(window).height()-100){
// Get last item
var last = $('.post_id:last-of-type').val();
loadPost(1,last);
}
});
function loadPost(qty,offset){
if(wait !== true){
wait = true;
var data = {
items:qty,
oset:offset
}
$.ajax({
url:"api.php",
type:"POST",
dataType:"json",
data:data,
success:function(data){
//var d = JSON.parse(data);
console.log(data);
$.each(data.content, function(index, value){
$('#content').append('<input class="post_id" type="hidden" value="'+value.id+'">')
$('#content').append('<h2>'+value.id+'</h2>');
$('#content').append(value.content+'<hr>');
$('#content').append('<h3>'+value.date+'</h3>');
});
wait = false;
}
});
}
}
</script>
참고URL : https://stackoverflow.com/questions/905298/jquery-storing-ajax-response-into-global-variable
'programing tip' 카테고리의 다른 글
하위 디렉터리를 포함하여 디렉터리에서 모든 0 바이트 파일을 찾는 방법 (0) | 2020.11.13 |
---|---|
숫자 만 허용하는 React Native TextInput (0) | 2020.11.13 |
jQuery로 텍스트를 변경하는 방법 (0) | 2020.11.13 |
특정 div의 거터 공간 만 제거 (0) | 2020.11.13 |
Django CSRF 쿠키가 설정되지 않음 (0) | 2020.11.13 |