【问题标题】:Using maskMoney input plugin -- still need some assistance使用 maskMoney 输入插件——仍然需要一些帮助
【发布时间】:2010-11-16 09:57:58
【问题描述】:

好的,考虑到正则表达式不能正常工作并且没有错误,我将尝试使用货币掩码。

目标仍然是只允许数字字符和小数。有了 maskMoney,就可以为您工作。

另外,我需要能够成功计算每个单元格。

截至目前,面具工作良好,但我不再能够计算。这就是我困扰的地方。

JQuery 和 JavaScript 代码:


<script type="text/javascript" language="javascript">
    $(document).ready(function(){
     $('.date').mask("99/99/9999");
     $('.account').mask("99-9-999999-9999");
     /*calcuating the vertical and horizontal inputs*/

     $('.R26').attr("disabled", "disabled");

 $('.calc').maskMoney({symbol: ""});
 $('.R25').unmaskMoney();
 $('.R18').unmaskMoney();

 $('input.description').focus(function(){
  if($(this).val()=="Enter text here"){
   $(this).val(" ");
  }

  else{
   $(this).val($(this).val());
  }
 });
 $('input.description').blur(function(){
  if($(this).val()==" "){
   $(this).val("Enter text here");
  }    
 });

$('.calc').keyup(function(){
 var classArray = $(this).attr('class').split(' ');
 //Personal gas expense
 $('.gasamount').sum("change", "#totals4");
 var num = $(this).attr("id").replace(/[A-Za-z$,-]/g, "");
 $('#gasmoney'+num).val(<cfoutput>#mileage#</cfoutput> * $(this).val());
 $('.gasmoney').sum("change", "#totals5");
 //////////////////////

 //Sum of each cell
 $.each(classArray, function(){
  $('.'+this).sum("change", ".ttl"+this);
 });
 //Finding the grandtotal
 var grandTotal = $('.row26').parent().children('td:last').children('input');
 var sum = $('.row25').parent().children('td').children('.calc').sum();
 grandTotal.val(Number(sum).toFixed(2));
});

ColdFusion 和 HTML 代码:

#labels[r]#

<cfloop from="1" to="7" index="i">

 <td id="Day#i#" class="row#r# col#i#">
  <cfif r EQ 1>#Left(DayOfWeekAsString(i),3)#<cfelse><cfif r EQ 2>
  <input type="text" class="date-mask" /><cfelse>
  <input type="text" 
  <cfif labels[r] EQ "Personal Car: Mileage ##"> id="gasamount#i#" <cfelseif labels[r] EQ "Personal Car: Mileage $">id="gasmoney#i#" </cfif><cfif labels[r] EQ "Daily Totals">id="dailytotals#i#"</cfif>
   class="<cfif labels[r] EQ "Personal Car: Mileage ##">gasamount<cfelse><cfif labels[r] NEQ "Daily Totals">C#i#</cfif></cfif>
   <cfif labels[r] EQ "Personal Car: Mileage $">gasmoney<cfelse>calc R#r#</cfif>
   <cfif labels[r] EQ "Daily Totals">ttlC#i#</cfif>"
    <cfif labels[r] EQ "Daily Totals" OR labels[r] EQ "Personal Car: Mileage $">readonly="readonly"</cfif>
     /></cfif>
     </cfif>
 </td>


</cfloop>

 <td class="totals"><cfif r EQ 1>Total<cfelse><input type="text" id="totals" class="ttlR#r#" readonly="readonly" /></cfif></td>

我在同一个应用程序中遇到过类似的问题,但实际上这不是重复的(如果您认为是重复的。)。

'.'+this 是由数组创建的对象。我使用 cfloops 创建了一个大表,并添加了多个类。必须将多个类分解成一个数组,然后才能选择每个类作为自己的类。

【问题讨论】:

  • 我更新了我的答案,以解决您在第一次尝试时遇到的另一个错误。 HTH,如果它不起作用/不清楚,请给我留下评论。

标签: jquery coldfusion currency mask


【解决方案1】:

你很可能想要

.replace(/[A-Za-z$,-]/g, "")

而不是

.replace(/[A-Za-z$-,]/g, "")

后面的表达式匹配:

  • 从“A”到“Z”的所有字符
  • 从“a”到“z”的所有字符
  • 从“$”到“,”的所有字符(有这样的范围,但我不确定这是否是您的实际意图)

前一个表达式(注意移位的破折号)匹配:

  • 从“A”到“Z”的所有字符
  • 从“a”到“z”的所有字符
  • 字符“$
  • 字符“,
  • 字符“-

破折号在字符类中具有特殊含义,它定义了一个范围。如果要匹配文字破折号,请将其移至字符类的末尾(或开头)。

编辑:除此之外,您似乎还想设置该值。通过val() 设置通过将新值传递给函数来工作:

$dotThis = $('.' + this);
$dotThis.val($dotThis.val().replace(/[A-Za-z$-,]/g, ""));

此声明:

$('.'+this).val().replace(/[A-Za-z$-,]/g, "");

创建一个替换的字符串并立即将其丢弃。

【讨论】:

  • 嗨,Tom,我已经尝试使用您的修复程序,但仍然没有结果。我认为这可能是我在事件中放置替换的问题。也许在活动之外。嗯。
  • 这就是我感到困惑的地方。我总是明白这一点,然后发生这种情况。看一看。我已将事件侦听器更改为 keyup,所以它更明显。
  • 看。 val() 是一个函数,而不是一个属性。它返回一个字符串。您可以更改返回的字符串,但这将不会更改元素的原始值 (!)。如果你想设置一个值,你需要用一个参数来调用它:.val(newValue);。我就是这么做的,而你不会。
  • 我很抱歉。我一直在评论代码片段并删除片段,寻找中断并修复问题。我确实使用它开始,但不是使用我发布的代码。由于循环数组,它无法正常工作。尝试不同的方法来纠正这些错误。
【解决方案2】:

可能有点简单,但为什么不使用否定呢? Perl 语法:不确定 javascript。

为什么不: m/([^0-9]+)//g

0 到 9 之间的匹配项

【讨论】:

  • 我已经尝试过了,我得到了相同的结果。使用 JS,而不是 Perl。
【解决方案3】:

编辑:我最初的答案是部分正确的,因为它改变了值,但它没有修复更严重的错误,我现在将解释。

我最初的修复导致每个单元格具有相同值的原因是因为 jQuery $ 方法返回与给定选择器匹配的每个元素。但是,调用 val() 只会得到第一个匹配元素的值,但通过调用 val(value) 设置值将设置 每个 匹配元素的值。

解决方案是在 each() 上方进行替换,这样只会清理单个元素(this)。如果您还想清理总计单元格,那么您可以在 each() 中执行 that 并使用 ".ttl" + this 作为选择器而不是 this

$('.calc').keyup(function(){
    var classArray = $(this).attr('class').split(' ');

    //Sanitize out here, so we only affect one element.
    var singleCellVal = $(this).val()
    singleCellVal.replace(/[A-Za-z$-,]/g, "");
    $(this).val(singleCellVal);

    $.each(classArray, function(){
        var totalsum = $('.'+this).sum();
        $('.ttl'+this).val(Number(totalsum).toFixed(2));
    });

    //Finding the grandtotal
    var grandTotal = $('.row26').parent().
        children('td:last').children( 'input');
    var sum = $('.row25').parent().children( 'td').children('.calc').sum();
    grandTotal.val(Number(sum).toFixed(2));
});

你想要的是

var value = $('.'+this).val();
value.replace(/[A-Za-z$-,]/g, "");
$('.' + this).val(value);

字符类中的 $ 很好,正则表达式中的大多数元字符在字符类中并不特殊。但是,“$-,”将匹配“介于”$, 之间的任何字符。我认为这是您想要的,但如果您只想匹配 $,-,那么您应该将该部分更改为“$,-”(即/[A-Za-z$,-]/g)。字符类末尾的- 将匹配-,除非您对其进行转义,否则其他任何地方都被视为一个范围(\-)。

【讨论】:

  • 嗨,肖恩。实际上,我使用的方法与您完全相同,这就是我要返回的方法。 mercury.hamilton.edu/devmpstone/forms-pdf/… 挺有意思的,没见过。希望你有一个想法,我现在没有!
  • 我试过你编辑的版本,这次我什么也没返回。感谢您尝试提供帮助。如果我找到解决方案,我一定会在这里发布。
【解决方案4】:

好的。所以我自己想通了。

使用 maskMoney(),我能够控制输入的字符并且仍然能够正确计算表格。

为了修正计算,我所要做的就是揭露 .gasamount:

                $('.gasamount').unmaskMoney();

这就是解决计算问题的方法。 ^^ 掩码导致总共 2 行出现问题,而这 2 行导致计算中断。


                $('.calc').maskMoney({symbol: ""});
                $('.R25').unmaskMoney();
                $('.R18').unmaskMoney();

            $('.calc').keyup(function(){
                var classArray = $(this).attr('class').split(' ');
                //Personal gas expense
                $('.gasamount').sum("change", "#totals4");
                var num = $(this).attr("id").replace(/[A-Za-z$,-]/g, "");
                $('#gasmoney'+num).val(<cfoutput>#mileage#</cfoutput> * $(this).val());
                $('.gasmoney').sum("change", "#totals5");
                //////////////////////

                //Sum of each cell
                $.each(classArray, function(){
                    $('.'+this).sum("change", ".ttl"+this);
                });
                //Finding the grandtotal
                var grandTotal = $('.row26').parent().children('td:last').children('input');
                var sum = $('.row25').parent().children('td').children('.calc').sum();
                grandTotal.val(Number(sum).toFixed(2));
            });

所有尝试提供帮助的人,感谢您抽出宝贵时间!

如果有人想将此示例或代码用于未来的应用程序,请随时发表评论并告诉我,我可以设置一个包含示例、说明和源代码的不同页面。

【讨论】:

【解决方案5】:

美元 ($) 用于标记正则表达式搜索的结束。 /[A-Za-z$-,]/ 可能无法正常工作。使用反斜杠 (\$) 转义美元。

【讨论】:

  • 感谢您的小提示,但我在其他应用程序上使用了相同的提示,它就像一个魅力!我添加了它,但仍然有效。可能是更好的方法!
  • 这完全是错误的。 $ 在字符类中没有特殊含义,因此转义它不会改变任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 2012-05-22
  • 2011-09-26
  • 2011-01-13
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
相关资源
最近更新 更多