【问题标题】:Check the last and the first page and disable button next-previous buttons accordingly检查最后一页和第一页并相应地禁用按钮下一个上一个按钮
【发布时间】:2017-09-09 13:32:09
【问题描述】:

我有 2 个弹出窗口来显示用户列表和管理员列表,每页显示 10 个结果,效果很好。

我正在获取页码。来自 JSON 中的 java servlet。

注意:url中传递了2个参数——resType和pageNo。 页号返回 0、10、20 ...(10 的倍数)。 resType:检查我想要什么样的结果。你可以忽略这部分。

所以我在 createTable 函数中的 url 看起来像这样 -

如何禁用上一个按钮,当它是第一页时?同样,当最后一页时,如何禁用最后一个按钮?

这是代码。

var currentPageNo = 0; // Keep track of currently displayed page

		$('.next-btn').unbind("click").on("click",function(){ // Give buttons an ID (include them in HTML as hidden)
			userList(currentPageNo+10);
			adminList(currentPageNo+10);
			
		});
		$('.prev-btn').unbind("click").on("click",function(){
			userList(currentPageNo-10);
			adminList(currentPageNo-10);
		});

		function userList(pageNo) {
			var resType="userList";
			createTable(resType,pageNo);
		}
		
		function adminList(pageNo) {
			var resType="adminList";
			createTable(resType,pageNo);
		}

		function createTable(resType, pageNo) {
			// Update global variable
			currentPageNo = pageNo; 
			// Set visibility of the "prev" button:
			$('.prev-btn').toggle(pageNo > 0);
			// Ask one record more than needed, to determine if there are more records after this page:
			$.getJSON("https://api.randomuser.me/?results=11&start="+pageNo, function(data) {
				$('#datatable tr:has(td)').empty();
				// Check if there's an extra record which we do not display, 
				// but determines that there is a next page
				$('.next-btn').toggle(data.results.length > 10);
				// Slice results, so 11th record is not included:
				data.results.slice(0, 10).forEach(function (record, i) { // add second argument for numbering records
					var json = JSON.stringify(record);
					$('#datatable').append(
						$('<tr>').append(
							$('<td>').append(
								$('<input>').attr('type', 'checkbox')
											.addClass('selectRow')
											.val(json),
								(i+1+pageNo) // display row number
							),
							$('<td>').append(
								$('<a>').attr('href', record.picture.thumbnail)
										.addClass('imgurl')
										.attr('target', '_blank')
										.text(record.name.first)
							),
							$('<td>').append(record.dob)
						)
					);
				});
				// Show the prev and/or buttons
				
				
			}).fail(function(error) {
				console.log("**********AJAX ERROR: " + error);
			});            
		}

		var savedData = []; // The objects as array, so to have an order.

		function saveData(){
			var errors = [];
			// Add selected to map
			$('input.selectRow:checked').each(function(count) {
				// Get the JSON that is stored as value for the checkbox
				var obj = JSON.parse($(this).val());
				// See if this URL was already collected (that's easy with Set)
				if (savedData.find(record => record.picture.thumbnail === obj.picture.thumbnail)) {
					errors.push(obj.name.first);
				} else {
					// Append it
					savedData.push(obj);
				}
			});
			refreshDisplay();
			if (errors.length) {
				alert('The following were already selected:\n' + errors.join('\n'));
			}
		}

		function refreshDisplay() {
			$('.container').html('');
			savedData.forEach(function (obj) {
				// Reset container, and append collected data (use jQuery for appending)
				$('.container').append(
					$('<div>').addClass('parent').append(
						$('<label>').addClass('dataLabel').text('Name: '),
						obj.name.first + ' ' + obj.name.last,
						$('<br>'), // line-break between name & pic
						$('<img>').addClass('myLink').attr('src', obj.picture.thumbnail), $('<br>'),
						$('<label>').addClass('dataLabel').text('Date of birth: '),
						obj.dob, $('<br>'),
						$('<label>').addClass('dataLabel').text('Address: '), $('<br>'),
						obj.location.street, $('<br>'),
						obj.location.city + ' ' + obj.location.postcode, $('<br>'),
						obj.location.state, $('<br>'),
						$('<button>').addClass('removeMe').text('Delete'),
						$('<button>').addClass('top-btn').text('Swap with top'),
						$('<button>').addClass('down-btn').text('Swap with down')
					)	
				);
			})
			// Clear checkboxes:
			$('.selectRow').prop('checked', false);
			handleEvents();
		}

		function logSavedData(){
			// Convert to JSON and log to console. You would instead post it
			// to some URL, or save it to localStorage.
			console.log(JSON.stringify(savedData, null, 2));
		}

		function getIndex(elem) {
			return $(elem).parent('.parent').index();
		}

		$(document).on('click', '.removeMe', function() {
			// Delete this from the saved Data
			savedData.splice(getIndex(this), 1);
			// And redisplay
			refreshDisplay();
		});

		/* Swapping the displayed articles in the result list */
		$(document).on('click', ".down-btn", function() {
			var index = getIndex(this);
			// Swap in memory
			savedData.splice(index, 2, savedData[index+1], savedData[index]);
			// And redisplay
			refreshDisplay();
		});

		$(document).on('click', ".top-btn", function() {
			var index = getIndex(this);
			// Swap in memory
			savedData.splice(index-1, 2, savedData[index], savedData[index-1]);
			// And redisplay
			refreshDisplay();
		});
			
		/* Disable top & down buttons for the first and the last article respectively in the result list */
		function handleEvents() {
			$(".top-btn, .down-btn").prop("disabled", false).show();
			$(".parent:first").find(".top-btn").prop("disabled", true).hide();
			$(".parent:last").find(".down-btn").prop("disabled", true).hide();
		}

		$(document).ready(function(){
			$('#showExtForm-btn').click(function(){
				$('#extUser').toggle();
			});
			$("#extUserForm").submit(function(e){
				addExtUser();
				return false;
		   });
		});

		function addExtUser() {
			var extObj = {
				name: {
					title: "mr", // No ladies? :-)
					first: $("#name").val(),
					// Last name ?
				},
				dob: $("#dob").val(),
				picture: {
					thumbnail: $("#myImg").val()
				},
				location: { // maybe also ask for this info?
				}
			};
			savedData.push(extObj);
			refreshDisplay(); // Will show some undefined stuff (location...)
		}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<button class="btn btn-primary btn-sm" data-toggle="modal" data-target="#userList" onclick="userList(0)">User List</button>
