2013-04-11 105 views
0

當我嘗試格式化單元格的貨幣在jQuery數據表中時,出現」SCRIPT438:對象不支持屬性或方法「formatCurrency'」「錯誤使用jQuery formatCurrency庫。SCRIPT438:對象不支持屬性或方法'formatCurrency'「

代碼: jQuery的數據表初始化:

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 

      } 
     } 
    } 

同樣的方法在其他網頁的工作,但這裏唯一的區別是,RefreshGrid()正在從fnCreatedRow函數調用,而在其他情況下,它是從fnRowCallback和fnFooterCallback函數中調用。 「未格式化」值將出現在隱藏字段中。

回答

0

原來的問題是重複的jquery庫腳本:在頁面上和頁面上的用戶控件。我將腳本引用移到母版頁,並從子頁面和控件中移除以避免重複。 感謝您的幫助!

1

我不熟悉formatCurrency庫,但它看起來像你可能試圖把它在這行的字符串:

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

這條線也已成爲一個錯字,我相信這是一個BUG:

var formattted = ...

應該

var formatted = ...


嘗試改變這種喜歡:

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


一般來說,雖然它不是必需的,它通常是最好不要鏈的方法調用,因爲它閱讀困難,難以調試,並且容易犯錯誤。

另外,根據使用範圍,考慮將重用的jQuery對象(選定元素)設置爲全局或本地函數中的變量。每次jQuery遇到一個選擇器時,都必須搜索文檔以重新找到要添加到對象/集合的元素。這需要很多的開銷,你可以通過設置你已經發現的選擇器作爲變量來減少開銷。使用$(this)也是如此,因爲使用$()將其包裝爲jQuery對象,實際上它是一個選擇器,從而使jQuery在文檔中搜索匹配this的元素。


UPDATE:

此外,檢查出this answer其證明和解釋了toNumber方法的調用(包括在formatCurrency插件),調用.formatCurrency()之前。我已經重複了這個例子,下面:

// removes invalid characters, then formats currency 
$(selector).toNumber().formatCurrency(); 
+0

感謝您的拼寫糾正,我嘗試了您的建議,沒有改變。這可能是你提到的鏈接。 – user2248185 2013-04-11 15:56:49

+0

然後我得到一個「SCRIPT438:對象不支持屬性或方法」toNumber'「錯誤。我會說選擇器無法找到隱藏的字段對象,但是當我使用它來獲取隱藏字段的值時,它將返回值。 – user2248185 2013-04-12 07:34:52

+0

我給你的下一個建議是逐行檢查頁面上運行的所有JS的語法。 SCRIPT438錯誤通常是由腳本中其他位置的無效語法錯誤引起的。 – 2013-04-12 15:32:15

0

這是因爲VAL()將返回字符串值,但你應該通過輸入格式()函數

//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證明我的觀點

+0

仍然得到相同的錯誤 – user2248185 2013-04-11 15:59:18

+0

這很奇怪,我嘗試了這個插件的小提琴,我不能把它弄壞。即使我嘗試格式化NaN,false,undefined,null,隨機字符串,它也會優雅地返回並返回未觸及的值。我真的不認爲這個問題是在插件本身,至少如果你使用最新版本。你有完整的頁面,問題在公共場所再現嗎? – Tommi 2013-04-11 19:35:45

+0

不幸的是,我沒有在公共頁面發生這種情況。奇怪的是我可以使用選擇器在隱藏字段中獲取值,但是當我現在嘗試格式化(asNumber,toNumber,formatCurrency)時,會彈出錯誤消息。 – user2248185 2013-04-12 07:38:50

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(); 
+0

與上面的@ZacharyKniebel一樣的建議,沒有改變:-( – user2248185 2013-04-12 07:35:35

相關問題