Knockoutjs与jQuery UI拖动&在IE8中丢弃失败

时间:2012-06-13 17:51:24

标签: jquery-ui knockout.js jquery-ui-draggable jquery-ui-droppable knockout-2.0

我正在使用joutery drag& amp;它可以在Chrome,Firefox,IE9中运行良好但不适用于IE8。我无法发布实际的代码,但我创建了一个jsfiddle示例,可以重现错误。请看一下http://jsfiddle.net/wired1/P9hns/20/ 它在最新的Firefox,Chrome和IE9中运行良好。但是在IE8中尝试拖动时出现以下错误:

  

IE8错误#1

     

SCRIPT5007:无法获取属性“options”的值:object为null或undefined   jquery-ui.1.8.18.js,第1412行第13个字符

以下是jquery ui中引用​​的代码:

$.ui.plugin.add("draggable", "cursor", {
start: function(event, ui) {
    var t = $('body'), o = $(this).data('draggable').options;
    if (t.css("cursor")) o._cursor = t.css("cursor");
    t.css("cursor", o.cursor);
},
stop: function(event, ui) {

        var o = $(this).data('draggable').options;
        if (o._cursor) $('body').css("cursor", o._cursor);

}
});

这是停止函数中变量o的声明: var o = $(this).data('draggable')。options;

如果我在jquery ui中注释掉这两行,我会收到以下错误:

  

IE8错误#2

     

SCRIPT5007:无法获取属性“options”的值:object为null或undefined   jquery-ui.1.8.18.js,第1439行,第38字符

指出:

$.ui.plugin.add("draggable", "scroll", {
start: function(event, ui) {
    var i = $(this).data("draggable");
    if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
},
drag: function(event, ui) {

    var i = $(this).data("draggable"), o = i.options, scrolled = false;
........................

这是上述代码段的最后一行 o = i.options

如果我将{scroll:false}设置为jqueryui draggable的选项,则错误消失,但它仍然无效。

似乎当我开始拖动所有事件时,即使没有释放鼠标单击也会依次触发(当在jsfiddle中运行代码测试时,请查看控制台以查看日志)。

这是一个jquery ui问题还是我做错了什么?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

问题是您在'start'回调中从observableArray中移除了学生,这反过来导致KO删除/分离关联的DOM元素。但是draggable的代码依赖于被拖动的元素仍然可用(即使你指定了一个帮助器)。

我猜测IE< 9以不同的方式处理分离的元素,导致错误浮出水面。只有在明确不再需要关联的可拖动元素时(即拖动停止时),才能通过仅从observableArray移除学生来解决此问题。

这是更新的小提琴:http://jsfiddle.net/P9hns/32/