私の ASP.NET Web アプリには、データベースから 50 個の画像をページに読み込む JavaScript 関数が含まれています。ユーザーは、前または次のページに移動したり、ドロップダウン リストから特定のページを選択したりできます。
通常は期待どおりに動作しますが、奇妙なことが 1 つあります。ドロップダウンでページ番号を変更した後、[次へ] ボタンを選択すると、ページ番号に 1 が追加されません。代わりに、現在のページ番号を文字列のように扱い、それに 1 を追加します。(たとえば、2 から 21、および 10 から 101 になります。) 前のボタンは正常に機能し、前のボタンまたは次のボタンの直後に使用すると次のボタンが機能します。これは、ドロップダウン リストを使用する特定の組み合わせのみです。問題のある次のボタンが続きます。
問題のコードは次のとおりです。
function getPageOfPhotos(PageNumber) {
$.ajax({
type: "GET",
url: "/PhotoManager.svc/GetSomePhotos",
data: {"PageNumber": PageNumber},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
ButtonsString = '<table><tr>'
ButtonsString += '<td><div style="text-align:center"><input type="button" value="Prev Page" '
+ 'onclick="getPageOfPhotos(' + (PageNumber - 1).toString() + ')"'
+ (PageNumber < 2 ? ' disabled' : '')
+ ' /></div></td>';
ButtonsString += '<td><div style="text-align:center">Go To Page: '
+ '<select id="GoTo_Page" onchange="getPageOfPhotos(this[this.selectedIndex].value)">';
for (N = 1; N <= Math.ceil(ThumbnailCount / 50); N++) {
ButtonsString += '<option value="' + N.toString() + (N == PageNumber ? '" selected' : '" ') + '>' + N.toString() + '</option>';
}
ButtonsString += "</select></td>";
ButtonsString += '<td><div style="text-align:center"><input type="button" value="Next Page" '
+ 'onclick="getPageOfPhotos(' + (PageNumber + 1).toString() + ')"'
+ (PageNumber * 50 >= ThumbnailCount ? ' disabled' : '')
+ ' /></div></td>';
ButtonsString += '</tr></table>';
for (var D in data) {
// Code that uses the photos themselves snipped
}
},
error: function (HelpRequest, ErrorCode, TheError) {
ButtonsString = "Error getting thumbnails:<br />" + TheError;
},
async: false
});
$(ButtonsDiv).html(ButtonsString);
}
問題は次のとおりです。
'onclick="getPageOfPhotos(' + (PageNumber + 1).toString() + ')"'
PageNumber は整数であるはずですが、(PageNumber + 1) は (PageNumber.ToString() + "1") として扱われています。これを (1 + PageNumber) に変更しても同じ問題がありますが、1 が前に表示される点が異なります (したがって、3 ページ目は 4 ページ目または 31 ページ目ではなく 13 ページ目にジャンプします)。(PageNumber * 1 + 1) に変更すると、正しく機能します。
これは既知のバグですか、それともコードに何か不足していますか? これは IE と Firefox の両方で行われることに注意してください。