8

次のようなマークアップを検討してください

<select id="blah">
  <option value="3">Some text</option>
  <option value="4">Some text</option>
  <option value="8">Some text</option> // <---- target this tag based on value 7
  <option value="19">Some text</option>
</select>

たとえば 7 という値があるとします。valueこの場合、属性が 7 に最も近いオプション タグをターゲットにすることはできます<option value="8">か?

私は、^どちらがで始まることを意味し、$どちらがで終わることを意味するかを認識しており、特定の値に最も近い一致を見つけるためにこのようなものがあるかどうかを期待していました。

4

6 に答える 6

4

私はこのように行きます:

http://jsfiddle.net/GNNHy/

var $tmpOption = $('<option value="7">Some text 7</option>');
$("#blah").append($tmpOption);
var my_options = $("#blah option");
my_options.sort(function(a,b) {
    if (parseInt(a.value,10) > parseInt(b.value,10)) return 1;
    else if (parseInt(a.value,10) < parseInt(b.value,10)) return -1;
    else return 0
})

$("#blah").empty().append( my_options );
于 2013-01-10T10:48:25.507 に答える
3

再帰はどうですか?最も近い値が見つかります:

JS-BINデモ

function getClosest(val, ddl, increment){
  if(ddl.find('option[value="'+val+'"]').length){
      return val;
  }
  else
    try{
      if(increment)
    return getClosest(++val, ddl, increment);
      else
        return getClosest(--val, ddl, increment);
    }
  catch(err){
    return -1;
  }
}

function findClosest(val, ddl){
   var larger = getClosest(val, ddl, true);
   var smaller = getClosest(val, ddl, false);
  if(larger == smaller == -1)
    return -1;
  else if (larger == -1)
    return smaller;
  else if (smaller == -1 )
    return larger;

  if(larger - val > val - smaller)
    return smaller;
  else
    return larger
}    
于 2013-01-10T10:37:49.437 に答える
1

はい、値(7)をオプション値で差し引くだけです(各関数を使用)...最小の肯定的な結果を持つ値がターゲットオプションになります。望ましい結果が得られることを願っています。

于 2013-01-10T10:34:57.467 に答える
1

最も簡単な方法は、おそらく古き良き線形検索です (バイナリを実行できますが、通常よりも注意が必要です)。

var target;
var $options;

var best=Infinity;
var bestAt;

$options.each(function(){
  var error = this.value - target;
  error = error>0 ? error : -error;
  if(error<=best){
    best=error;
    bestAt=this;
  }
})

//return $(bestAt);
于 2013-01-10T10:39:03.390 に答える
1

あなたがjqueryを使うことができるなら、私は次のようなことをします

$(function () {
        // comes from somewhere
        var val = 7;

        var sortByDifference = $("#blah option").sort(function (opt1, opt2) {
            return Math.abs(parseInt($(opt1).val()) - val) - Math.abs(parseInt($(opt2).val()) - val);
        });

        alert($(sortByDifference[0]).val());
    });

sortByDifference では、値にどれだけ近いかによってすべての値がソートされます。このルーチンは、最も近い値よりも大きい値または小さい値を返し、オプションを並べ替える必要はありません。

于 2013-01-10T10:39:07.920 に答える
1
function findClosest(num){
    var select = document.getElementById('blah');
    var options = select.options;
    var dif = Infinity;
    var index;
    for(var i = 0; i < options.length; i++){
        var newdif = Math.abs(parseInt(options[i].value) - num);
        if(newdif < dif){
             dif = newdif;
             index = i;
        }
    }
    select.selectedIndex = index;
}
于 2013-01-10T10:39:44.293 に答える