【问题标题】:If/Else Statement issueIf/Else 语句问题
【发布时间】:2021-05-15 08:18:24
【问题描述】:

我有一个用户搜索 pantone 颜色的输入。如果输入值与 pantone 名称匹配,则 pantones 信息会显示在 dom 中。

我遇到的问题是当用户输入一个不在数据库中的数字时,以前的数据会留在 dom 中并且不会被清除。我想给用户一个消息,他们正在搜索的颜色不在数据库中,并清除以前的数据。

这是我用来触发搜索的代码

var pantone_data = (data) //data is the json from another file im importing
$('#pantoneSearch').focusout(function() {
  var pantoneSearchText = parseInt($('#pantoneSearch').val());
  // console.log(pantone_data)
  $.each(pantone_data, function(i, obj) {
    if (pantoneSearchText == obj.name) {
      console.log("it sure does")
      $('#pantoneTitle').empty();
      $('.card-body span').empty();

      $('#pantoneTitle').append($('<h3>Pantone ' + obj.name + '</h3>'));

      $('#stock1').append($('<p>Stock Name: ' + obj.s1_name + '</p>'));
      $('#stock1').append($('<p>Stock Catagory: ' + obj.s1_catagory + '</p>'));
      $('#stock1').append($('<p>Pantone Match: ' + obj.s1_pantone_match + '</p>'));
      $('#stock1').append($('<p>Delta: ' + obj.s1_delta + '</p>'));

      $('#stock2').append($('<p>Stock Name: ' + obj.s2_name + '</p>'));
      $('#stock2').append($('<p>Stock Catagory: ' + obj.s2_catagory + '</p>'));
      $('#stock2').append($('<p>Pantone Match: ' + obj.s2_pantone_match + '</p>'));
      $('#stock2').append($('<p>Delta: ' + obj.s2_delta + '</p>'));
      return;
    } else {
      console.clear()
      console.log("nope")
      $('.card-body span').empty();
      return;
    }
  });
});

这是数据的 JSON

var data = 
[
    {   
        "id":"11",
        "name":"11",
        "s1_name":"SG12345",
        "s1_catagory":"Semigloss",
        "s1_pantone_match":"true",
        "s1_delta":">2",
        "s2_name":"SP54321",
        "s2_catagory":"SilerMax",
        "s2_pantone_match":"false",
        "s2_delta":"<5"
    },
    {   
        "id":"22",
        "name":"22",
        "s1_name":"ZZ00000",
        "s1_catagory":"Semigloss",
        "s1_pantone_match":"true",
        "s1_delta":">21",
        "s2_name":"YY1111111",
        "s2_catagory":"SilerMax",
        "s2_pantone_match":false,
        "s2_delta":"<100"
    }
]

现在发生的情况是它似乎跳过了 if 语句条件并直接进入 else 语句,清除了“.card-body span”中的所有内容。如果 pantoneSearchText 不匹配任何 pantone 名称,我需要弄清楚如何设置条件,清除内容并添加消息。

希望这很清楚。

【问题讨论】:

  • 什么是pantone_data
  • 忘了添加...它的 var pantone_data = (data) 是来自另一个文件的 json
  • 我用显示的 json var 数据更新了帖子
  • 可以有重复的名字,所以你需要在结果中显示所有的名字吗?

标签: jquery if-statement conditional-statements


【解决方案1】:

在开始搜索之前清除之前的数据。

然后在搜索时,一旦找到匹配项,使用return false 结束$.each() 循环(假设只能有一个匹配项)。

在搜索时,设置一个变量以指示找到匹配项。循环结束后,检查变量,如果没有找到,则显示相应的消息。

var pantone_data = (data) //data is the json from another file im importing
$('#pantoneSearch').focusout(function() {
  var pantoneSearchText = parseInt($('#pantoneSearch').val());
  // console.log(pantone_data)
  var found = false;
  $('#pantoneTitle').empty();
  $('.card-body span').empty();
  $.each(pantone_data, function(i, obj) {
    if (pantoneSearchText == obj.name) {
      console.log("it sure does")
      $('#pantoneTitle').append($('<h3>Pantone ' + obj.name + '</h3>'));

      $('#stock1').append($('<p>Stock Name: ' + obj.s1_name + '</p>'));
      $('#stock1').append($('<p>Stock Catagory: ' + obj.s1_catagory + '</p>'));
      $('#stock1').append($('<p>Pantone Match: ' + obj.s1_pantone_match + '</p>'));
      $('#stock1').append($('<p>Delta: ' + obj.s1_delta + '</p>'));

      $('#stock2').append($('<p>Stock Name: ' + obj.s2_name + '</p>'));
      $('#stock2').append($('<p>Stock Catagory: ' + obj.s2_catagory + '</p>'));
      $('#stock2').append($('<p>Pantone Match: ' + obj.s2_pantone_match + '</p>'));
      $('#stock2').append($('<p>Delta: ' + obj.s2_delta + '</p>'));
      found = true;
      return false;
    }
  });
  if (!found) {
    console.clear();
    console.log("nope");
  }
});

【讨论】:

  • 是的……这行得通。谢谢你的帮助
【解决方案2】:

您想搜索 json 数据,如果找到对象则更新 DOM,如果找不到则清除以前的数据。

var pantone_data = (data) //data is the json from another file im importing
$('#pantoneSearch').focusout(function() {
  var pantoneSearchText = parseInt($('#pantoneSearch').val());
  let found_obj = pantone_data.find(obj => pantoneSearchText == obj.name)
  if (found_obj){
    //update dom
  } else {
    //clear dom
  }
}

您似乎已经有了更新 dom 的代码。

为了清除它 - 您可以使用 $('#stock1').empty() 等...删除所有孩子 如果您想让用户知道alert('No matching color found')

,甚至可以发出警报

如果您想继续使用$each 函数,那么您需要确保在成功找到对象后中断;要在 jquery 中做到这一点,回调函数需要返回 false。所以是这样的:

$.each(pantone_data, function(i, obj) {
  if (pantoneSearchText == obj.name) {
    //update the DOM
    return false;
  } else {
    //clear the DOM
    return;}
  }

它将清除 json 数据中每个对象的 DOM,直到它到达搜索的对象或数组的末尾。这可能不是很有效,特别是如果您的 json 数据很大。因此建议使用上面的.find

【讨论】:

  • 我认为 .find 会更好,因为 json 大约有 5000 行,包含超过 1000 个对象。我尝试使用您提供的代码,但它返回为 obj 未定义
  • 更新清零部分需要使用found_obj。 obj 仅在 find 函数范围内定义。或者您可以将变量命名为 obj 而不是 found_obj。
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多