【问题标题】:jQuery : If condition working but how to check result in all the if conditionsjQuery:如果条件有效,但如何检查所有 if 条件的结果
【发布时间】:2016-11-24 23:39:31
【问题描述】:

我的问题在于这部分代码。我需要针对不同情况检查这两个条件。

       if(!printnameoptionfucntions.printnameValidation()){
            return false;
        }
        else if(!optionfucntions.engravingValidation()){
            return false;
        }

它总是只检查第一个条件。 我也试过这样

      if(!printnameoptionfucntions.printnameValidation()){
            return false;
        }

         if(!optionfucntions.engravingValidation()){
            return false;
        }

这是#button-add click的代码

  $('#button-add').on('click', function() {
    //.product-info select
    //ajax_price();

    if($(".engravingDropDown option:selected").attr('data-engraving') == 'No Engraving') {
        $('#myModal').modal('hide');
    }
    /* change button text depend on options selection */
    if($('#myOptions').is(':has(span)') === true){

        $('#select-options').text('REVIEW OR EDIT OPTIONS AND ACCESSORIES');


    }else{

        $('#select-options').text('SELECT AVAILABLE OPTIONS AND ACCESSORIES');
    }
    <?php if($showCustomizeBook){ ?>
    $('#customizeBookCustomPriceText').show();
    <?php } ?>
    if(!printnameoptionfucntions.printnameValidation()){
        return false;
    }
    else if(!optionfucntions.engravingValidation()){
        return false;
    }
    checkDropdownToSetButtonvalue();
    $('.selectMandatoryOption').hide().text('');
});

更新:

我的网站中有不同的产品,客户可以在下拉菜单中选择不同的选项。 一种类型的产品有engraving fonts,带有字体选项 Narkisim、cherokee 等。如果用户确实选择了任何字体,则会出现一个输入字段,用户需要在其中编写一些要打印的文本。如果用户选择了一种字体,比如说narkisim 并且没有输入一些文本并单击#button-add 它不应该允许它在不添加一些文本的情况下添加。 其他类型的产品有Name to be printed,可选择书外、书内或无名。如果用户确实选择了一个选项,则会出现一个输入字段,用户需要在其中编写一些要打印的文本。如果用户选择一个选项让说inside the book 并且没有输入一些文本并单击#button-add 它不应该允许它添加而不添加一些文本。 我希望现在有意义吗?

更新 2:

对于带有打印选项的产品

console.log(printnameoptionfucntions.printnameValidation())

它返回错误

console.log(optionfucntions.engravingValidation())

返回真

对于带有雕刻选项的产品

console.log(printnameoptionfucntions.printnameValidation())

返回真

console.log(optionfucntions.engravingValidation())

它返回错误

【问题讨论】:

  • 除非我错误地理解了您的需求,否则只需在您的两个 if() 之间抑制 else(就像您的第二次尝试一样)就可以了。这样,只有当两个条件都为真时才会执行最后两个语句。
  • @cFreed 不正确。第一次检查中的 return false; 使 else 语句完全多余。有没有它的效果都是一样的
  • @cFreed 先生,它不起作用。检查问题的更新
  • @Mehar44 是的,它不起作用,我的错(见我之前的评论)。但是通过您的编辑,我不再了解您的需求。请详细说明:在每种情况下,您实际上希望发生什么?更重要的是:目前没有像预期的那样发生什么?
  • @Mehar44 你把问题复杂化了!请首先简单地记录结果并检查它们。

标签: jquery if-statement


【解决方案1】:

您当前的检查总是失败,因为您正在检查每个产品的雕刻选项打印选项,而每个产品只有一个或另一个。这意味着每个产品都未通过其中一项检查。对于您的检查,您需要首先检查产品是印刷产品还是雕刻产品。

 var isPrintProduct = // do some check to see if is print product
 var isEgravingProduct = // do some check to see if is engraving product
 if(isPrintProduct && !printnameoptionfucntions.printnameValidation()){
        return false;
 }
 else if(isEgravingProduct && !optionfucntions.engravingValidation()){
        return false;
 } 

原答案

目前,你的两次尝试实际上是相同的

在这两种情况下,您的代码都会检查 printnameValidation() 是否返回一个虚假值,如果是,您将从事件处理程序返回 false 并且 不会调用处理程序中的其他代码 .

如果printnameValidation() 返回一个真实值,您继续检查engravingValidation()。如果返回一个虚假值,则您将从事件处理程序返回false,并且不会调用处理程序中的其他代码

这意味着只有当printnameValidation() 的计算结果为true 时才会调用engravingValidation(),而只有当printnameValidation()engravingValidation() 都返回true 时才会调用checkDropdownToSetButtonvalue();

由于您返回 false,else 真的没有做任何事情。

如果这不能回答你的问题,为了进一步帮助你,你需要解释你的逻辑究竟应该做什么

我有一种预感,真正的问题可能在printnameValidation()。似乎printnameValidation() 可能总是返回 false 而你没有意识到这一点。这是我能看到的唯一会导致第二次检查永远不会被调用的事情。

要调试它,只需像这样添加一些日志记录(我敢打赌第一个日志总是false):

console.log(printnameoptionfucntions.printnameValidation());
console.log(optionfucntions.engravingValidation());
if(!printnameoptionfucntions.printnameValidation()){
    return false;
}
if(!optionfucntions.engravingValidation()){
    return false;
}

正如@cFreed 提到的,一旦你解决了“错误”问题,你应该将你的检查重构为:

if(!...printnameValidation || !...engravingValidation) return false;

正如@Pevara 提到的,functionsprintnameoptionfucntionsoptionfucntions 中拼写错误。你真的应该解决这个问题:)

【讨论】:

  • 您在所有方面都是完全正确的。但是我可以坚持建议更简单的if(!...printnameValidation || !...engravingValidation)吗?
  • @cFreed 绝对!实际上我就是这样写的。 (我只是不想让 OP 认为我暗示这会解决问题)但是,一旦真正的问题得到解决,我肯定会建议重构它(以及 Pervara 指出的拼写错误)
  • “我只是不想让 OP 认为我暗示这会解决问题”:哦,是的,很好的预防措施。我同意。
  • 因为你。谢谢楼主:)
  • @DelightedD0D 恭喜你的坚持!干得好。
【解决方案2】:

我真的不明白你想在这里实现什么,对所需行为进行一些额外的解释会很好。

关于这个 sn-p:

    if (!printnameoptionfucntions.printnameValidation()){
        return false;
    }
    else if(!optionfucntions.engravingValidation()){
        return false;
    }
    else{
        return false;
    }

你有 3 个可能的退出,它们都返回 false,所以你总是会在这里得到 false。你也可以写

return false

我想你可能正在这里寻找boolean operators。我猜你想要这样的东西:

if (! printnameoptionfucntions.printnameValidation() || ! optionfucntions.engravingValidation()) {
    return false;
}

return true;

请注意,else 不是必需的,因为只有在 if 评估为 false 时才能到达最后一个 return 语句。

另外,我注意到你的代码中有...fucntions...,不应该是functions吗?我肯定会更改它,即使它是正确的变量名,因为如果您将来必须编辑该代码,那势必会让您有些头疼,等待发生的错误...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2017-06-15
    相关资源
    最近更新 更多