试图在jQuery中访问$ .get()之外的变量

时间:2013-06-10 12:45:18

标签: jquery

我正在尝试在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 &lsquo;' + element[i].title + '&rsquo; 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()。

3 个答案:

答案 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 &lsquo;' + element[i].title + '&rsquo; 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()的末尾)。

当整个事情执行时,你会在附加正确的标题之前看到每个标题的“未定义”,但我确信我可以解决这个问题。