jQuery UI可拖动元素碰撞 - IE不起作用。

3

有人知道jquery-ui-draggable-collision是否支持IE吗?

我正在尝试使用其中一个例子(jquery-ui-draggable-collision-prevention-example.html),但在IE8上出现以下错误:

文件jquery-ui-draggable-collision-1.0.1.js的第219行出现“对象不支持属性或方法”的错误。

function jqList2CenterGravity( jqList, dx, dy )
{
219:  return centerGravity( jqList.toArray().map( function(e,i,a){ return jq2Coords($(e),dx,dy); } ) );
}

看起来IE8不支持map()函数。

我也尝试了最新的jquery-1.7.2和jquery-ui-1.8.18运行,但仍然出现相同的错误。

当然,在Crome、FireFox和Safari上的示例都可以完美运行。


我在jQuery UI网站上找不到任何演示,请问您能否发送给我URL。 - Givius
抱歉,大家,我没有注意到这个问题。我会在SourceForge上修复这个模块。是的,这是一个IE<9的问题。唉,讨厌微软。 - eruciform
2个回答

4

MSIE < 9不支持对数组使用map()函数。 由于这是jQuery的扩展功能,我认为解决这个问题最简单的方法是在扩展中将对array.map()的调用替换为jQuery.map()或$.map(),如下所示:

var result = myarray.map(function() {});

替换为

var result = $.map(myarray, function() {});

然后你就可以继续了。


啊,谢谢你提醒。我得更新插件了。我在发布时从来没有在IE上测试过。我真是个不负责任的人。:-P - eruciform

1

最终我找到了一个解决方法,IE8缺少Array对象的一些函数,其中jquery collision使用的函数map()就是其中之一,所以我将map函数添加到我的Array对象中,我从ddr-ECMA5 JavaScript库中获取了这段代码:

        var __isCallable = (function(){
        var __sortCase = (function(){
                try {
                    [].sort('abc');
                    return false;
                } catch(ex) {
                    return true;
                }
            })();

        return function(obj){
            if( typeof obj === 'function' )
                return true;
            if( typeof obj !== 'object' )
                return false;
            if( obj instanceof Function || obj instanceof RegExp )
                return true;
            if( __sortCase ) {
                try {
                    [].sort(obj);
                    return true;
                } catch(ex){ /* nothing to do */ }
            }
            return false;
        };
    })();

    /// IE8 support
    var AddArrayMapFunction = function() {
        var $AP = Array.prototype;

        $AP.map || ($AP.map = function(callback) {
            if( !__isCallable(callback) )
                throw new TypeError( callback + " is not a callable object" );

            var thisArg = arguments[1],
                len = this.length,
                results = new Array(len);
            for(var i=0; i < len; ++i) {
                if( this.hasOwnProperty(String(i)) ) {
                    results[i] = callback.call(thisArg, this[i], i, this);
                }
            }

            return results;
        });
    }
// then just call, when you need to use the collision lib
AddArrayMapFunction();

这会产生副作用,它会在你的数组中添加一个额外的元素,即函数“map”,例如:

myArray = ["a","b","c"];
// after add the function map() your array will look like
["a","b","c",map:function(){...}]

希望这能帮助到其他想在IE8上支持jquery-collision库的人,虽然不是最好的方法,但是是一个不错的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接