好的,这可能有点长,所以请坚持下去!
我在 HTML 中有一个时间表网格,显示时段/天数,每个单元格都设置为“可选”类。
然后我使用 jQuery UI Selectable 让我只选择设置为可选的单元格(以停止选择表头)。完成选择后,javascript 会将隐藏字段添加到表单中,以供 POST 获取。
这是错误出现的地方。
如果您拖动多个单元格并单击 BOOK,它会正确传递它们(选择 3 个单元格并通过隐藏输入传递)。如果您拖动多个单元格,然后单选一个不同的单元格并单击 BOOK,它似乎会选择以前的多项选择。
现在更奇怪的是,它不会在 Firefox 或我的 IE9 副本中执行此操作,但在其他 IE9 副本上它确实会导致此错误。由于我们无法真正使用 FF 或其他任何东西的教育环境,我需要它在 IE8/9/10 上工作。
这是我拥有的 JavaScript 位......
诚然,它们可能看起来很乱,我以前从未真正使用过 JavaScript,但所选函数可以按我的意愿工作。似乎导致问题的是未选择的功能。
$( "#selectable" ).selectable({
filter: ".selectable",
selected: function() {
var count = 0;
$( ".ui-selected", this ).each(function() {
var data = $(this).data();
$(data).each(function(key, value){
var room_id = document.createElement("input");
room_id.setAttribute("type", "hidden");
room_id.setAttribute("name", "booking["+count+"][room]");
room_id.setAttribute("value", data.room);
room_id.setAttribute("class", "js-added");
document.getElementById("add").appendChild(room_id);
var date_id = document.createElement("input");
date_id.setAttribute("type", "hidden");
date_id.setAttribute("name", "booking["+count+"][date]");
date_id.setAttribute("value", data.date);
date_id.setAttribute("class", "js-added");
document.getElementById("add").appendChild(date_id);
var period_id = document.createElement("input");
period_id.setAttribute("type", "hidden");
period_id.setAttribute("name", "booking["+count+"][period]");
period_id.setAttribute("value", data.period);
period_id.setAttribute("class", "js-added");
document.getElementById("add").appendChild(period_id);
var day_id = document.createElement("input");
day_id.setAttribute("type", "hidden");
day_id.setAttribute("name", "booking["+count+"][day]");
day_id.setAttribute("value", data.day);
day_id.setAttribute("class", "js-added");
document.getElementById("add").appendChild(day_id);
var bookable_id = document.createElement("input");
bookable_id.setAttribute("type", "hidden");
bookable_id.setAttribute("name", "booking["+count+"][bookable]");
bookable_id.setAttribute("value", data.bookable);
bookable_id.setAttribute("class", "js-added");
document.getElementById("add").appendChild(bookable_id);
var bookable_id_delete = document.createElement("input");
bookable_id_delete.setAttribute("type", "hidden");
bookable_id_delete.setAttribute("name", "booking["+count+"][bookable]");
bookable_id_delete.setAttribute("value", data.bookable);
bookable_id_delete.setAttribute("class", "js-added");
document.getElementById("delete").appendChild(bookable_id_delete);
var booking_id_delete = document.createElement("input");
booking_id_delete.setAttribute("type", "hidden");
booking_id_delete.setAttribute("name", "booking["+count+"][booking_id]");
booking_id_delete.setAttribute("value", data.bookingid);
booking_id_delete.setAttribute("class", "js-added");
document.getElementById("delete").appendChild(booking_id_delete);
var bookable_id_edit = document.createElement("input");
bookable_id_edit.setAttribute("type", "hidden");
bookable_id_edit.setAttribute("name", "booking["+count+"][bookable]");
bookable_id_edit.setAttribute("value", data.bookable);
bookable_id_edit.setAttribute("class", "js-added");
document.getElementById("edit").appendChild(bookable_id_edit);
var booking_id_edit = document.createElement("input");
booking_id_edit.setAttribute("type", "hidden");
booking_id_edit.setAttribute("name", "booking["+count+"][booking_id]");
booking_id_edit.setAttribute("value", data.bookingid);
booking_id_edit.setAttribute("class", "js-added");
document.getElementById("edit").appendChild(booking_id_edit);
count = count + 1;
});
});
},
unselected: (function(){
$('div').removeClass('ui-selected');
$(".js-added").remove();
})
});
如果需要页面中的任何其他代码,请告诉我。
只是为了略过它,如果我拖动 Mon-P1 / Mon-P2 / Mon-P3 / Mon-P4 并单击 BOOK,它显示它们是正确的。如果我拖过相同的 4 但然后单选 Tue-P1 (应该取消选择所有其余部分并选择它),它会给我:
周二-P1 / 周一-P2 / 周一-P3 / 周一-P4
就好像它只取消了第一个元素,而不是其余的。是否需要类似$(".ui-selected").each()
函数的东西来遍历所有条目?