Jquery .each()范围问题(bug?)

时间:2011-08-30 17:31:16

标签: javascript jquery jquery-selectors each

出于某种原因,我对嵌套的jQuery.each()函数的调用正在失去一些变量的范围,而不是其他变量。在下面的代码中,Client.KNE引用有效,但ClientDiv没有,即使在此之前,两者都已定义,填充变量......

通过将Client和ClientDiv切换为全局变量,它可以工作,但我觉得我不应该在这里创建全局变量......

不起作用:

jQuery.each(Messages.Additions, function (clientIndex) {
    var Client = Messages.Additions[clientIndex];
    var ClientDiv = $("#clientTitle_" + Client.ClientID);

    if (ClientDiv.length == 0) {
        $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer");
    } else {
        jQuery.each(Client.KNE, function (kneIndex) {
            var KNE = Client.KNE[kneIndex];                       // Works
            var KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE);  // DOES NOT WORK

工作:

jQuery.each(Messages.Additions, function (clientIndex) {
    Client = Messages.Additions[clientIndex];
    ClientDiv = $("#clientTitle_" + Client.ClientID);

    if (ClientDiv.length == 0) {
        $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer");
    } else {
        jQuery.each(Client.KNE, function (kneIndex) {
            KNE = Client.KNE[kneIndex];                       // Works
            KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE);  // Works

任何人都知道我在第一个版本中做错了什么?或者这是一个错误?为什么一个变量有效但另一个变量没有...

从这里开始:Jquery $().each method obscures 'this' keyword看起来我可以将变量传递给函数调用,但是我应该这样做吗?

尝试了上述链接,但无效:

jQuery.each(Messages.Additions, function (clientIndex) {
    var Client = Messages.Additions[clientIndex];
    var ClientDiv = $("#clientTitle_" + Client.ClientID);

    if (ClientDiv.length == 0) {
        $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer");
    } else {
        jQuery.each(Client.KNE, function (kneIndex, Client, ClientDiv) {
            var KNE = Client.KNE[kneIndex];
            var KNEDiv = ClientDiv.find("#kneTitle_" + KNE.KNE);   //Does not work - ClientDiv undefined

类似的问题没有令人满意的答案: Scope of jQuery each() function?

$.each(Messages.Additions, function () {
    var $Client = this;
    var $ClientDiv = $("#clientTitle_" + $Client.ClientID);

    if (!$ClientDiv.length) {
        $("#ClientTemplate").tmpl($Client).appendTo("#ClientContainer");
    } else {
        $.each($Client.KNE, function () {
            var $KNE = this;
            var $KNEDiv = $ClientDiv.find("#kneTitle_" + jq($KNE.KNE));    
            // SWITCHED TO $ PREFIX

1 个答案:

答案 0 :(得分:3)

您可以使用this关键字尝试此操作,该关键字指向循环中的当前项。您应检查if (ClientDiv == null),而不是检查if (ClientDiv.length > 0),因为jQuery如果找不到该元素,则返回空对象,以便检查失败。

var additions;
jQuery.each(Messages.Additions, function () {
    var $clientDiv = $("#clientTitle_" + this.ClientID);

    if ($clientDiv.length == 0) {
        $("#ClientTemplate").tmpl(Client).appendTo("#ClientContainer");
    } else {
        jQuery.each(Client.KNE, function () {
            $clientDiv.find("#kneTitle_" + this.KNE);
        });
    }
});