2013-04-11 3 views
0

Je reçois une erreur" formatCurrency "" SCRIPT438: Objet ne prend pas en charge la propriété ou la méthode "" lors de la mise en forme de la devise pour les cellules d'un référentiel jQuery en utilisant la bibliothèque jQuery formatCurrency.SCRIPT438: L'objet ne prend pas en charge la propriété ou la méthode 'formatCurrency' "

code: jQuery Initialisation 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 

      } 
     } 
    } 

La même approche a travaillé dans d'autres pages Web, mais la seule différence ici est que RefreshGrid() est appelée à partir de la fonction fnCreatedRow alors que dans les autres cas, il était appelé à partir des fonctions fnRowCallback et fnFooterCallback. La valeur "non formatée" sera présente dans le champ caché.

Répondre

0

Il s'avère que le problème était avec les scripts de bibliothèque jquery dupliqués: sur la page et un contrôle utilisateur sur la page. J'ai déplacé la référence de script à la page principale et retiré des pages et des contrôles enfants pour éviter la duplication. Merci pour l'aide les gars!

1

Je ne connais pas la bibliothèque formatCurrency, mais il semble que vous pouvez essayer d'appeler sur une chaîne dans cette ligne:

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

Cette ligne a également une faute de frappe dans ce que je crois est un bug:

var formattted = ...

devrait être

var formatted = ....


Essayez de changer cela comme à:

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


D'une manière générale, et bien qu'il ne soit pas nécessaire, il est généralement préférable de ne pas la chaîne de vos appels de méthode, comme devient plus difficile à lire, plus difficile à déboguer et plus facile à faire des erreurs. En outre, envisagez de définir vos objets jQuery réutilisés (éléments sélectionnés) sur des variables, globalement ou localement dans une fonction, en fonction de l'étendue dans laquelle ils doivent être utilisés. Chaque fois que jQuery frappe un sélecteur, il doit chercher dans le document pour retrouver le ou les éléments à ajouter à l'objet/à la collection. Cela nécessite BEAUCOUP de frais généraux, que vous pouvez réduire en réglant les sélecteurs que vous avez déjà trouvés être des variables. La même chose vaut pour l'utilisation de $(this), comme l'envelopper avec $() en fait un objet jQuery, qui est, essentiellement, un sélecteur, ce qui oblige jQuery à chercher dans le document l'élément correspondant à this.


MISE À JOUR:

Aussi, consultez this answer qui démontre et explique l'appel de la méthode toNumber (inclus dans le plugin formatCurrency), avant d'appeler .formatCurrency().Je l'ai répété cet exemple, ci-dessous:

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

merci pour la correction d'orthographe, j'ai essayé votre suggestion, pas de changement. Ce pourrait être l'enchaînement auquel vous avez fait allusion. – user2248185

+0

je reçois alors un "SCRIPT438: Object ne supporte pas la propriété ou la méthode 'toNumber'" erreur. J'aurais dit que le sélecteur ne peut pas trouver l'objet de champ caché mais quand je l'utilise pour obtenir la valeur du champ caché, il renvoie la valeur. – user2248185

+0

La suggestion suivante que j'ai pour vous est de revenir en arrière et de vérifier ligne par ligne la syntaxe de tous les JS en cours d'exécution sur la page. Les erreurs 'SCRIPT438' sont souvent causées par des erreurs de syntaxe non valides qui se trouvent ailleurs dans le script. –

0

C'est parce que val() retourne vous valeur de chaîne, mais vous devez passer l'entrée à la fonction de format()

//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 démontrer mon point

+0

toujours obtenir la même erreur – user2248185

+0

Ceci est étrange, j'ai expérimenté dans le violon avec ce plugin et je ne peux pas le casser. Même lorsque j'essaie de formater NaN, false, undefined, null, les chaînes aléatoires tombent gracieusement et renvoient une valeur intacte. Je ne pense pas vraiment que le problème soit dans le plugin lui-même, au moins si vous utilisez la dernière version. Avez-vous une page complète où le problème se reproduit quelque part en public? – Tommi

+0

Malheureusement, je n'ai pas une page en public où cela se produit. ce qui est étrange c'est que je peux obtenir la valeur dans le champ caché en utilisant le sélecteur mais quand j'essaie maintenant de formater (asNumber, toNumber, formatCurrency), l'erreur apparaît. – user2248185

0

Récupère la valeur calculée, la stocke dans le champ de saisie, la formate, la récupère dans une nouvelle variable.

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

Même suggestion que @ZacharyKniebel ci-dessus, pas de changement :-( – user2248185

Questions connexes