2010-06-23 10 views
10

मेरे पास सभी HTML5 और जावास्क्रिप्ट में एक स्केचिंग ऐप किया गया है, और मैं सोच रहा था कि मैं एक अंडो बटन कैसे बनाऊंगा, ताकि आप आखिरी चीज को पूर्ववत कर सकें। कोई उपाय?एचटीएमएल 5 कैनवास में पूर्व-कार्यक्षमता कैसे जोड़ें?

+1

[कमांड पैटर्न] (http://en.wikipedia.org/wiki/Command_pattern) चेकआउट करें – Anurag

+1

टैग में जावा और उद्देश्य-सी क्यों है? –

उत्तर

13

आपको डेटास्ट्रक्चर में सभी संशोधनों को स्टोर करना होगा। यदि आप पूर्व को पूर्ववत करना चाहते हैं तो आप नवीनतम संशोधन को हटा सकते हैं। फिर आप अपने डेटास्ट्रक्चर से फिर से सभी ड्राइंग ऑपरेशंस को दोबारा दोहराएं।

+0

कृपया यह देखने के उदाहरण के लिए http://whiffdoc.appspot.com/tests/schema/diagram देखें - इस मामले में एक अदृश्य DIV तत्व में कैनवास जानकारी का प्रतिनिधित्व करने वाले JSON डेटा संरचना को संग्रहीत करके। (पृष्ठ पर स्रोत पर लिंक का पालन करें) –

+1

@AaronWatters, यह लिंक मुझे 404 पर निर्देशित करता है। क्या आपके पास अपडेट किया गया लिंक है? – link2pk

3

http://arthurclemens.github.io/Javascript-Undo-Manager/ पर मेरे पास कैनवास तत्व के साथ पूर्ववत करने का एक उदाहरण है। जब आप एक संशोधन करते हैं, तो आप पूर्ववत प्रबंधक को पूर्ववत और फिर से विधियों को खिलाते हैं। पूर्ववत स्टैक में स्थिति का ट्रैकिंग स्वचालित रूप से किया जाता है। स्रोत कोड गीथूब में है।

+0

आपका उदाहरण अच्छा दिखता है! –

+0

साझा करने के लिए धन्यवाद क्रोम में अच्छा लग रहा है, लेकिन फ़ायरफ़ॉक्स – waspinator

+0

में काम नहीं करता है मैंने डेमो में कुछ छोटी ड्राइंग बग तय की हैं। –

1

अन्य विकल्प, यदि आपको ऑब्जेक्ट्स में हेरफेर करने की आवश्यकता है, तो कैनवास एपीआई को एक लाइब्रेरी का उपयोग करके अपने कैनवास को एसवीजी में परिवर्तित करना है जो एक पुनर्लेख को रोकने से रोकता है। SVGKit

एक बार जब आप एसवीजी है, यह बहुत पूरे कैनवास पुनः बनाने की आवश्यकता के बिना वस्तुओं और भी बहुत कुछ दूर करने के लिए आसान है:

कम से कम एक ऐसे पुस्तकालय इस बार (नवंबर 2011) पर मौजूद है।

+2

या वह कैनवास एस्ट्रस्ट्रक्शन लाइब्रेरी का उपयोग कर सकते हैं, जैसे [fabric.js] (http://kangax.github.com/fabric.js/) प्रोग्राम कैनवास पर ऑब्जेक्ट्स के साथ काम करने में सक्षम होने के लिए। – kangax

+0

उत्कृष्ट @ कंगैक्स। मैं उत्सुक हूं, आपको लगता है कि fabric.js प्रदर्शन के संदर्भ में एसवीजीकिट से तुलना करेगा जब सैकड़ों नोड्स के साथ कैनवास में ऑब्जेक्ट्स संपादित करने की बात आती है? –

+0

मुझे यकीन नहीं है कि यह एसवीजीकिट से कैसे तुलना करता है, लेकिन जब बड़ी संख्या में ऑब्जेक्ट्स की बात आती है तो कैनवास एसवीजी की तुलना में अधिक प्रदर्शन करने वाला होता है। राफेल (एसवीजी-आधारित) और कपड़े (कैनवास-आधारित) की तुलना में कुछ बेंचमार्क पर नज़र डालें - http://fabricjs.com/benchmarks/ – kangax

0

यहां एक समाधान है जो मेरे लिए काम करता है। मैंने इसे फ़ायरफ़ॉक्स और क्रोम के नवीनतम संस्करणों में आजमाया है और यह उन दो ब्राउज़रों में वास्तव में अच्छा काम करता है।

var isFirefox = typeof InstallTrigger !== 'undefined'; 
var ctx = document.getElementById('myCanvas').getContext("2d"); 
var CanvasLogBook = function() { 
    this.index = 0; 
    this.logs = []; 
    this.logDrawing(); 
}; 
CanvasLogBook.prototype.sliceAndPush = function(imageObject) { 
    var array; 
    if (this.index == this.logs.length-1) { 
     this.logs.push(imageObject); 
     array = this.logs; 
    } else { 
     var tempArray = this.logs.slice(0, this.index+1); 
     tempArray.push(imageObject); 
     array = tempArray; 
    } 
    if (array.length > 1) { 
     this.index++; 
    } 
    return array; 
}; 
CanvasLogBook.prototype.logDrawing = function() { 
    if (isFirefox) { 
     var image = new Image(); 
     image.src = document.getElementById('myCanvas').toDataURL(); 
     this.logs = this.sliceAndPush(image); 
    } else { 
     var imageData = document.getElementById('myCanvas').toDataURL(); 
     this.logs = this.sliceAndPush(imageData); 
    } 
}; 
CanvasLogBook.prototype.undo = function() { 
    ctx.clearRect(0, 0, $('#myCanvas').width(), $('#myCanvas').height()); 
    if (this.index > 0) { 
     this.index--; 
     this.showLogAtIndex(this.index); 
    } 
}; 
CanvasLogBook.prototype.redo = function() { 
    if (this.index < this.logs.length-1) { 
     ctx.clearRect(0, 0, $('#myCanvas').width(), $('#myCanvas').height()); 
     this.index++; 
     this.showLogAtIndex(this.index); 
    } 
}; 
CanvasLogBook.prototype.showLogAtIndex = function(index) { 
    ctx.clearRect(0, 0, $('#myCanvas').width(), $('#myCanvas').height()); 
    if (isFirefox) { 
     var image = this.logs[index]; 
     ctx.drawImage(image, 0, 0); 
    } else { 
     var image = new Image(); 
     image.src = this.logs[index]; 
     ctx.drawImage(image, 0, 0); 
    } 
}; 
var canvasLogBook = new CanvasLogBook(); 

तो हर बार जब आप किसी भी बात तुम वहाँ के बाद रन समारोह canvasLogBook.logDrawing() कैनवास के स्नैपशॉट को संग्रहीत करने के लिए होगा आकर्षित और फिर आप canvasLogBook.undo() कॉल कर सकते हैं पूर्ववत और canvasLogBook.redo करने के लिए() फिर से करना।

+0

यदि आप jQuery पर निर्भर नहीं हैं और यदि आप 'isFirefox' बूलियन से छुटकारा पा रहे हैं तो यह एक अच्छा जवाब होगा :) – A1rPun

संबंधित मुद्दे