将数据传递给匿名Javascript函数

时间:2012-03-09 08:15:34

标签: javascript jquery

我正在尝试使用jQuery查询web服务,并使用jquery模板将回复插入到我的html页面中。我的代码目前看起来像这样:

$(function () {
  $('.media-releases h3 div').click(function () {

    var button = $(this);
    if ($(this).hasClass("expand")) {
        $(this).addClass("spinner");
        var params = '{ "year": "' + 2012 + '", "month": "' + 02 + '" }';

        $.ajax({
            type: "POST",
            url: "NewsReleases.asmx/GetNewsReleases",
            data: params,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
                var result = jQuery.parseJSON(response.d);
                $.get('NewsRelease.htm', function (data) {
                    // The problem is here, button is null. 
                    // I assume I have to create a closure 
                    // but I'm not sure how to do it.
                    var ul = button.parentNode.nextSibling;
                    $.tmpl(data, result).appendTo(ul);
                });

                button.removeClass("spinner");
                button.parents('h3').next().slideDown();
                button.removeClass('expand').addClass('minimise');

            },
            error: function (error) {
                /*Error handling code removed*/
            }
        });

    } else {
        button.parents('h3').next().slideUp();
        button.removeClass('minimise').addClass('expand');
    }
});

});

如何在上面的函数中访问按钮变量,以便我可以将模板附加到它?

2 个答案:

答案 0 :(得分:4)

上面的代码应该可以使用,因为success函数是在定义button的上下文中创建的。

如果它不起作用,那么其他东西可能会被打破。更多选择:

  • 检查错误控制台
  • 逐步浏览JS调试器中的代码

[编辑] 问题是button.parentNode; button是一个jquery节点,而不是DOM节点(var button = $(this);)。请改用button.parent()

答案 1 :(得分:0)

调用其他预定义函数,这使您能够将按钮作为参数传递 这将使您获得成功:

success: function (response) {
                onSuccess(response,button);
            },

您新创建的功能将如下:

function onSuccess(response,button){
    var result = jQuery.parseJSON(response.d);
                    $.get('NewsRelease.htm', function (data) {
                        /*The problem is here, button is null. I assume I have to create a closure but I'm not sure how to do it.*/
                        var ul = button.parentNode.nextSibling;
                        $.tmpl(data, result).appendTo(ul);
                    });

                    button.removeClass("spinner");
                    button.parents('h3').next().slideDown();
                    button.removeClass('expand').addClass('minimise');
}

Source