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

时间:2012-03-29 20:18:43

标签: jquery internet-explorer draggable collision

有人知道 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上的魅力一样运行

2 个答案:

答案 0 :(得分:3)

MSIE< 9不支持数组上的map()函数。 由于这是一个jQuery扩展,我认为最简单的解决方法是将扩展名中的array.map()替换为jQuery.map()$.map(),如下所示:

替换

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

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

你很高兴。

答案 1 :(得分:1)

最后我发现了一个解决方法,IE8缺少一些Array对象的函数,函数map(),是jquery碰撞使用的函数,所以我做了我把map函数添加到我的Array对象中,我toke此代码来自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 lib,这有帮助,这不是最好的方法,但这是一个很好的解决方法。