javascript - 在 JQuery 动态点击处理程序中使用 Ajax 回调变量值

标签 javascript jquery

我正在执行一个简单的 ajax 查询,它以 JSON 数据的形式检索可变长度的值列表。我正在尝试根据此数据创建一个列表,该列表具有基于从 JSON 查询获取的值的点击功能。我可以通过将 onClick-methods 写入 HTML 来使这项工作正常进行,如下所示:

function loadFooList() {
    var list_area = $("#sidebar");
    list_area.html("<ul>")
    $.ajax({
    type: 'GET',
        url:'/data/foo/list',
    dataType: 'json',
    success: function (json) {
        $.each(json, function(i, item) {
        var link_id = "choosesfoo" + item.id;
        list_area.html(list_area.html()
                   + "<li> <a href='#' onClick='alert(\"" + 
                   link_id + "\");'>" + 
                   item.name + "</a></li>");
        });
        list_area.html(list_area.html() + "</ul>");
    }
    });
}

我不喜欢将 onClick 函数写入 HTML,而且我还想了解如何通过 JQuery 点击函数创建相同的功能。

所以问题显然是变量作用域。我在这里的天真的尝试显然不会起作用,因为当点击发生时变量不再存在:

function loadFooList2() {
    var list_area = $("#sidebar");
    var link_ids = Array();
    list_area.html("<ul>")
    $.ajax({
    type: 'GET',
        url:'/data/foo/list',
    dataType: 'json',
    success: function (json) {
        $.each(json, function(i, item) {
        var link_id = "choosefoo" + item.id;
        list_area.html(list_area.html()
                   + "<li> <a href='#' id='" + link_id  + "'>"+item.name+"</a></li>");
        link_ids.push(link_id);
        });
        list_area.html(list_area.html() + "</ul>");
        for (link_index=0; link_index<link_ids.length; link_index++) {
        $("#" + link_ids[link_index]).click(function() {
            alert(link_ids[i]); 
        });
        }
    }
    });
}

显然,我想做的不仅仅是提醒该值,但只要我能够使其正常工作并继续前进,警报调用就会存在。

我知道我必须创建某种处理函数来向其传递状态变量。这适用于单个值(我可以很好地存储整个 link_ids 数组,但我不知道其中哪个是该链接的正确值),但是对于任意长度的列表我将如何执行此操作? p>

这是一个示例 from JQuery docs我正在尝试复制:

 // get some data
 var foobar = ...;

 // specify handler, it needs data as a paramter
 function handler(data) {
   //...
 }

 // add click handler and pass foobar!
 $('a').click(function(){
   handler(foobar);
 });

 // if you need the context of the original handler, use apply:
 $('a').click(function(){
   handler.apply(this, [foobar]);
 });

我想问这里的最后一个例子,“如果你需要原始处理程序的上下文......”可能就是我想要的,但我不知道到底如何到达那里。我尝试将当前的 link_id 值存储到 this 中,并在应用函数中从 this 使用它(使用 apply()),但没有成功。根据 FireFox 的说法,必要的值仍未定义。我正在使用 JQuery 1.3.2。

那么对于这个相对基本的问题,正确的解决方案是什么?

最佳答案

使用append代替html():

function loadFooList() {
    var ul = $('<ul>');
    $.ajax({
        type: 'GET',
        url:'/data/foo/list',
        dataType: 'json',
        success: function (json) {
            $.each(json, function(i, item) {
                var link_id = "choosesfoo" + item.id;
                var a = $('<a>').attr('href','#').bind('click', function(e) {
                    alert(link_id,item_name);
                    e.preventDefault();
                });
                $('<li>').append(a).appendTo(ul);
            });
            ul.appendTo('#sidebar');  // this is where the DOM injection happens
        }
    });
}

关于javascript - 在 JQuery 动态点击处理程序中使用 Ajax 回调变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1852911/

相关文章:

jQuery UI 按钮和 anchor 标记

javascript - 按字母顺序对可排序列表中超过 13 项的元素进行排序

javascript - 如何应用css所有起始元素相同的元素?

javascript - 立即将 eventListener 添加到页面 TypeScript

javascript - AngularJS 指令中的单元测试私有(private)函数

javascript - 如何使用 Firefox addons sdk 的 getThumbnail() Tab API 获取当前选项卡的全宽屏幕截图

javascript - 如何通过 Node Js 拆分字符串?

jquery - 使用 jQuery fadeIn 和 fadeOut 的 Google Maps API V3 InfoBox

javascript - 输入类型范围在 angularjs 重复内不起作用

javascript - Jquery 问题 : click icon > display block > always on top