У меня есть список окон выбора, как показано ниже. Я хочу получить доступ к имени от первого до первого окна выбора, в котором выбрано значение «а».

Когда sb3 выбрал значения = b, тогда, если sb2 selected values ​​= a, я хочу получить это, иначе, если sb1 selected values ​​= a, я хочу получить это

Когда sb2 выбрал значения = b, тогда, если sb1 selected values ​​= a, я хочу получить это и так

Я пытался

console.log( $("[name^='sb'] option[value='a']:selected").closest('select').attr("name")  );

Или

console.log( $(this).parent().closest( "[name^='sb'] option[value='ana']" ).attr("name") ); 

Выборочные списки выбора;

<select name="sb1" >
<option value="a"></option>
<option value="b"></option>
</select>

<select name="sb2" >
<option value="a"></option>
<option value="b"></option>
</select>

<select name="sb3" >
<option value="a"></option>
<option value="b"></option>
</select>

Отредактируйте другой пример;

i want to get closest item prior to selested item.

sb45=a
sb46=a
sb47=b --> this give me sb46
sb48=b --> this give me sb46
sb49=a
sb50=b --> this give me sb49

thanks for help.
0
AyY 1 Мар 2018 в 13:29

1 ответ

Лучший ответ

Вы должны создать рекурсивную функцию, которая перебирает элемент prev и ищет select с помощью value == a, иначе никто не выбрал.

function getRecursivePrevName($node) {
  $sb = $($node).prev("[name^='sb']");
  if($sb.length) {
    if($sb.val()=="a") return $sb.attr("name")
    else return getRecursivePrevName($sb);
  }
  else return null; 
}

Присоединение обработчика изменений покажет, какой sb * выбран (приоритет сверху вниз)

См. Ниже фрагмент:

$("[name^='sb']").on("change", function() {
  
  if($(this).val() !== 'a') {
     var value =  getRecursivePrevName($(this));
     console.log(value);
     if(value != null )
        $("#selected").html("select sb is <span style='color:red'>" + value + "</span>");
     else $("#selected").html("no select has value a");
  }else {
     console.log($(this).attr("name"));
     $("#selected").html("select sb is <span style='color:red'>" + $(this).attr("name") + "</span>");
  }
  
});

function getRecursivePrevName($node) {
  $sb = $($node).prev("[name^='sb']");
  if($sb.length) {
    if($sb.val()=="a") return $sb.attr("name")
    else return getRecursivePrevName($sb);
  }
  else return null; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<select name="sb1">
  <option></option>
  <option value="a">a</option>
  <option value="b">b</option>
</select>

<select name="sb2">
  <option></option>
  <option value="a">a</option>
  <option value="b">b</option>
</select>

<select name="sb3">
  <option></option>
  <option value="a">a</option>
  <option value="b">b</option>
</select>

<select name="sb4">
  <option></option>
  <option value="a">a</option>
  <option value="b">b</option>
</select>

<select name="sb5">
  <option></option>
  <option value="a">a</option>
  <option value="b">b</option>
</select>

<select name="sb6">
  <option></option>
  <option value="a">a</option>
  <option value="b">b</option>
</select>

<br><br>
<div id="selected">
<div>
1
Spring 1 Мар 2018 в 18:08