0

好的,这可能有点长,所以请坚持下去!

我在 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()函数的东西来遍历所有条目?

4

1 回答 1

0

奇怪的是,这个问题的答案是 IE8/9 在 Intranet 站点上强制执行兼容性视图。关闭此功能后,多选工作正常。我最终不得不添加内容“IE = 9”的元标题以使其工作,edge 和 IE = 8 没有做任何事情。
不确定这是否会影响其他 jquery 的东西,但是如果你有问题,兼容性视图是一个不错的选择

于 2012-06-22T16:35:18.017 回答