在按下按钮时在电子邮件中显示 HTML 下拉选择
Displaying HTML Dropdown Selection in Email on Button Press
我有一个 table,您可以通过选中复选框来 select 某些行,然后单击按钮,它会打开一个电子邮件客户端并粘贴那些 select 离子进入电子邮件正文。这很好用。
我正在努力解决的问题是,我需要让它也粘贴到下拉列表中的 selection 中,但是我无法将该功能集成到我的代码中。我该怎么做?
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...pos_city_selected 变量保存当前下拉列表 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();
});
建议的方法:
- 删除这三个变量,
input_num
等和 function updateinput() {...}
,以及任何提及的内容。
- 添加一个 public
RowData.validityCheck()
方法,如果它在 rowData 中遇到错误,例如输入的数量大于其对应的可用数量。
- 在#checkout 的点击处理程序中使用
try{} catch{}
结构来协调有效性检查并采取相应行动,如下所示:
$('#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
}
});
我有一个 table,您可以通过选中复选框来 select 某些行,然后单击按钮,它会打开一个电子邮件客户端并粘贴那些 select 离子进入电子邮件正文。这很好用。
我正在努力解决的问题是,我需要让它也粘贴到下拉列表中的 selection 中,但是我无法将该功能集成到我的代码中。我该怎么做?
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...pos_city_selected 变量保存当前下拉列表 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();
});
建议的方法:
- 删除这三个变量,
input_num
等和function updateinput() {...}
,以及任何提及的内容。 - 添加一个 public
RowData.validityCheck()
方法,如果它在 rowData 中遇到错误,例如输入的数量大于其对应的可用数量。 - 在#checkout 的点击处理程序中使用
try{} catch{}
结构来协调有效性检查并采取相应行动,如下所示:
$('#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
}
});