【问题标题】:Jquery .each() Scope Problem (bug?)Jquery .each() 范围问题(错误?)
【发布时间】:2011-08-31 20:03:15
【问题描述】:

出于某种原因,我对嵌套 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

【问题讨论】:

  • 不应该是带有小写f的“.find()”吗?
  • 很好,我实际上是在发布代码后就在这里修复了我的代码。不幸的是,这不是我的问题的原因;-)
  • 请阅读“询问 JavaScript 问题时,您应该”部分here
  • 我的意思是这个项目:“隔离有问题的代码并在 jsFiddle 或 JS Bin 等在线环境中重现它”。不,你的 sn-p 不够清楚,因为它不是孤立的。

标签: javascript jquery jquery-selectors each


【解决方案1】:

您可以使用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);
        });
    }
});

【讨论】:

  • 感谢空检查指针。但是,我看不到您的代码如何帮助我避免在每个循环中为子级 ClientDiv 重新选择器。对 Client 的引用是有效的部分,它是 ClientDiv 失败了,大概我必须使用 Additions/Client 引用重新选择?
  • 这确实有效。在变量之前添加 $ 有什么作用?这只是让它成为一个全局变量吗?
  • 长度检查向后看——不应该是!clientDiv.length吗?
  • @Jmans,您是说 !clientDiv.length 将在长度为 0 时评估为假?这对我来说是一个新的,但如果是这样的话,我喜欢它。
  • @Shankar,我还是很好奇,$ 前缀对变量有什么影响?这只是全局的简写,还是那里发生了一些 jquery 魔术?
猜你喜欢
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多