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 のアドバイスは原則として機能しますが、この問題のコンテキストでは機能しません。タイトルを除いて、すべてのメモは同じです。したがって、$.get() 内に .append() を配置することは、$.get() を強制的に for() で動作させる方法がない限り、明らかに解決策ではありません。

4

3 に答える 3

3

後で必要な変数を のスコープ外で宣言します。ただし、AJAX 呼び出しが実行されるまで$.get返される可能性があることに注意してください(AJAX は非同期で実行されるため)。undefined例えば

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

AJAX は独自に動作し、AJAX 呼び出しを実行するため、JS はそのようには機能しません。ここではシリアル実行がないため、$.getコールバックが返されるのを待ってからfoo定義を取得する必要があります。

于 2013-06-10T12:48:12.883 に答える
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 に答える