我仍然是jQuery和ajax场景的新手,但我有一个$ .ajax请求执行GET来检索一些XML文件(大约6KB或更少),但是在用户花费在该页面上的持续时间内XML内容不应该/不会改变(这个设计我不能改变,我也没有权限改变XML文件,因为我从其他地方读取它)。因此,我有一个全局变量,我将响应数据存储到其中,并且对此数据的任何后续查找都在此变量上完成,因此不需要进行多个请求。
鉴于XML文件可以增加的事实,我不确定这是最佳实践,并且也来自java背景我对全局公共变量的看法通常是禁止的。
所以我的问题是,是否有更好的方法可以做到这一点,以及一个问题,如果文件扩展到一些荒谬的文件大小,这是否会导致任何内存问题?
我认为数据可以传递到xml对象中的一些getter / setter类型函数,这将解决我的全局公共变量问题,但仍然提出了我是否应该将响应存储在对象本身内的问题。 / p>
例如,我目前所做的是:
// 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');
答案 0 :(得分:66)
这是一个很好地完成工作的功能。我无法得到上面的最佳答案。
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");
答案 1 :(得分:34)
这对我有用:
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
请求。
答案 2 :(得分:32)
除了存储它之外别无选择。内存分页应该减少那里的潜在问题。
我建议不要使用名为'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');
答案 3 :(得分:16)
您不必执行任何操作。我的项目遇到了同样的问题。你要做的是在on success success回调中进行函数调用以重置全局变量。只要你将异步javascript设置为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;
}
希望这会对你有所帮助。
答案 4 :(得分:8)
您的问题可能与任何本地或全球范围无关,只是服务器在执行“成功”功能与尝试从变量中取出数据的时间之间出现延迟。
在ajax“success”函数触发之前,你有可能试图打印变量的内容。
答案 5 :(得分:7)
您可能会发现将响应值存储在DOM元素中更容易,因为它们可以全局访问:
<input type="hidden" id="your-hidden-control" value="replace-me" />
<script>
$.getJSON( '/uri/', function( data ) {
$('#your-hidden-control').val( data );
} );
</script>
这样做的好处是不需要将async设置为false。显然,这是否合适取决于你想要实现的目标。
答案 6 :(得分:5)
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');
这有效!!!
答案 7 :(得分:3)
function get(a){
bodyContent = $.ajax({
url: "/rpc.php",
global: false,
type: "POST",
data: a,
dataType: "html",
async:false
}
).responseText;
return bodyContent;
}
答案 8 :(得分:2)
也进入这个。很多答案,但是,我只提供一个简单正确的答案。关键是让你的$ .ajax call..sync!
$.ajax({
async: false, ...
答案 9 :(得分:2)
我真的很难在事件的“document.ready”阶段将jQuery ajax的结果导入我的变量。
当用户在页面加载后触发选择框的“onchange”事件时,jQuery的ajax会加载到我的变量中,但是当页面首次加载时,数据不会提供变量。
我尝试了许多很多不同的方法,但最终,查尔斯吉尔伯特的方法最适合我。
向Charles Guilbert致敬!使用他的答案,我能够将数据输入到我的变量中,即使我的页面首次加载也是如此。
以下是工作脚本的示例:
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");
答案 10 :(得分:0)
IMO您可以将此数据存储在全局变量中。但最好使用一些更独特的名称或使用名称空间:
MyCompany = {};
...
MyCompany.cachedData = data;
最好将json用于这些目的,json格式的数据通常比xml格式的数据小得多。
答案 11 :(得分:0)
我建议应该避免从服务器获取大型XML文件:变量“xml”应该像 cache 一样使用,而不是数据存储本身。
在大多数情况下,可以检查缓存并查看是否需要向服务器发出请求以获取所需的数据。这将使您的应用程序更轻,更快。
欢呼,jrh。答案 12 :(得分:0)
.get响应被缓存。因此,你真的无需做任何事情来获得理想的结果。
答案 13 :(得分:0)
我知道线程已经老了,但我认为其他人可能觉得这很有用。根据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;
将有助于将结果直接转换为字符串。 请注意 .responseText; 部分。
答案 14 :(得分:0)
类似于上一个答案:
<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>
答案 15 :(得分:0)
只需使用它。简单有效:
var y;
function something(x){
return x;
}
$.get(bunch of codes, function (data){
y=something(data);
)}
//anywhere else
console.log(y);