Javascript 从 Javascript 对象属性返回不正确的值

艾迪伦

因此,我有一个 Javascipt 对象数组,其中包含与select元素中的项目相对应的额外属性和信息

当用户在下拉列表中选择一个元素时,它会在 Javascipt 数组中查找该项目,并应该使用来自相应 Javascipt 对象的相关值填充页面上的其他两个字段。

这是js函数:

    function pickedCode(who) {
        who = $(who);
        var opt = who.find(':selected');
        var val = opt.val();

        for (lc = 0; lc < codes.length; lc++) {
            var code = codes[lc];
            if (code.Id == val) {
                var amt = code.Dollars;
                alert(code.Dollars)
                $('input[field=amount]').val((amt > 0 ? amt : ''));
                $('textarea[field=text]').val(code.Text);
                break;
            }
        }
    }

... 这是调用函数的 HTML:

<select onchange="pickedCode(this);" name="ctl00$ContentPlaceHolder1$lstCodes" id="ctl00_ContentPlaceHolder1_lstCodes">
    <option value=""></option>
    <option value="70">3-DAY NOTICE</option>
    <option value="156">A-ABSOLUTE TRANSCRIPT</option>
    <option value="47">ABORTED EVICTION</option>
    <option value="204">ACCESS AGREEMENT</option>
    <option value="174">ADD'L SERVES/MAILINGS</option>
    <option value="124">AFF IN OPP - COMMERCIAL</option>
</select>

...这是Javascipt数据的数组:

var codes = [{
        "Id": 70,
        "Code": "3-DAY NOTICE",
        "Text": "Initiation of Non-Payment Proceeding.",
        "Dollars": "46.20"
    }, {
        "Id": 156,
        "Code": "A-ABSOLUTE TRANSCRIPT",
        "Text": "A-ABSOLUTE TRANSCRIPT",
        "Dollars": "0.00"
    }, {
        "Id": 47,
        "Code": "ABORTED EVICTION",
        "Text": "THE MARSHAL HAD TO ABORT TODAY'S SCHEDULED EVICTION AS ",
        "Dollars": "0.00"
    }, {
        "Id": 204,
        "Code": "ACCESS AGREEMENT",
        "Text": "ACCESS AGREEMENT",
        "Dollars": "0.00"
    }, {
        "Id": 174,
        "Code": "ADD'L SERVES/MAILINGS",
        "Text": "ADD'L MAILINGS",
        "Dollars": "0.00"
    }, {
        "Id": 124,
        "Code": "AFF IN OPP - COMMERCIAL",
        "Text": "Aff in Opp - COMMERCIAL",
        "Dollars": "85.05"
    }
]

它正在查找并找到合适的元素。
它正在获取文本并将其正确设置到 textarea 中。

问题出在财产上Dollars出于某种原因,它总是"0.00"为该Dollars属性返回一个值,即使对于数量大于 0 的项目,我终生无法弄清楚原因。最初,它被命名为Amount; 我想这可能是一个保留字之类的,所以我把它改成了Dollars. 我最初也将它作为一个实际数字,而不是一个字符串,但仍然有同样的问题(然后它总是返回0)。我想可能是将它分配给变量时出现问题,所以我警告的是实际属性本身而不是变量(警告仅用于调试),但属性直接返回0。

我还认为这可能是检查 时的类型问题code.Id == val,但这不可能是问题,因为它实际上是在找到正确的项目并从中获取属性文本。

我在这里发现了一些类似的其他问题,但它们似乎都与作为数组的属性本身有关,而用户没有索引到该属性。不过,我的不是数组,各个属性都只是直接的值。

我已经在 Firefox (57.0) 和 Google Chrome (62.0.3202.94) 中尝试过这个,甚至尝试过 Opera (49.0.2725.47),我在所有三个浏览器中都得到了相同的结果。

只是为了真正让自己感到困惑,我决定逐步通过 Firefox 中的客户端调试器,看看会发生什么。查看页面来源时,明显有46.2的值:在此处输入图片说明

但是,当单步执行函数并查看变量时,当它从数组中提取该代码时,它会将 0.00 值加载到内存中: 在此处输入图片说明

所以,是的......现在我对正在发生的事情感到完全困惑,因为它加载到内存中的值与实际源不匹配。我搜索了代码以确保......和BAH!看着截图引发了一个想法,我想通了。细节来回答,为后人。

艾迪伦

所以它激发了我的思考过程,并结合@sandy_22 的评论和来自 Javascript 调试器的屏幕截图来解决这个问题。

代码中保存的数组是使用文字从代码隐藏中分配的。比如
var codes = <asp:literal id="ltlCodes" runat="server"/>.

当更改页面上的其他下拉菜单之一时,它会通过 AJAX 根据所选客户端重新绑定文字(不同的客户端有不同的费用金额)。

这一切都很好,它会更新文字,源得到适当的更新,当我执行 a 时,View Source我会看到更新的数组。

然而,它并没有导致 Javascript 将新数组重新加载到codes变量中。因此,即使源代码显示了正确的数组数据,内存中的变量本身仍然保存着数据的原始副本。

我取出了文字,所以客户端代码就变成了var codes = null;.
然后在服务器端,客户端切换时,和重新绑定代码,我现在更新他们一段JavaScript代码,像这样:
AjaxManager.ResponseScripts.Add("codes = " & linqForNewArray() & ";")
这样,内存中的变量实际上会得到更新,现在一切正常。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章