1

我试图在 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() 本身,它正在返回数据,但我稍后无法访问它(接近代码示例中长 .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 >');
    });
}

需要明确的是,虽然 Brad 的建议在原则上有效,但它不适用于这个问题。除标题外,所有注释都相同。所以将 .append() 放在 $.get() 中显然不是解决方案,除非有办法强制 $.get() 与 for() 一起工作。

4

3 回答 3

3

在 . 的范围之外声明您稍后需要的变量$.get,但请记住,它可能会undefined在 AJAX 调用执行之前返回(因为 AJAX 运行异步)。例如

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才会有任何定义。

于 2013-06-10T12:48:12.883 回答
0

Brads 的回答是正确的,但能解决你的问题。尝试使用 $.get() 中的承诺

    $.get("yourUrl").done(function(data){
        title = decodeURIComponent(data);
        $("#data-notes").append();
    });
于 2013-06-10T13:05:33.527 回答
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() 追溯添加标题,以及我使用它的位置(接近代码示例中长 .append() 的末尾)。

当整个事情执行时,您会在一瞬间看到每个标题的“未定义”,然后再附加正确的标题,但我相信我可以解决这个问题。

于 2013-06-10T13:52:19.057 回答