jQuery UI перетаскиваемое столкновение - IE не работает - PullRequest
3 голосов
/ 30 марта 2012

Кто-нибудь знает, если jquery-ui-draggable-collision поддерживает IE ??

Я пробую один из примеров, который идет с ним ( jquery-ui-draggable-collision-warning-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); } ) );
}

Кажется, функция map () не поддерживается в IE8.

Я также пытался запустить ее с последней версией jquery-1.7.2 и jquery-ui-1.8.18 и я все еще получаю ту же ошибку.

конечно, примеры работают как Carm, FireFox и Safari

Ответы [ 2 ]

4 голосов
/ 22 апреля 2012

MSIE <9 не поддерживает функцию map () для массивов. Поскольку это расширение jQuery, я думаю, что самый простой способ решить его - заменить вызовы <code>array.map() в расширении на jQuery.map() или $.map(), например:

Заменить

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

с

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

и ты в порядке.

1 голос
/ 03 апреля 2012

Наконец-то я нашел обходной путь, в IE8 отсутствует какая-то функция для объекта Array, функция map (), используемая при столкновении jquery, поэтому я добавил функцию map в свой объект Array этот код из библиотеки JavaScript ddr-ECMA5:

        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(){...}]

Надеюсь, это поможет, если кто-то еще захочет поддерживать библиотеку jquery - collision в IE8, это не лучший подход, но это хорошая работа.

...