Displaying HTML Dropdown Selection in Email on Button Press

旧街凉风 提交于 2020-01-17 06:39:25

问题


I have a table where you can select certain rows by checking a checkbox and, on a button click, it will bring up an email client and paste those selections into the email body. This works just fine.

What I am struggling with is that I need to get it to also paste in the selection from the dropdown list but am having trouble integrating that functionality into my code. How could I do this?

HTML select:

<select id="pos-drop" onChange="updateinput();">
    <option selected disabled>POS - City</option>
        <?php foreach($pos->fetchAll() as $city) { ?>
        <option class="pos-city" value="<?php echo $city['POS'];?>"><?php echo $city['POS'];?></option>
        <?php } ?>
</select>

JavaScript...the pos_city_selected variable holds the current dropdown list selection:

var input_num;

var pos_city_selected;
var pos_city_selected1;

function updateinput() {
var pos_city = document.getElementById("pos-drop");
pos_city_selected = pos_city.options[pos_city.selectedIndex];
if (pos_city_selected) {
    pos_city_selected1 = true;
    }
console.log(pos_city_selected);
console.log(pos_city_selected1);
}

$(function($) {
    var RowData = (function(storage, storageKey) {
        var rowData = readFromSession();
        var dataItems = ['loc', 'rp-code', 'sku', 'special-id', 'description', 'quantity', 'unit'];
        var emailDelimiters = {
            'row': '%0D%0A',
            'dataItem': '\xa0\xa0'
        };
        function readFromSession() {
            return JSON.parse(storage.getItem(storageKey) || '{}');
        }
        function writeToSession() {
            storage.setItem(storageKey, JSON.stringify(rowData));
        }
        function writeRow(tr) {
            var $tr = $(tr),
                id = $tr.prop('id');
            if($tr.find('.check').is(':checked')) {
                rowData[id] = {};
                for(var i=0; i<dataItems.length; i++) {
                    rowData[id][dataItems[i]] = $tr.find('.' + dataItems[i]).text();
                }

                input_num = rowData[id].quantity_num = $tr.find('.spinner').val(); // if using HTML5 <input type="number">
            } else {
                delete rowData[id];
            }
            writeToSession();
        }
        function readRow(tr) {
            // restore tr's checkbox and spinner value from stored data
            var $tr = $(tr),
                id = $tr.prop('id'),
                row = rowData[id];
            if(row) {
                $tr.find('.check').prop('checked', true).end()
                     // .find('.spinner').spinner('value', row.quantity_num); // if using spinner widget
                     .find('.spinner').val(row.quantity_num); // if using HTML5 <input type="number">
            }
        }
        function toEmailString() {
            return $.map(rowData, function(row, id) {
                return $.map(row, window.encodeURIComponent).join(emailDelimiters.dataItem);
            });
        }
        // selectively expose functions as methods of RowData
        return {
            'writeRow': writeRow,
            'readRow': readRow, 
            'toEmailString': toEmailString
        };
    })(window.sessionStorage, 'checkedRowData');

    $('#merchTable').on('change', '.check', function() { // on changing a table row ...
        RowData.writeRow($(this).closest('tr').get(0)); // ... set the corresponding row object in RowData and sessionStorage
    }).on('change', '.spinner', function() { // on leaving a spinner widget
        RowData.writeRow($(this).closest('tr').get(0));
    });
    $('#checkout').on('click', function() { // on clicking the [Checkout] button        

        console.log(input_num);
        if (input_num > quantity_num) {
            alert("The entered number cannot be greater than the quantity.");
        } else if (pos_city_selected1 != true) {
            alert("Please select a POS-City from the dropdown list.");
        } else {

        var link = "mailto:me@example.com" + "?subject=" + encodeURIComponent("Order") + "&body=" + RowData.toEmailString();
        console.log(link);
        window.location.href = link;
        }
    });

    // Call this function on completion of every pagination/search
    function restoreVisibleRows() {
        $('#merchTable tbody tr').get().forEach(RowData.readRow);
    }

    restoreVisibleRows();

});

回答1:


Suggested approach :

  • delete those three vars, input_num etc and the function updateinput() {...}, and any mention of them.
  • add a public RowData.validityCheck() method, which throws if it encounters an error in the rowData, eg an entered quanity is greater than its corresponding quantity-available.
  • employ a try{} catch{} structure in #checkout's click handler to orchestrate validity checking and act accordingly, as follows :
$('#checkout').on('click', function() { // on clicking the [Checkout] button
    try {
        // (1) perform validity check on the selected rows
        RowData.validityCheck(); // will throw if error is detected

        // (2) perform validity check on the #pos_drop selection
        var pos_city =  $("#pos-drop").val();
        if (!pos_city) {
            throw new Error('Please select a POS-City from the dropdown list.');
        }
        // (3) perform any further validity checks here (and throw accordingly)

        // Execution will only reach this point if no validity error is encountered.
        var link = "mailto:me@example.com" + "?subject=" + encodeURIComponent("Order") + "&body=Location: " + pos_city + '%0D%0A' + RowData.toEmailString(); // check that delimiter.
        console.log(link);
        window.location.href = link;
    } 
    catch(e) {
        console.error(e);
        $('#userMessage').text(e.message); // element #userMessage - eg a <span> - needs to exist somewhere on the page
    }
});


来源:https://stackoverflow.com/questions/45190241/displaying-html-dropdown-selection-in-email-on-button-press

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!