Bug Tracker

Ticket #2477: safari_contains_2477.diff

File safari_contains_2477.diff, 3.1 KB (added by ebartels, 14 years ago)

Reimpliment contains functionality to work with safari2

  • ui.sortable.js

    diff --git a/ui.sortable.js b/ui.sortable.js
    index c93fcb7..91c48a8 100644
    a b  
    11(function($) {
    22
    3         if (window.Node && Node.prototype && !Node.prototype.contains) {
    4                 Node.prototype.contains = function (arg) {
    5                         return !!(this.compareDocumentPosition(arg) & 16);
    6                 };
    7         }
     3        function contains(a, b) {
     4                var safari2 = $.browser.safari && $.browser.version < 522;
     5                if (a.contains && !safari2) {
     6                        return a.contains(b);
     7                }
     8                if (a.compareDocumentPosition)
     9                        return !!(a.compareDocumentPosition(b) & 16);
     10                while (b = b.parentNode)
     11                          if (b == a) return true;
     12                return false;
     13        };
    814
    915        $.fn.extend({
    1016                sortable: function(options) {
     
    331337
    332338                        this.propagate("stop", e); //Call plugins and trigger callbacks
    333339                        if(this.positionDOM != this.currentItem.prev()[0]) this.propagate("update", e);
    334                         if(!this.element[0].contains(this.currentItem[0])) { //Node was moved out of the current element
     340                        if(!contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
    335341                                this.propagate("remove", e);
    336342                                for (var i = this.containers.length - 1; i >= 0; i--){
    337                                         if(this.containers[i].element[0].contains(this.currentItem[0])) {
     343                                        if(contains(this.containers[i].element[0], this.currentItem[0])) {
    338344                                                this.containers[i].propagate("update", e, this);
    339345                                                this.containers[i].propagate("receive", e, this);
    340346                                        }
     
    376382                                                this.intersectsWith(this.items[i]) //items must intersect
    377383                                        &&      this.items[i].item[0] != this.currentItem[0] //cannot intersect with itself
    378384                                        &&      this.items[i].item[this.direction == 'down' ? 'prev' : 'next']()[0] != this.currentItem[0] //no useless actions that have been done before
    379                                         &&      !this.currentItem[0].contains(this.items[i].item[0]) //no action if the item moved is the parent of the item checked
    380                                         && (this.options.type == 'semi-dynamic' ? !this.element[0].contains(this.items[i].item[0]) : true)
     385                                        &&      !contains(this.currentItem[0], this.items[i].item[0]) //no action if the item moved is the parent of the item checked
     386                                        && (this.options.type == 'semi-dynamic' ? !contains(this.element[0], this.items[i].item[0]) : true)
    381387                                ) {
    382388                                       
    383389                                        this.rearrange(e, this.items[i]);
     
    393399                                        if(!this.containers[i].containerCache.over) {
    394400                                               
    395401
    396                                                 if(!this.containers[i].element[0].contains(this.currentItem[0])) {
     402                                                if(!contains(this.containers[i].element[0], this.currentItem[0])) {
    397403                                                       
    398404                                                        //When entering a new container, we will find the item with the least distance and append our item near it
    399405                                                        var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[i].floating ? 'left' : 'top'];
    400406                                                        for (var j = this.items.length - 1; j >= 0; j--) {
    401                                                                 if(!this.containers[i].element[0].contains(this.items[j].item[0])) continue;
     407                                                                if(!contains(this.containers[i].element[0], this.items[j].item[0])) continue;
    402408                                                                var cur = this.items[j][this.containers[i].floating ? 'left' : 'top'];
    403409                                                                if(Math.abs(cur - base) < dist) {
    404410                                                                        dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];