SCRIPT438:Object不支持属性或方法'formatCurrency'“

时间:2013-04-11 15:31:38

标签: javascript jquery asp.net jquery-plugins

我在尝试使用jQuery formatCurrency库格式化jQuery数据表中的单元格时,出现“SCRIPT438:Object不支持属性或方法'formatCurrency'”“错误。

代码: jQuery DataTable初始化:

var oTable = $('#tblTest').dataTable({
"bFilter": false,
"bInfo": false,
"aoColumns": [{ "bVisible": false }, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
"aaSorting": [[0, 'desc', 1]],
"bScrollInfinite": true, //this property disables pagination
"sScrollY": "230px",
"sScrollX": "940px",
"fnCreatedRow": function (nRow, aData, iDataIndex) {
 RefreshGrid();
  }
});

function RefreshGrid() {
        var nRow = $('#tblTest').dataTable().fnGetNodes();
        for (var i = 0; i < nRow.length; i++) {
            var Total = (nRow[i].children[6].children[0].innerHTML * nRow[i].children[7].children[0].innerHTML).toFixed(2);
            $("input[id$='hfFormat']").val(Total);
            var unformatted = $("input[id$='hfFormat']").val();
            var formatted = $("input[id$='hfFormat']").val(unformatted).formatCurrency().val();
            nRow[i].children[8].children[0].innerHTML = formatted; //Total;
            var Veriance = Total - nRow[i].children[11].children[0].value;
            nRow[i].children[13].children[0].innerHTML = Veriance.toFixed(2);


            nRow[i].children[9].children[0].disabled = true; //CrNo
            nRow[i].children[10].children[0].disabled = true; //Allocate
            nRow[i].children[11].children[0].disabled = true; //CrAmount
            nRow[i].children[14].children[0].disabled = true; //Accept Veriance
            nRow[i].children[15].children[0].disabled = true; //Edit

            nRow[i].children[10].children[0].checked = false; //Allocate
            nRow[i].children[14].children[0].checked = false; //Accept Veriance
            nRow[i].children[15].children[0].checked = false; //Edit
            nRow[i].style.backgroundColor = "";

            if (nRow[i].children[12].children[0].defaultValue == "RejectedReturn") {
                nRow[i].style.backgroundColor = "#FFEDE6";
            }
            else if (nRow[i].children[12].children[0].defaultValue == "CompleteWithVariance") {
                nRow[i].children[15].children[0].disabled = false; //Edit
                nRow[i].children[14].children[0].checked = true; //Accept Verianc
                nRow[i].style.backgroundColor = "#D1D1D1";
            }
            else if (nRow[i].children[12].children[0].defaultValue == "Complete") {
                nRow[i].children[15].children[0].disabled = false; //Edit
                nRow[i].children[10].children[0].checked = true; //Allocate
                nRow[i].style.backgroundColor = "#D1D1D1";
            }
            else if (nRow[i].children[12].children[0].defaultValue == "Outstanding") {
                nRow[i].children[9].children[0].disabled = false; //CrNo
                nRow[i].children[10].children[0].disabled = false; //Allocate
                nRow[i].children[11].children[0].disabled = false; //CrAmount
                nRow[i].children[14].children[0].disabled = false; //Accept Veriance
            }
            else if (nRow[i].children[12].children[0].defaultValue == "Partial") {
                nRow[i].children[9].children[0].disabled = false; //CrNo
                nRow[i].children[10].children[0].disabled = false; //Allocate
                nRow[i].children[11].children[0].disabled = false; //CrAmount
                nRow[i].children[14].children[0].disabled = false; //Accept Veriance

            }
        }
    }

同样的方法适用于其他网页,但唯一的区别是从fnCreatedRow函数调用RefreshGrid(),而在其他实例中,它是从fnRowCallback和fnFooterCallback函数调用的。 “未格式化”的值将出现在隐藏字段中。

4 个答案:

答案 0 :(得分:1)

我对formatCurrency库不熟悉,但看起来你可能试图在这行中的字符串上调用它:

var formattted = $("input[id$='hfFormat']").val(unformatted).formatCurrency().val();

这一行也有一个错字,我认为是一个错误:

var formattted = ...

应该是

var formatted = ...


尝试将其更改为:

$("input[id$='hfFormat']").val(unformatted);
$("input[id$='hfFormat']").formatCurrency();
var formatted = $("input[id$='hfFormat']").val();


一般来说,尽管不是必需的,但通常最好不要对方法调用进行链接,因为它更难以阅读,更难调试,更容易出错。

另外,考虑根据函数的使用范围,将重用的jQuery对象(选定元素)设置为函数中的全局变量或本地变量。每次jQuery命中选择器时,它都必须搜索文档以重新找到要添加到对象/集合的元素。这需要很多开销,您可以通过将已经找到的选择器设置为变量来减少开销。使用$(this)同样如此,因为用$()包装它使它成为一个jQuery对象,它本质上是一个选择器,使jQuery在文档中搜索匹配{{1}的元素}}。


<强>更新

另外,在调用this之前,请查看this answer,其中演示并解释了调用toNumber方法(包含在formatCurrency插件中)。我在下面重复了这个例子:

.formatCurrency()

答案 1 :(得分:0)

这是因为val()返回字符串值,但是你应该将输入传递给format function()

//wrong
var formattted = $("input[id$='hfFormat']").val(unformatted).formatCurrency().val(); 

//right
var input = $("input[id$='hfFormat']");
input.val(unformatted);
var formatted = input.formatCurrency().val();

This fiddle证明我的观点

答案 2 :(得分:0)

检索计算值,将其存储到输入字段,格式化,将其检索回新变量。

var Total = (nRow[i].children[6].children[0].innerHTML * nRow[i].children[7].children[0].innerHTML).toFixed(2);
$("input[id$='hfFormat']").val(Total);
$("input[id$='hfFormat']").formatCurrency();
var formatted = $("input[id$='hfFormat']").val();

答案 3 :(得分:0)

原来问题在于重复的jquery库脚本:在页面上和页面上的用户控件。我将脚本引用移动到主页面并从子页面和控件中删除以避免重复。 谢谢你的帮助!