2014-10-07 51 views
2

我正在使用jquery-ui編寫一個繪圖編輯器,您可以在其中添加/刪除形狀並移動和調整它們的大小。這一切工作正常。但是如果我添加太多形狀,那麼調整一個形狀的大小會變得非常慢。我做了一個jsfiddle,在那裏你可以看到它,但在我的編輯器中,它的速度慢了10倍,而且形狀更少。我想是因爲我有其他的事件處理程序。如果添加多個div,jquery可調整大小非常緩慢

這裏是調整大小是快速小提琴: http://jsfiddle.net/oh6e9k6k/

這裏慢一個有許多形狀(需要一些時間來加載): http://jsfiddle.net/oh6e9k6k/1/

效果可以看到最好在Internet Explorer 。

是否有機會通過如此多的形狀提高性能? 正如我在編輯中所說的那樣,即使更少的形狀也更慢。

我想避免做類似的事情,如僅當用戶單擊該形狀時才附加處理程序,並在調整大小/拖動完成時將其刪除,但如果沒有其他解決方案,則可能需要執行此操作。

這裏是形狀如何得到他們的功能:

$(".shape").resizable({ 
    start: function (event, ui) { 
     $(this).addClass("highliteShape"); 
    }, 
    stop: function (event, ui) { 
     $(this).removeClass("highliteShape"); 
    } 
}).draggable({ 
    cursor: "move", 
    start: function (event, ui) { 
     $(this).addClass("highliteShape"); 
    }, 
    stop: function (event, ui) { 
     $(this).removeClass("highliteShape"); 
    } 
}); 

我從實際應用截屏,顯示我的意思:HTTP:// screencast.com/t/r3xCwWdbp

+0

然後不加這麼多div的和您的應用程序分割成幾部分(步驟) – 2014-10-07 15:20:32

+1

這取決於他想要多少形狀繪製最終用戶。我無法限制這一點。 – 2014-10-07 15:26:45

回答

1

我發現我的問題的方法。我只在形狀的鼠標輸入事件上爲我的形狀初始化事件處理函數(調整大小/移動/單擊/雙擊)。這也大大增加了加載時間。 立即調整形狀的大小。

http://jsfiddle.net/oh6e9k6k/3/

var maxSize = 2000; 

function InitShapeEventHandler($shape){ 
    if(!$shape.hasClass("ui-resizable")){ 
     $shape.resizable({ 
      start: function (event, ui) { 
       $(this).addClass("highliteShape"); 
      }, 
      stop: function (event, ui) { 
       $(this).removeClass("highliteShape"); 
      } 
     }).draggable({ 
      cursor: "move", 
      start: function (event, ui) { 
       $(this).addClass("highliteShape"); 
      }, 
      stop: function (event, ui) { 
       $(this).removeClass("highliteShape"); 
      } 
     }); 
    } 
} 


for(var x=0; x<maxSize; x+=35){ 
    for(var y=0; y<maxSize; y+=35){ 
     $("#ShapeContainer").append("<div class='shape' style='left:" + x + "px; top:" + y + "px;'></div>");   
    } 
} 




$(function() { 
    // add some dummy code 
    $(".shape").append("<div>x</div>"); 

    $(".shape").mouseenter(function(){ 
     InitShapeEventHandler($(this)); 
    }); 
}); 
1

我爲你演示使用異步函數來展示問題所在。你可以看到繪製這些盒子完全沒有時間,但是放大每個盒子的功能是最新的問題。無論如何,至少有了這個功能,你實際上可以看到somethig而不是等待。

演示(點擊完警報之後確定,會發現它需要的放大功能完成的時間)

http://jsfiddle.net/007k03jx/

$(document).ready(function() { 

    /// the Assync function. 

    var asyncFor = function(params) { 

     var defaults = { 
      total: 0, 
      limit: 1, 
      pause: 10, 
      context: this 
     }, 
      options = $.extend(defaults, params), 
      def = $.Deferred(), 
      step = 0, 
      done = 0; 

     this.loop = function() { 
      if (done < options.total) { 
      step = 0; 
      for (; step < options.limit; step += 1, done += 1) { 
       def.notifyWith(options.context, [done]); 
      } 
      setTimeout.apply(this, [this.loop, options.pause]); 
      } else { 
      def.resolveWith(options.context); 
      } 
     }; 

     setTimeout.apply(this, [this.loop, options.pause]); 
     return def; 
     }; 

var maxSize = 2000; 
var x=0; 

    asyncFor({ 
     total:50,  
     context: this 
    }).progress(function(step) { 

var y=0; 
    for(var y=0; y<maxSize; y+=35){ 

$("#ShapeContainer").append("<div class='shape' style='left:" + x + "px; top:" + y + "px;'><div>x</div></div>"); 



    } 

x+=35; 


    }).done(function() { 

    alert("finished") 
resize() 
    }); 

    function resize() { 
        $(".shape").resizable({ 
     start: function (event, ui) { 
      $(this).addClass("highliteShape"); 
     }, 
     stop: function (event, ui) { 
      $(this).removeClass("highliteShape"); 
     } 
    }).draggable({ 
     cursor: "move", 
     start: function (event, ui) { 
      $(this).addClass("highliteShape"); 
     }, 
     stop: function (event, ui) { 
      $(this).removeClass("highliteShape"); 
     } 
    }); 
    } 
    }); 
+0

謝謝,對於該演示,但加載的時間不是問題,因爲我在我的真實應用程序中加載也是異步的。如果您開始調整大小,延遲會更高。我會盡量更清楚地複製延遲。所以我的問題是,如果有很多形狀,那麼如果我嘗試調整一個形狀的大小,它會以1或2秒的巨大延遲開始。取決於你的機器有多快。 – 2014-10-09 14:31:41

+0

我從真實應用程序製作了一個截屏視圖,以顯示我的意思:http://screencast.com/t/r3xCwWdbp – 2014-10-09 14:55:30

+0

看起來非常緩慢。你有沒有看過畫布。 http://stackoverflow.com/questions/19100009/dragging-and-resizing-an-image-on-html5-canvas ---演示 - http://jsfiddle.net/m1erickson/LAS8L/ – Tasos 2014-10-10 23:50:45