我正在尝试在jQuery中访问$ .get()之外的变量,但它没有发生。
在这里,你会看到我在定义标题时,$ .get()会忽略它。如果我在$ .get()中定义标题,标题将变为未定义:
<script type="text/javascript">
var counter = 0;
var icon = '';
var title;
function paginate(limit) {
counter=counter+limit;
$(".flash").show();
$(".flash").fadeIn(400).html("Loading");
$.ajax({
url: "<?php echo config_item('base_url'); ?>notes/jq_get_notes_for_browser/" + '<?php echo $results['select_folder_for_browser'][0]['folder_id']; ?>/' + counter,
contentType: "application/json; charset=utf-8",
dataType: "json",
cache: false,
success: function (element) {
$(".flash").hide();
$(".load-link").addClass("link-none");
for (var i=0;i<element.length;i++) {
if (element[i].favourite == 'Y') {
icon = 'favourite';
} else {
icon = element[i].status;
}
$.get('<?php echo config_item('base_url'); ?>browser/jq_get_string_truncate_to_length/60/' + encodeURIComponent(element[i].title), function(data) {
title = decodeURIComponent(data);
});
$("#data-notes").append('<div class="browser-item-surround-note note-64" id="note-' + element[i].note_id + '"><div class="container"><a href="<?php echo config_item('base_url'); ?>notes/edit/' + element[i].note_id + '" title="Edit the ‘' + element[i].title + '’ Note"><img src="<?php echo config_item('base_url'); ?>library/images/ui/icons/browser/notes/note-' + icon + '.png" alt="note" width="64" height="64" /></a><p><a href="<?php echo config_item('base_url'); ?>notes/view/' + element[i].note_id + '" title="Created on ' + element[i].creation + '. Modified on ' + element[i].modification + '." class="browser-item-note">' + title + '</a></p></div></div>');
}
}
}
);
}
paginate(0);
</script>
对于$ .get()本身,它返回数据,但我以后无法访问它(接近代码示例中long .append()的末尾)。
修改
for (var i=0;i<element.length;i++) {
var el = element[i];
$.get('<?php echo config_item('base_url'); ?>browser/jq_get_string_truncate_to_length/60/' + encodeURIComponent(element[i].title), function(data) {
$("#data-notes").append('< code >' + decodeURIComponent(data) + '< / code >');
});
}
为了清楚起见,虽然布拉德的建议原则上是有效的,但它并不适用于这个问题;所有笔记都是相同的,但标题除外。所以将.append()放在$ .get()中显然不是解决方案,除非有办法强制$ .get()使用for()。
答案 0 :(得分:3)
稍后在$.get
范围之外声明您需要的变量,但请记住,在执行AJAX调用之前它可能会返回undefined
(因为AJAX运行Async)。 e.g。
var foo
$.get('/some/url',data,function(html){
foo = html;
]);
然后,当你需要它时:
if (foo !== undefined){
// use foo, otherwise the AJAX hasn't successfully completed.
}
另外,因为它是AJAX(异步),所以你不能串行调用它。 (即调用$.get
然后认为下一行的代码将有权访问该变量)在使用$.get
成功查询后,需要将其命名为。例如,这将(可能99.9%)永远不会工作:
var foo;
$.get('/some/url',data,function(html){
foo = html;
});
alert(foo); // fail
JS不能像那样工作,因为AJAX自行启动并执行AJAX调用。此处没有串行执行,因此您必须等待$.get
回调在foo
具有任何定义之前返回。
答案 1 :(得分:0)
Brads答案是正确的,但要解决您的问题。尝试使用$ .get()
中的promise $.get("yourUrl").done(function(data){
title = decodeURIComponent(data);
$("#data-notes").append();
});
答案 2 :(得分:0)
好的,因为这是等待$ .get()完成的问题,这成了解决方案的路径:
<script type="text/javascript">
var counter = 0;
var icon = '';
function get_note_title (id, title) {
$.get('<?php echo config_item('base_url'); ?>browser/jq_get_string_truncate_to_length/60/' + encodeURIComponent(title), function(data) { $('#note-' + id + ' p a').append(decodeURIComponent(data)); });
}
function paginate(limit) {
counter=counter+limit;
$(".flash").show();
$(".flash").fadeIn(400).html("Loading");
$.ajax({
url: "<?php echo config_item('base_url'); ?>notes/jq_get_notes_for_browser/" + '<?php echo (isset($results['select_folder_for_browser'][0]['folder_id'])) ? $results['select_folder_for_browser'][0]['folder_id'] : 0; ?>/' + counter,
contentType: "application/json; charset=utf-8",
dataType: "json",
cache: false,
success: function (element) {
$(".flash").hide();
$(".load-link").addClass("link-none");
for (var i=0;i<element.length;i++) {
if (element[i].favourite == 'Y') {
icon = 'favourite';
} else {
icon = element[i].status;
}
$("#data-notes").append('<div class="browser-item-surround-note note-64" id="note-' + element[i].note_id + '"><div class="container"><a href="<?php echo config_item('base_url'); ?>notes/edit/' + element[i].note_id + '" title="Edit the ‘' + element[i].title + '’ Note"><img src="<?php echo config_item('base_url'); ?>library/images/ui/icons/browser/notes/note-' + icon + '.png" alt="note" width="64" height="64" /></a><p><a href="<?php echo config_item('base_url'); ?>notes/view/' + element[i].note_id + '" title="Created on ' + element[i].creation + '. Modified on ' + element[i].modification + '." class="browser-item-note">' + get_note_title(element[i].note_id, element[i].title) + '</a></p></div></div>');
}
}
}
);
}
paginate(0);
</script>
请注意get_note_title()函数的使用以及它如何使用.append()追溯添加标题,以及我在何处使用它(接近代码示例中long .append()的末尾)。
当整个事情执行时,你会在附加正确的标题之前看到每个标题的“未定义”,但我确信我可以解决这个问题。