<button class="btn btn-primary btn-sm" onclick="logSavedData()">Get Saved Data</button>
<button class="btn btn-primary btn-sm" data-toggle="modal" data-target="#adminList" onclick="adminList(0)">User Admin</button>
<button class="btn btn-primary btn-sm" data-toggle="modal" data-target="#extUser">Open External Form</button>

					  <div class="modal fade" id="userList" role="dialog">
						<div class="modal-dialog modal-lg">
						
						  
						  <div class="modal-content">
							<div class="modal-header">
							  <button type="button" class="close" data-dismiss="modal">&times;</button>
							  <h4 class="modal-title">User List</h4>
							</div>
							<div class="modal-body">
							  <div class="table-responsive">
                                  <table class="table table-bordered table-hover" id="datatable">
									<tr>
										<th>Select</th>
										<th>Name</th>
										<th>DOB</th>
									</tr>
								</table>
							  </div>
							  <div class="row">
								<div class="col-sm-offset-3 col-sm-4">
									<button type="button" class="btn btn-primary prev-btn"><span class="glyphicon glyphicon-chevron-left"></span></button>
								</div>

								<div class="col-sm-4">
									<button type="button" class="btn btn-primary next-btn"><span class="glyphicon glyphicon-chevron-right"></span></button>
								</div>
							</div>
                                <hr/>
							<div class="row">
								<div class="col-sm-offset-3 col-sm-4">
									<button type="button" class="btn btn-primary btn-sm" onclick="saveData()">Save selected</button>
								</div>
								<div class="col-sm-4">
									<button type="button" class="btn btn-primary btn-sm close-less-modal" data-dismiss="modal">Close</button>
								</div>
							</div>
							<br />
						  </div>
						</div>
					  </div>
					</div>
					
					<div class="modal fade" id="adminList" role="dialog">
						<div class="modal-dialog modal-lg">
						  <div class="modal-content">
							<div class="modal-header">
							  <button type="button" class="close" data-dismiss="modal">&times;</button>
							  <h4 class="modal-title">Admin List</h4>
							</div>
							<div class="modal-body">
							  <div class="table-responsive">
                                  <table class="table table-bordered table-hover" id="datatable">
									<tr>
										<th>Select</th>
										<th>Name</th>
										<th>DOB</th>
									</tr>
								</table>
							  </div>
							  <div class="row">
								<div class="col-sm-offset-3 col-sm-4">
									<button type="button" class="btn btn-primary prev-btn"><span class="glyphicon glyphicon-chevron-left"></span></button>
								</div>

								<div class="col-sm-4">
									<button type="button" class="btn btn-primary next-btn"><span class="glyphicon glyphicon-chevron-right"></span></button>
								</div>
							</div>
                                <hr/>
							<div class="row">
								<div class="col-sm-offset-3 col-sm-4">
									<button type="button" class="btn btn-primary btn-sm" onclick="saveData()">Save selected</button>
								</div>
								<div class="col-sm-4">
									<button type="button" class="btn btn-primary btn-sm close-less-modal" data-dismiss="modal">Close</button>
								</div>
							</div>
							<br />
						  </div>
						</div>
					  </div>
					</div>
					
					<div class="modal fade" id="extUser" role="dialog">
						<div class="modal-dialog modal-lg">
						
						  <!-- External User-->
						  <div class="modal-content">
							<div class="modal-header">
							  <button type="button" class="close" data-dismiss="modal">&times;</button>
							  <h4 class="modal-title">Add External User</h4>
							</div>
							<div class="modal-body">
							  <form class="form-horizontal" id="extUserForm">
								<div class="form-group">
								  <label class="control-label col-sm-3" for="name">Name:</label>
								  <div class="col-sm-8">
									<input type="text" class="form-control" id="name" name="name" required>
								  </div>
								</div>
								<div class="form-group">
								  <label class="control-label col-sm-3" for="myImg">Image:</label>
								  <div class="col-sm-8">
									<input type="text" class="form-control" id="myImg" name="myImg" required>
								  </div>
								</div>
																
								<div class="form-group">
								  <label class="control-label col-sm-3" for="dob">DOB:</label>
								  <div class="col-sm-8">
									<input type="date" class="form-control" id="dob" name="dob" required>
								  </div>
								</div>
								<hr />
								<div class="form-group">        
								  <div class="col-sm-offset-3 col-sm-3">
									<button class="btn btn-primary btn-sm">Submit</button>
								  </div>
								  <div class="col-sm-3">
									<button type="reset" class="btn btn-primary btn-sm">Reset</button>
								  </div>
								  <div class="col-sm-3">
									<button type="button" class="btn btn-primary btn-sm close-external-modal" data-dismiss="modal">Close</button>
								  </div>
								</div>
							  </form>
							</div> 
						  </div>
						</div>
					  </div>

