我有一個基於JSON數據進行更新的表。 表中的每一行都有一個複選框,其中包含相應JSON對象的值,基本上是有關任何用戶的信息。 在選擇任何行並保存以顯示選定的用戶配置文件時,我還將選定的JSON對象存儲在數組'savedData'中。將外部對象添加到現有陣列
我也有一個選擇,通過點擊「打開外部窗體」按鈕彈出的窗體添加外部用戶。現在,我試圖創建一個對象,並在提交該表單時將其存儲在同一個'savedData'數組中。同時,應將'div.parent'生成的&以與從表格中選擇的其他用戶相同的格式附加到'div.container'。
不幸的是,'div.parent'沒有被創建,並且外部對象沒有被添加。
你能幫我解決這個問題嗎?
function createTable() {
\t \t \t $.getJSON("https://api.randomuser.me/?results=5", function(data) {
\t \t \t \t $('#datatable tr:has(td)').remove();
\t \t \t \t data.results.forEach(function (record) {
\t \t \t \t \t var json = JSON.stringify(record);
\t \t \t \t \t $('#datatable').append(
\t \t \t \t \t \t $('<tr>').append(
\t \t \t \t \t \t \t $('<td>').append(
\t \t \t \t \t \t \t \t $('<input>').attr('type', 'checkbox')
\t \t \t \t \t \t \t \t \t \t \t .addClass('selectRow')
\t \t \t \t \t \t \t \t \t \t \t .val(json)
\t \t \t \t \t \t \t),
\t \t \t \t \t \t \t $('<td>').append(
\t \t \t \t \t \t \t \t $('<a>').attr('href', record.picture.thumbnail)
\t \t \t \t \t \t \t \t \t \t .addClass('imgurl')
\t \t \t \t \t \t \t \t \t \t .attr('target', '_blank')
\t \t \t \t \t \t \t \t \t \t .text(record.name.first)
\t \t \t \t \t \t \t),
\t \t \t \t \t \t \t $('<td>').append(record.dob)
\t \t \t \t \t \t)
\t \t \t \t \t);
\t \t \t \t })
\t \t \t }).fail(function(error) {
\t \t \t \t console.log("**********AJAX ERROR: " + error);
\t \t \t });
\t \t }
\t \t var savedData = new Map; // Keyed by image URL. Start with nothing.
\t \t function saveData(){
\t \t \t var errors = [];
\t \t \t // Add selected to map
\t \t \t $('input.selectRow:checked').each(function(count) {
\t \t \t \t // Get the JSON that is stored as value for the checkbox
\t \t \t \t var obj = JSON.parse($(this).val());
\t \t \t \t // See if this URL was already collected (that's easy with Set)
\t \t \t \t if (savedData.get(obj.picture.thumbnail)) {
\t \t \t \t \t errors.push(obj.name.first);
\t \t \t \t } else {
\t \t \t \t \t // Append it to the Map:
\t \t \t \t \t savedData.set(obj.picture.thumbnail, obj);
\t \t \t \t }
\t \t \t });
\t \t \t refreshDisplay();
\t \t \t if (errors.length) {
\t \t \t \t alert('The following were already selected:\n' + errors.join('\n'));
\t \t \t }
\t \t }
\t \t function refreshDisplay() {
\t \t \t $('.container').html('');
\t \t \t savedData.forEach(function (obj) {
\t \t \t \t // Reset container, and append collected data (use jQuery for appending)
\t \t \t \t $('.container').append(
\t \t \t \t \t $('<div>').addClass('parent').append(
\t \t \t \t \t \t $('<label>').addClass('dataLabel').text('Name: '),
\t \t \t \t \t \t obj.name.first + ' ' + obj.name.last,
\t \t \t \t \t \t $('<br>'), // line-break between name & pic
\t \t \t \t \t \t $('<img>').addClass('myLink').attr('src', obj.picture.thumbnail), $('<br>'),
\t \t \t \t \t \t $('<label>').addClass('dataLabel').text('Date of birth: '),
\t \t \t \t \t \t obj.dob, $('<br>'),
\t \t \t \t \t \t $('<label>').addClass('dataLabel').text('Address: '), $('<br>'),
\t \t \t \t \t \t obj.location.street, $('<br>'),
\t \t \t \t \t \t obj.location.city + ' ' + obj.location.postcode, $('<br>'),
\t \t \t \t \t \t obj.location.state, $('<br>'),
\t \t \t \t \t \t $('<button>').addClass('removeMe').text('Delete'),
\t \t \t \t \t \t $('<button>').addClass('top-btn').text('Swap with top'),
\t \t \t \t \t \t $('<button>').addClass('down-btn').text('Swap with down')
\t \t \t \t \t) \t
\t \t \t \t);
\t \t \t \t resetEvents();
\t \t \t })
\t \t \t // Clear checkboxes:
\t \t \t $('.selectRow').prop('checked', false);
\t \t }
\t \t function logSavedData(){
\t \t \t // Translate Map to array of values:
\t \t \t var data = Array.from(savedData, function (pair) {
\t \t \t \t return pair[1];
\t \t \t });
\t \t \t // Convert to JSON and log to console. You would instead post it
\t \t \t // to some URL, or save it to localStorage.
\t \t \t console.log(JSON.stringify(data, null, 2));
\t \t }
\t \t $(document).on('click', '.removeMe', function() {
\t \t \t var key = $('.myLink', $(this).parent()).attr('src');
\t \t \t // Delete this from the saved Data
\t \t \t savedData.delete(key);
\t \t \t // And redisplay
\t \t \t refreshDisplay();
\t \t });
\t \t
\t \t \t /* Swapping the displayed articles in the result list */
\t \t \t function resetEvents() {
\t \t \t \t $(".top-btn, .down-btn").unbind('click');
\t \t \t \t handleEvents();
\t \t \t \t
\t \t \t \t $('.down-btn').click(function() {
\t \t \t \t \t var toMove1 = $(this).parents('.parent');
\t \t \t \t \t $(toMove1).insertAfter($(toMove1).next());
\t \t \t \t \t handleEvents();
\t \t \t \t });
\t \t \t \t $('.top-btn').click(function() {
\t \t \t \t \t var toMove1 = $(this).parents('.parent');
\t \t \t \t \t
\t \t \t \t \t $(toMove1).insertBefore($(toMove1).prev());
\t \t \t \t \t handleEvents();
\t \t \t \t });
\t \t \t }
\t \t \t \t
\t \t \t /* Disable top & down buttons for the first and the last article respectively in the result list */
\t \t \t function handleEvents() {
\t \t \t \t $(".top-btn, .down-btn").prop("disabled", false).show();
\t \t \t \t $(".parent:first").find(".top-btn").prop("disabled", true).hide();
\t \t \t \t $(".parent:last").find(".down-btn").prop("disabled", true).hide();
\t \t \t }
\t \t \t
\t \t \t $(document).ready(function(){
\t \t \t \t $('#showExtForm-btn').click(function(){
\t \t \t \t \t $('#extUser').toggle();
\t \t \t \t });
\t \t \t \t $("#extArticleForm").submit(function(){
addExtUser();
return false;
});
\t \t \t });
\t \t \t
\t \t \t function addExtUser() {
\t \t \t \t var name= $("#name").val();
\t \t \t \t var imgsrc = $("#myImg").val();
\t \t \t \t var dob = $("#dob").val();
\t \t \t \t
\t \t \t \t var errors = [];
extObj = {};
\t \t \t \t extObj = {};
\t \t \t \t extObj["name"]["title"] = "mr";
\t \t \t \t extObj["name"]["first"] = name;
\t \t \t \t extObj["dob"] = dob;
\t \t \t \t extObj["picture"]["thumbnail"] = imgsrc;
\t \t \t \t savedData.push(extObj);
\t \t \t \t if (savedData.get(imgsrc)) {
\t \t \t \t \t \t errors.push(title);
\t \t \t \t \t } else {
\t \t \t \t $('.container').append(
\t \t \t \t \t $('<div>').addClass('parent').append(
\t \t \t \t \t \t $('<label>').addClass('dataLabel').text('Name: '),
\t \t \t \t \t \t +name+
\t \t \t \t \t \t $('<br>'), // line-break between name & pic
\t \t \t \t \t \t $('<img>').addClass('myLink').attr('src', imgsrc), $('<br>'),
\t \t \t \t \t \t $('<label>').addClass('dataLabel').text('Date of birth: '),
\t \t \t \t \t \t +dob+ $('<br>'),
\t \t \t \t \t \t $('<label>').addClass('dataLabel').text('Address: '), $('<br>'),
\t \t \t \t \t \t +address+ $('<br>'),
\t \t \t \t \t \t $('<button>').addClass('removeMe').text('Delete'),
\t \t \t \t \t \t $('<button>').addClass('top-btn').text('Swap with top'),
\t \t \t \t \t \t $('<button>').addClass('down-btn').text('Swap with down')
\t \t \t \t \t) \t
\t \t \t \t);
\t \t \t \t resetEvents();
\t \t \t \t
\t \t \t }
table, th, td {
\t \t \t border: 1px solid #ddd;
\t \t \t border-collapse: collapse;
\t \t \t padding: 10px;
\t \t }
\t \t .parent {
\t \t \t height: 25%;
\t \t \t width: 90%;
\t \t \t padding: 1%;
\t \t \t margin-left: 1%;
\t \t \t margin-top: 1%;
\t \t \t border: 1px solid black;
\t \t }
\t \t .parent:nth-child(odd){
\t \t \t background: skyblue;
\t \t }
\t \t .parent:nth-child(even){
\t \t \t background: green;
\t \t }
\t \t
\t \t label {
\t \t \t float: left;
\t \t \t width: 80px;
\t \t }
\t \t input, textarea {
\t \t \t width: 130px;
\t \t }
\t \t
\t \t #extUser {
\t \t \t border: 1px solid lightgrey;
\t \t \t border-radius: 5px;
\t \t \t display: none;
\t \t \t padding: 10px;
\t \t \t background-color: skyblue;
\t \t }
\t \t
\t \t #extUserForm {
\t \t \t margin: 3px;
\t \t \t padding: 5px;
\t \t }
<button onclick="createTable()">Create Table</button>
\t \t <table id="datatable">
\t \t \t <tr><th>Select</th><th>Name</th><th>DOB</th></tr>
\t \t </table>
\t \t <button onclick="saveData()">Save Selected</button>
\t \t <br />
\t \t <div class="container"></div>
\t \t <button onclick="logSavedData()">Get Saved Data</button>
\t \t <button id="showExtForm-btn">Open External Form</button>
\t \t
\t \t <div id="extUser">
\t \t \t <form id="extUserForm">
\t \t \t \t <p>
\t \t \t \t \t <label for="name">Name:</label>
\t \t \t \t \t <input type="text" id="name" required>
\t \t \t \t </p>
\t \t \t \t <br />
\t \t \t \t <p>
\t \t \t \t \t <label for="myImg">Image:</label>
\t \t \t \t \t <input type="url" id="myImg" required>
\t \t \t \t </p>
\t \t \t \t <br />
\t \t \t \t <p>
\t \t \t \t \t <label for="dob">DOB:</label>
\t \t \t \t \t <input type="date" id="dob" required>
\t \t \t \t </p>
\t \t \t \t <br />
\t \t \t \t <button onclick="addExtUser()">Submit</button>
\t \t \t </form>
\t \t </div>
太好了,謝謝主席先生! – Sunny
我添加了一個彈出窗口,其中包含之前的下一個按鈕。我遇到了一些我無法解決的問題。希望這是關於這個話題的最後一個問題! - http://stackoverflow.com/questions/43361662/disable-the-first-previous-button-on-dynamic-page-numbers – Sunny
我會看看 – trincot