1

こんな感じです:

text = $('#content').find('.text'),
length = 0;
longest = '';

$(text).each(function(){

  if($(this).text().length > length){
    length = $(this).text().length;
    longest = $(this);        
  }       

});

alert($(longest).text());

しかし、ループなしでそれを行うことはできますか? どういうわけか、最長のテキスト要素を直接選択するということですか? これは遅すぎるので

4

4 に答える 4

4

ループなしではできません。最長のテキストを持つ要素を見つけるための組み込み DOM 関数はありません。そのため、コードの一部はそれらを反復処理して最長の要素を見つける必要があります。

コードのクリーンアップされたバージョンは次のとおりです。

var longestSoFar = -1;
var longestItem;

$('#content .text').each(function(){
    var text = $(this).text();
    if (text.length > longestSoFar) {
        longestSoFar = text.length;
        longestItem = this;
    }       
});

alert($(longestItem).text());

私が考えることができる他の唯一のことは、最初に要素の高さを比較し.text、他の要素よりも高いものを見つけてから、それらのテキストの長さを比較することです. これはおそらく、テキストの実際の長さを計算するよりもはるかに高速ですが、それが役立つかどうかは、レイアウトと、高さが正確なフィルターになるかどうかによって異なります。


さらに高速化するには、HTML が一般的にどのように見えるかを確認して、速度低下の原因を把握する必要があります。 .text()特定の要素内のすべてのテキスト ノードを調べて、すべてのテキストを蓄積する必要があるため、特に高速な操作ではありません。要素にノードが 1 つしかない場合は高速ですが、ノードに関連する HTML が多数ある場合は、すべてのテキスト ノードを見つけるために多数のノードと子ノードをたどる必要があります。


あなたのコードでは、すでに jQuery オブジェクトだったものから jQuery オブジェクトを作成していたことに注意してください。そのように動作しますが、すでに jQuery オブジェクトである場合、関数呼び出しの無駄です。

于 2013-11-04T02:50:59.153 に答える
1

プレーン スクリプト バージョンはかなり似ています。

var longestSoFar = -1;
var longestItem;
var els = document.querySelectorAll('#content .text');

for (var i=0, iLen=els.length, len; i<iLen; i++) {
  len = (els[i].textContent || els[i].innerText).length;
  if ( len > longestSoFar) {
    longestItem = els[i];
    longestSoFar = len;
  }
}

alert(longestItem.textContent || longestItem.innerText);
于 2013-11-04T03:27:55.317 に答える
0

フィドルデモ

フィドル DEMO-1

var con = $('#content');
var arr = con.find('.text').map(function () {
    return $(this).text().length;
}).get();
var longest = arr.indexOf(Math.max.apply(Math,arr));
alert($('#content .text:nth-child(' + ++longest + ')').text());
于 2013-11-04T03:15:27.047 に答える
0

他の方法では、次のように、アルファベット順ではなく長さを並べ替えの方法として使用する関数を使用して、配列get()を保存Arrayし、カスタム並べ替えで配列を並べ替えます。

var listitems = $(".text").get();
listitems.sort(function(a, b) {
      var compA = $(a).text().length;
      var compB = $(b).text().length;
return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;});

// Get the last element of the array which has the longest length
alert("Longest = "+$(listitems[listitems.length-1]).text());

JSFiddleを参照してください

于 2013-11-04T05:09:57.177 に答える