我正在研究基於瀏覽器的媒體播放器,它幾乎完全是用HTML 5和JavaScript編寫的。後端是用PHP編寫的,但它有一個功能是在初始加載時填充播放列表。其餘全部是JS。有一個搜索欄可以改善播放列表。我希望它能夠像人們打字一樣進行細化,就像大多數媒體播放器一樣。唯一的問題在於它非常緩慢且遲緩,因爲整個節目中大約有1000首歌曲,而且隨着時間的推移,可能會有更多的歌曲。優化JS Array搜索
原始播放列表加載是對PHP頁面的ajax調用,它將結果作爲JSON返回。每個項目都有4個attirbutes:
- 藝術家
- 專輯
- 文件
- 網址
我然後依次通過每個對象,並將其添加到一個數組叫playlist
。在循環結束時創建playlist
的副本,backup
。這樣,我可以在人們優化搜索時優化playlist
變量,但仍然從backup
重新填充它,而不發出其他服務器請求。
方法refine()
在用戶在搜索框中鍵入一個鍵時調用。它會刷新playlist
並搜索backup
數組中每個對象的每個屬性(不包括url
),以查找字符串中的匹配項。如果任何屬性匹配,它會將信息附加到顯示播放列表的表格中,並將其添加到對象playlist
以供實際播放器訪問。
代碼爲refine()
方法:
function refine() {
$('#loadinggif').show();
$('#library').html("<table id='libtable'><tr><th>Artist</th><th>Album</th><th>File</th><th> </th></tr></table>");
playlist = [];
for (var j = 0; j < backup.length; j++) {
var sfile = new String(backup[j].file);
var salbum = new String(backup[j].album);
var sartist = new String(backup[j].artist);
if (sfile.toLowerCase().search($('#search').val().toLowerCase()) !== -1 || salbum.toLowerCase().search($('#search').val().toLowerCase()) !== -1 || sartist.toLowerCase().search($('#search').val().toLowerCase()) !== -1) {
playlist.push(backup[j]);
num = playlist.length-1;
$("<tr></tr>").html("<td>" + num + "</td><td>" + sartist + "</td><td>" + salbum + "</td><td>" + sfile + "</td><td><a href='#' onclick='setplay(" + num +");'>Play</a></td>").appendTo('#libtable');
}
}
$('#loadinggif').hide();
}
正如我之前所說的,對於第一對夫婦的鍵入的字母,這是非常緩慢和laggy。我正在尋找方法來改善這一點,使其更快更順暢。
+1預先烹飪數據的格式,使後面的操作更有效。 – 2010-03-19 04:34:40