<div class="container"></div>

【问题讨论】:

    标签: javascript jquery json dynamic


    【解决方案1】:

    createTable 中,应该区分要填充的两个表中的哪一个。所以你应该使用这样的选择器:

    $('#' + resType + ' table')
    

    应该对上一个/下一个按钮选择器进行相同的区分:

    $('#' + resType + ' .next-btn')
    

    在同一个点击处理程序中同时调用 userListadminList 也是错误的,因为它会让你跳过一页结果(从 0 到 20) .您应该根据选择器调用适当的选择器。因此,将您的上一个/下一个点击处理程序更改为:

    // Select button that is descendant of userList
    $('#userList .prev-btn').click(function(){ 
        userList(currentPageNo-10);
    });
    $('#userList .next-btn').click(function(){ 
        userList(currentPageNo+10);
    });
    $('#adminList .prev-btn').click(function(){ 
        adminList(currentPageNo-10);
    });
    $('#adminList .next-btn').click(function(){ 
        adminList(currentPageNo+10);
    });
    

    最后,如果您在服务器上更改一件事,代码将隐藏 next 按钮:让它返回 11 条记录而不是 10 条记录。然后 JavaScript 代码可以知道在 10 条记录之后是否有还有更多数据(不显示第 11 条记录)。

    这里是更新的代码:

    var currentPageNo = 0; // Keep track of currently displayed page
    
    
    // Select button that is descendant of userList
    $('#userList .prev-btn').click(function(){ 
        userList(currentPageNo-10);
    });
    $('#userList .next-btn').click(function(){ 
        userList(currentPageNo+10);
    });
    $('#adminList .prev-btn').click(function(){ 
        adminList(currentPageNo-10);
    });
    $('#adminList .next-btn').click(function(){ 
        adminList(currentPageNo+10);
    });
    
    function userList(pageNo) {
        var resType="userList";
        createTable(resType,pageNo);
    }
    
    function adminList(pageNo) {
        var resType="adminList";
        createTable(resType,pageNo);
    }
    
    function createTable(resType, pageNo) {
        // Update global variable
        currentPageNo = pageNo; 
        // Set visibility of the correct "prev" button:
        $('#' + resType + ' .prev-btn').toggle(pageNo > 0);
        // Ask one record more than needed, to determine if there are more records after this page:
        $.getJSON("https://api.randomuser.me/?results=11&resType="+resType + "&pageIndex=" + pageNo, function(data) {
            var $table = $('#' + resType + ' table');
            $('tr:has(td)', $table).empty();
            // Check if there's an extra record which we do not display, 
            // but determines that there is a next page
            $('#' + resType + ' .next-btn').toggle(data.results.length > 10);
            // Slice results, so 11th record is not included:
            data.results.slice(0, 10).forEach(function (record, i) { // add second argument for numbering records
                var json = JSON.stringify(record);
                $table.append(
                    $('<tr>').append(
                        $('<td>').append(
                            $('<input>').attr('type', 'checkbox')
                                        .addClass('selectRow')
                                        .val(json),
                            (i+1+pageNo) // display row number
                        ),
                        $('<td>').append(
                            $('<a>').attr('href', record.picture.thumbnail)
                                    .addClass('imgurl')
                                    .attr('target', '_blank')
                                    .text(record.name.first)
                        ),
                        $('<td>').append(record.dob)
                    )
                );
            });
            // Show the prev and/or buttons
            
            
        }).fail(function(error) {
            console.log("**********AJAX ERROR: " + error);
        });            
    }
    
    var savedData = []; // The objects as array, so to have an order.
    
    function saveData(){
        var errors = [];
        // Add selected to map
        $('input.selectRow:checked').each(function(count) {
            // Get the JSON that is stored as value for the checkbox
            var obj = JSON.parse($(this).val());
            // See if this URL was already collected (that's easy with Set)
            if (savedData.find(record => record.picture.thumbnail === obj.picture.thumbnail)) {
                errors.push(obj.name.first);
            } else {
                // Append it
                savedData.push(obj);
            }
        });
        refreshDisplay();
        if (errors.length) {
            alert('The following were already selected:\n' + errors.join('\n'));
        }
    }
    
    function refreshDisplay() {
        $('.container').html('');
        savedData.forEach(function (obj) {
            // Reset container, and append collected data (use jQuery for appending)
            $('.container').append(
                $('<div>').addClass('parent').append(
                    $('<label>').addClass('dataLabel').text('Name: '),
                    obj.name.first + ' ' + obj.name.last,
                    $('<br>'), // line-break between name & pic
                    $('<img>').addClass('myLink').attr('src', obj.picture.thumbnail), $('<br>'),
                    $('<label>').addClass('dataLabel').text('Date of birth: '),
                    obj.dob, $('<br>'),
                    $('<label>').addClass('dataLabel').text('Address: '), $('<br>'),
                    obj.location.street, $('<br>'),
                    obj.location.city + ' ' + obj.location.postcode, $('<br>'),
                    obj.location.state, $('<br>'),
                    $('<button>').addClass('removeMe').text('Delete'),
                    $('<button>').addClass('top-btn').text('Swap with top'),
                    $('<button>').addClass('down-btn').text('Swap with down')
                )	
            );
        })
        // Clear checkboxes:
        $('.selectRow').prop('checked', false);
        handleEvents();
    }
    
    function logSavedData(){
        // Convert to JSON and log to console. You would instead post it
        // to some URL, or save it to localStorage.
        console.log(JSON.stringify(savedData, null, 2));
    }
    
    function getIndex(elem) {
        return $(elem).parent('.parent').index();
    }
    
    $(document).on('click', '.removeMe', function() {
        // Delete this from the saved Data
        savedData.splice(getIndex(this), 1);
        // And redisplay
        refreshDisplay();
    });
    
    /* Swapping the displayed articles in the result list */
    $(document).on('click', ".down-btn", function() {
        var index = getIndex(this);
        // Swap in memory
        savedData.splice(index, 2, savedData[index+1], savedData[index]);
        // And redisplay
        refreshDisplay();
    });
    
    $(document).on('click', ".top-btn", function() {
        var index = getIndex(this);
        // Swap in memory
        savedData.splice(index-1, 2, savedData[index], savedData[index-1]);
        // And redisplay
        refreshDisplay();
    });
        
    /* Disable top & down buttons for the first and the last article respectively in the result list */
    function handleEvents() {
        $(".top-btn, .down-btn").prop("disabled", false).show();
        $(".parent:first").find(".top-btn").prop("disabled", true).hide();
        $(".parent:last").find(".down-btn").prop("disabled", true).hide();
    }
    
    $(document).ready(function(){
        $('#showExtForm-btn').click(function(){
            $('#extUser').toggle();
        });
        $("#extUserForm").submit(function(e){
            addExtUser();
            return false;
       });
    });
    
    function addExtUser() {
        var extObj = {
            name: {
                title: "mr", // No ladies? :-)
                first: $("#name").val(),
                // Last name ?
            },
            dob: $("#dob").val(),
            picture: {
                thumbnail: $("#myImg").val()
            },
            location: { // maybe also ask for this info?
            }
        };
        savedData.push(extObj);
        refreshDisplay(); // Will show some undefined stuff (location...)
    }
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <button class="btn btn-primary btn-sm" data-toggle="modal" data-target="#userList" onclick="userList(0)">User List</button>
    <button class="btn btn-primary btn-sm" onclick="logSavedData()">Get Saved Data</button>
    <button class="btn btn-primary btn-sm" data-toggle="modal" data-target="#adminList" onclick="adminList(0)">User Admin</button>
    <button class="btn btn-primary btn-sm" data-toggle="modal" data-target="#extUser">Open External Form</button>
    
      <div class="modal fade" id="userList" role="dialog">
        <div class="modal-dialog modal-lg">
        
          
          <div class="modal-content">
            <div class="modal-header">
              <button type="button" class="close" data-dismiss="modal">&times;</button>
              <h4 class="modal-title">User List</h4>
            </div>
            <div class="modal-body">
              <div class="table-responsive">
                  <table class="table table-bordered table-hover" id="datatable">
                    <tr>
                        <th>Select</th>
                        <th>Name</th>
                        <th>DOB</th>
                    </tr>
                </table>
              </div>
              <div class="row">
                <div class="col-sm-offset-3 col-sm-4">
                    <button type="button" class="btn btn-primary prev-btn"><span class="glyphicon glyphicon-chevron-left"></span></button>
                </div>
    
                <div class="col-sm-4">
                    <button type="button" class="btn btn-primary next-btn"><span class="glyphicon glyphicon-chevron-right"></span></button>
                </div>
            </div>
                <hr/>
            <div class="row">
                <div class="col-sm-offset-3 col-sm-4">
                    <button type="button" class="btn btn-primary btn-sm" onclick="saveData()">Save selected</button>
                </div>
                <div class="col-sm-4">
                    <button type="button" class="btn btn-primary btn-sm close-less-modal" data-dismiss="modal">Close</button>
                </div>
            </div>
            <br />
          </div>
        </div>
      </div>
    </div>
    
    <div class="modal fade" id="adminList" role="dialog">
        <div class="modal-dialog modal-lg">
          <div class="modal-content">
            <div class="modal-header">
              <button type="button" class="close" data-dismiss="modal">&times;</button>
              <h4 class="modal-title">Admin List</h4>
            </div>
            <div class="modal-body">
              <div class="table-responsive">
                  <table class="table table-bordered table-hover" id="datatable">
                    <tr>
                        <th>Select</th>
                        <th>Name</th>
                        <th>DOB</th>
                    </tr>
                </table>
              </div>
              <div class="row">
                <div class="col-sm-offset-3 col-sm-4">
                    <button type="button" class="btn btn-primary prev-btn"><span class="glyphicon glyphicon-chevron-left"></span></button>
                </div>
    
                <div class="col-sm-4">
                    <button type="button" class="btn btn-primary next-btn"><span class="glyphicon glyphicon-chevron-right"></span></button>
                </div>
            </div>
                <hr/>
            <div class="row">
                <div class="col-sm-offset-3 col-sm-4">
                    <button type="button" class="btn btn-primary btn-sm" onclick="saveData()">Save selected</button>
                </div>
                <div class="col-sm-4">
                    <button type="button" class="btn btn-primary btn-sm close-less-modal" data-dismiss="modal">Close</button>
                </div>
            </div>
            <br />
          </div>
        </div>
      </div>
    </div>
    
    <div class="modal fade" id="extUser" role="dialog">
        <div class="modal-dialog modal-lg">
        
          <!-- External User-->
          <div class="modal-content">
            <div class="modal-header">
              <button type="button" class="close" data-dismiss="modal">&times;</button>
              <h4 class="modal-title">Add External User</h4>
            </div>
            <div class="modal-body">
              <form class="form-horizontal" id="extUserForm">
                <div class="form-group">
                  <label class="control-label col-sm-3" for="name">Name:</label>
                  <div class="col-sm-8">
                    <input type="text" class="form-control" id="name" name="name" required>
                  </div>
                </div>
                <div class="form-group">
                  <label class="control-label col-sm-3" for="myImg">Image:</label>
                  <div class="col-sm-8">
                    <input type="text" class="form-control" id="myImg" name="myImg" required>
                  </div>
                </div>
                                                
                <div class="form-group">
                  <label class="control-label col-sm-3" for="dob">DOB:</label>
                  <div class="col-sm-8">
                    <input type="date" class="form-control" id="dob" name="dob" required>
                  </div>
                </div>
                <hr />
                <div class="form-group">        
                  <div class="col-sm-offset-3 col-sm-3">
                    <button class="btn btn-primary btn-sm">Submit</button>
                  </div>
                  <div class="col-sm-3">
                    <button type="reset" class="btn btn-primary btn-sm">Reset</button>
                  </div>
                  <div class="col-sm-3">
                    <button type="button" class="btn btn-primary btn-sm close-external-modal" data-dismiss="modal">Close</button>
                  </div>
                </div>
              </form>
            </div> 
          </div>
        </div>
      </div>
    
    <div class="container"></div>

    【讨论】:

    • 我做了完全相同的事情,但由于某种原因,当我使用我的 url 和 JSON 时,我在弹出窗口中都看不到上一个和下一个按钮!正如我在上面的注释中提到的那样,pageIndex 是否存在问题?
    • 另外,我正在尝试根据收到的包含我的已保存数据的 newJSON 更新显示。但是,它抛出了一个错误。你能看看吗?这是我的问题 - stackoverflow.com/questions/43446315/…
    • 我觉得这里的pageIndex和data.results.length不一样。
    • 你能帮我解决这个问题吗?这是我唯一剩下的一个!我认为它对我有部分作用。
    • 我不知道该如何帮助您,因为我提供了一个有效的 sn-p。也许您可以提供一个说明按钮没有出现在您的案例中的小提琴?
    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多