【问题标题】:JS "for in" error IE7/8JS "for in" 错误 IE7/8
【发布时间】:2012-12-04 13:05:27
【问题描述】:

我正在为我的网站中的某些表单使用 jquery 验证插件。但是其中一个表单的验证仅在 IE7 和 8 上不起作用。但是使用相同验证脚本的其他表单可以工作。我尝试调试,发现问题出在 showErrors 部分,当我使用“for in”JS 循环通过 errorMap 时,显示对象不支持错误。知道如何解决这个问题吗?

这是我得到的 HTML

<form name="donate" id="form1" action="https://www.xxxx.xxx.xx/api/help" method="POST" target="_top">     
            <input type="hidden" name="face" id="faceinput" style="clear: both; margin:0; padding:0;">
            <input type="hidden" name="image" id="imageinput" style="clear: both; margin:0; padding:0;">
            <h3>Thank you for helping! </h3>
            <h4>Please fill out the following details.</h4>     
            <label>Name: </label>
            <input type="text" name="fullname" id="fullname" class="required" />
            <div class="clearfix"></div>
            <label>Email: </label>
            <input type="text" name="email" id="email" class="required email" />
            <div class="clearfix"></div>
            <label>Amount: </label>
            <input type="text" name="amount" id="amount" class="required number minStrict" /><input type="button" id="submitBtn" value="Donate" />
            <div class="clearfix"></div>
            <div id="error" style="display:none;">
                Oops! The minimum amount to donate is $6. Don't wish to donate? Please click on the close button on the top right hand corner instead.
            </div>
        </form>

JavaScript

    $('#form1').validate({
                onkeyup: false,
                focusInvalid: false,
                rules : {
                    amount : {
                        required    : true,
                        number      : true,
                        minStrict   : 5
                    }
                },
                messages : {
                    fullname: "Please fill out your name",
                    email: {required:"Please fill out your email address",email:"Invalid email address"},
                    amount: {required:"Please fill out amount to donate",number:"Invalid amount",minStrict:"Minimum amount is 6$"}
                },
                showErrors: function(errorMap, errorList) {
                    alert('here');

                    for(error in errorMap){
                        alert(error);
                        /*if(error=="fullname" || error=="email" || error=="amount"){
                            //if(errorMap[error]=='Minimum amount is 6$') {
                                //$('div#error').show();
                            //}
                            //else {
                                $(':text[name='+error+']').val(errorMap[error]).addClass('error');//append err msg in all text field and hightlight
                                $('div#error').hide();
                            }
                        }*/
                    }
                }
            });

$('#submitBtn').click(function(){
            if( $("#form1").valid()){
                alert('here');
                $('div#error').hide();
                $('#form1').submit();
            }
        });

错误

SCRIPT438:对象不支持此属性或方法 validate.js,第 26 行字符 5

只需添加 var 错误即可修复...

for(var error in errorMap){ //

【问题讨论】:

  • 这不是问题,但您可能想使用for(var error in errorMap){,这样error 就不会在全球范围内公开
  • 所以它永远不会提醒error
  • 你贴在“validate.js”文件中的js代码是吗?或者“validate.js”是另一个单独的文件?
  • validate.js 与我在其中包含该脚本的文件相同
  • 哇,谢谢伊恩,我认为它的工作原理是添加 var 错误

标签: javascript jquery validation


【解决方案1】:

我不知道为什么,但是使用

for(var error in errorMap){

似乎解决了您在 cmets 中发布的问题...

【讨论】:

  • 非常好奇为什么在全局范围内使用error 会导致问题?如果你在全局范围内定义var error;,然后使用for(error in errorMap) {
  • 我在这里假设error 被定义为这个范围内的jQuery 功能的一部分。因此返回错误Object doesn't support this property or method。这就解释了!
  • @Lavabeams 好吧,我认为关键是如果您在声明变量时不使用var,它会在全局范围内创建它。因此,由于循环在技术上声明了一个局部变量(以任何方式),因此不使用 var 会这样做。所以你真的不必在全局范围内声明error,只需在与for 循环相同的范围内就可以了。如果 error 甚至被 jQuery 定义在这个范围内,循环应该覆盖它。但是jQuery不能在不传递参数的情况下神奇地填充范围(OP定义为errorMaperrorList...no errors
  • 所以我也很好奇为什么会出现问题。除非你能纠正我的误解
  • @Lavabeams 但同时,可能有一个变量 errors 声明在与原始 $('#form1').validate({ 相同的范围内,但同样,我认为循环只是覆盖了该值。我不知道.......
猜你喜欢
  • 1970-01-01
  • 2016-01-27
  • 2023-03-20
  • 2012-10-03
  • 2018-06-21
  • 1970-01-01
  • 2021-03-21
  • 2011-10-31
  • 2023-03-06
相关资源
最近更新 更多