Jquery花式产品设计器

wtzytmuj  于 2022-11-03  发布在  jQuery
关注(0)|答案(2)|浏览(168)

我最近在使用jquery Fancy产品设计器时遇到了以下问题。我想使用产品价格进行计算,但我找不到方法。
代码为:
//价格变动时的事件处理程序

  1. $('#clothing-designer').bind('priceChange', function(evt, price, currentPrice) {
  2. $('#thsirt-price').text(currentPrice);
  3. });

HTML为:

  1. <div class="col-md-3">
  2. PRICE <span class="price badge badge-inverse"><span id="thsirt-price"></span></span>
  3. </div>

如何以数字形式获取价格?
额外的代码是

  1. FancyProductDesigner.prototype.removeElement = function(element) {
  2. if(typeof element === 'string') {
  3. element = thisClass.getElementByTitle(element);
  4. }
  5. if(element.params.price != 0 && !element.params.uploadZone) {
  6. currentPrice -= element.params.price;
  7. $elem.trigger('priceChange', [element.params.price, currentPrice]);
  8. }
  9. $contextDialog.find('.fpd-content-layers .fpd-list').children('[id="'+element.id+'"]').remove();
  10. stage.remove(element);
  11. if(element.params.hasUploadZone) {
  12. //check if upload zone contains objects
  13. var objects = stage.getObjects(),
  14. uploadZoneEmpty = true;
  15. for(var i=0; i < objects.length; ++i) {
  16. var object = objects[i];
  17. if(object.visible && object.params.replace == element.params.replace) {
  18. uploadZoneEmpty = false;
  19. break;
  20. }
  21. }
  22. var uploadZoneObject = _getUploadZone(element.params.replace);
  23. uploadZoneObject.opacity = uploadZoneEmpty ? 1 : 0;
  24. }
  25. /**
  26. * Gets fired as soon as an element has been removed.
  27. *
  28. * @event FancyProductDesigner#elementRemove
  29. * @param {Event} event
  30. * @param {fabric.Object} element - The fabric object that has been removed.
  31. */
  32. $elem.trigger('elementRemove', [element]);
  33. thisClass.deselectElement();
  34. };
  35. /**
  36. * Returns an fabric object by title.
  37. * @param {string} title The title of an element.
  38. */
  39. FancyProductDesigner.prototype.getElementByTitle = function(title) {
  40. var objects = stage.getObjects();
  41. for(var i = 0; i < objects.length; ++i) {
  42. if(objects[i].title == title) {
  43. return objects[i];
  44. break;
  45. }
  46. }
  47. };
  48. /**
  49. * Sets the zoom of the stage. 1 is equal to no zoom.
  50. * @param {number} value The zoom value.
  51. */
  52. FancyProductDesigner.prototype.setZoom = function(value) {
  53. thisClass.deselectElement();
  54. var point = new fabric.Point(stage.getWidth() * 0.5, stage.getHeight() * 0.5);
  55. stage.zoomToPoint(point, value);
  56. if(value == 1) {
  57. thisClass.resetZoom();
  58. }
  59. };
  60. /**
  61. * Resets the zoom.
  62. */
  63. FancyProductDesigner.prototype.resetZoom = function() {
  64. thisClass.deselectElement();
  65. stage.zoomToPoint(new fabric.Point(0, 0), 1);
  66. stage.absolutePan(new fabric.Point(0, 0));
  67. };
  68. /**
  69. * Sets the dimensions of the stage(canvas). todo: check
  70. * @param {number} width The width for the stage.
  71. * @param {number} height The height for the stage.
  72. */
  73. FancyProductDesigner.prototype.setStageDimensions = function(width, height) {
  74. options.width = width;
  75. options.stageHeight = height;
  76. $elem.width(width);
  77. $productStage.height(height * responsiveScale);
  78. stage.setDimensions({width: $elem.width(), height: options.stageHeight * responsiveScale})
  79. .calcOffset().renderAll();
  80. _refreshDesignerSize();
  81. };
  82. /**
  83. * Shows a message in the snackbar.
  84. * @param {string} text The text for the message.
  85. */
  86. FancyProductDesigner.prototype.showMessage = function(text) {
  87. var $snackbar;
  88. if($body.children('.fpd-snackbar-internal').size() > 0) {
  89. $snackbar = $body.children('.fpd-snackbar');
  90. }
  91. else {
  92. $snackbar = $body.append('<div class="fpd-snackbar-internal fpd-snackbar fpd-shadow-1"><p></p></div>').children('.fpd-snackbar-internal');
  93. }
  94. $snackbar.removeClass('fpd-show-up').children('p').html(text).parent().addClass('fpd-show-up');
  95. setTimeout(function() {
  96. $snackbar.removeClass('fpd-show-up');
  97. }, 3000);
  98. };
  99. /**
  100. * Calls a specified content in the context dialog.
  101. * @param {string} target An unique target name. Possible values: 'layers', 'adds', 'products', 'saved-products', 'edit'.
  102. * @param {string} title The title for the context dialog, which appears in the head of the context dialog.
  103. * @param {string} [subTarget] An unique sub-target name. The 'adds' dialog has following sub-dialogs: 'facebook', 'instagram', 'designs'.
  104. * @param {boolean} [deselectElement] Deselects the current selected element.
  105. */
  106. FancyProductDesigner.prototype.callDialogContent = function(target, title, subTarget, deselectElement) {
  107. subTarget = typeof subTarget !== 'undefined' ? subTarget : null;
  108. deselectElement = typeof deselectElement !== 'undefined' ? deselectElement : true;
  109. if(deselectElement) {
  110. thisClass.deselectElement();
  111. }
  112. //hide sub contents
  113. $contextDialog.find('.fpd-content-sub.fpd-show').removeClass('fpd-show');
  114. //hide content-back button
  115. $contextDialog.find('.fpd-content-back').removeClass('fpd-show');
  116. //get target div
  117. var $target = $contextDialog.find('.fpd-dialog-content .fpd-content-'+target);
  118. if($target.is(':hidden')) {
  119. $target.siblings('div').stop().hide()
  120. //show requested content div
  121. $target.stop().fadeIn(300);
  122. }
  123. $contextDialog.show();
  124. //lazy load for products
  125. if(target == 'products' && options.lazyLoad) {
  126. $currentLazyLoadContainer = $target;
  127. _refreshLazyLoad(false);
  128. }
  129. if(subTarget) {
  130. var $subTarget = $contextDialog.find('.fpd-content-sub[data-subContext="'+subTarget+'"]').addClass('fpd-show');
  131. $contextDialog.find('.fpd-content-back').data('parentTitle', $contextDialog.find('.fpd-dialog-title').text())
  132. .addClass('fpd-show');
  133. //lazy load for designs
  134. $currentLazyLoadContainer = null;
  135. if(subTarget == 'designs' && options.lazyLoad) {
  136. $currentLazyLoadContainer = $subTarget;
  137. _refreshLazyLoad(false);
  138. }
  139. }
  140. _setDialogTitle(title);
  141. };
  142. /**
  143. * Defines the current upload zone by using the title of a visible upload zone.
  144. * @param {string} title The title of a visible upload zone.
  145. */
  146. FancyProductDesigner.prototype.setUploadZone = function(title) {
  147. currentUploadZone = title;
  148. thisClass.closeDialog();
  149. };
  150. /**
  151. * Closes the context dialog box
  152. */
  153. FancyProductDesigner.prototype.closeDialog = function() {
  154. $contextDialog.hide();
  155. $colorPicker.find('input').spectrum('hide');
  156. $currentLazyLoadContainer = null;
  157. currentUploadZone = null;
  158. };
  159. /**
  160. * Defines a clipping rectangle for an element.
  161. * @param {fabric.Object | string} element A fabric object or the title of an element.
  162. * @param {object} clippingRect Ob object containg x, y, width and height values to define the rectangle.
  163. * @example
  164. * yourDesigner.setClippingRect("Element Title", {x: 100, y: 200, width: 300, height: 400});
  165. * @version 3.0.2
  166. */
  167. FancyProductDesigner.prototype.setClippingRect = function(element, clippingRect) {
  168. //if element is string, get by title
  169. if(typeof element == 'string') {
  170. element = thisClass.getElementByTitle(element);
  171. }
  172. element.clippingRect = clippingRect;
  173. stage.renderAll();
  174. };
  175. /**
  176. * Sets the parameters for a specified element.
  177. * @param {fabric.Object | string} element A fabric object or the title of an element.
  178. * @param {object} parameters An object with the parameters that should be applied to the element.
  179. */
  180. FancyProductDesigner.prototype.setElementParameters = function(element, parameters) {
  181. if(element === undefined || parameters === undefined) {
  182. return false;
  183. }
  184. //if element is string, get by title
  185. if(typeof element == 'string') {
  186. element = thisClass.getElementByTitle(element);
  187. }
  188. //store undos
  189. if(productCreated) {
  190. var oldParameters = {};
  191. for (var key in parameters) {
  192. oldParameters[key] = element.params[key];
  193. }
  194. undos.push({element: element, parameters: oldParameters});
  195. }
  196. //adds the element into a upload zone
  197. if(currentUploadZone && currentUploadZone != '') {
  198. parameters.z = -1;
  199. var uploadZoneObj = thisClass.getElementByTitle(currentUploadZone),
  200. bbRect = uploadZoneObj.getBoundingRect();
  201. $.extend(parameters, {
  202. boundingBox: currentUploadZone,
  203. scale: thisClass.getScalingByDimesions(element.getWidth(), element.getHeight(), (bbRect.width / responsiveScale)-1, (bbRect.height / responsiveScale)-1),
  204. autoCenter: true,
  205. removable: true,
  206. zChangeable: false,
  207. rotatable: uploadZoneObj.params.rotatable,
  208. draggable: uploadZoneObj.params.draggable,
  209. resizable: uploadZoneObj.params.resizable,
  210. price: uploadZoneObj.params.price,
  211. replace: currentUploadZone,
  212. hasUploadZone: true
  213. }
  214. );
  215. uploadZoneObj.opacity = 0;
  216. }
  217. //check if a upload zone contains an object
  218. var objects = stage.getObjects();
  219. for(var i=0; i < objects.length; ++i) {
  220. var object = objects[i];
  221. if(object.params && object.params.uploadZone && object.title == parameters.replace) {
  222. object.opacity = 0;
  223. }
  224. }
  225. //if topped, z-index can not be changed
  226. if(parameters.topped) {
  227. parameters.zChangeable = false;
  228. }
  229. //new element added
  230. if( typeof parameters.colors === 'object' ||
  231. parameters.removable ||
  232. parameters.draggable ||
  233. parameters.resizable ||
  234. parameters.rotatable ||
  235. parameters.zChangeable ||
  236. parameters.editable ||
  237. parameters.patternable
  238. || parameters.uploadZone) {
  239. element.isEditable = element.evented = true;
  240. element.set('selectable', true);
  241. if(element.viewIndex == currentViewIndex && $contextDialog.find('.fpd-content-layers .fpd-list-row[id="'+element.id+'"]').size() == 0) {
  242. _appendLayerItem(element.id, element.title, parameters.zChangeable, parameters.removable, parameters.uploadZone, !element.evented);
  243. }
  244. }
  245. if(parameters.opacity !== undefined) {
  246. element.set('opacity', parameters.opacity);
  247. //needs to be called for curved text
  248. if(element.params.curved) {
  249. element.setFill(element.fill);
  250. }
  251. }
  252. //upload zones have no controls
  253. if(!parameters.uploadZone || options.editorMode) {
  254. if(parameters.draggable) {
  255. element.lockMovementX = element.lockMovementY = false;
  256. }
  257. if(parameters.rotatable) {
  258. element.lockRotation = false;
  259. }
  260. if(parameters.resizable) {
  261. element.lockScalingX = element.lockScalingY = false;
  262. }
  263. if((parameters.resizable || parameters.rotatable || parameters.removable)) {
  264. element.hasControls = true;
  265. }
  266. }
  267. if(parameters.originX) {
  268. element.setOriginX(parameters.originX);
  269. }
  270. if(parameters.originY) {
  271. element.setOriginY(parameters.originY);
  272. }
  273. if(parameters.x !== undefined) {
  274. element.set('left', parameters.x);
  275. }
  276. if(parameters.y !== undefined) {
  277. element.set('top', parameters.y);
  278. }
  279. if(parameters.scale !== undefined) {
  280. element.set('scaleX', parameters.scale);
  281. element.set('scaleY', parameters.scale);
  282. }
  283. if(parameters.degree !== undefined) {
  284. element.set('angle', parameters.degree);
  285. }
  286. //replace element
  287. if(parameters.replace && parameters.replace != '' && element.viewIndex === currentViewIndex) {
  288. var objects = stage.getObjects();
  289. for(var i = 0; i < objects.length; ++i) {
  290. var object = objects[i];
  291. if(object.params != undefined && object.clipFor == undefined && object.params.replace == parameters.replace && object.visible && element !== object) {
  292. parameters.z = _getZIndex(object);
  293. parameters.x = object.params.x;
  294. parameters.y = object.params.y;
  295. parameters.autoCenter = false;
  296. thisClass.removeElement(object);
  297. break;
  298. }
  299. }
  300. }
  301. //center element
  302. if(parameters.autoCenter) {
  303. _doCentering(element);
  304. }
  305. if(parameters.flipX !== undefined) {
  306. element.set('flipX', parameters.flipX);
  307. }
  308. if(parameters.flipY !== undefined) {
  309. element.set('flipY', parameters.flipY);
  310. }
  311. if(parameters.price && !parameters.uploadZone) {
  312. currentPrice += parameters.price;
  313. /**
  314. * Gets fired as soon as the price has changed.
  315. *
  316. * @event FancyProductDesigner#priceChange
  317. * @param {Event} event
  318. * @param {number} elementPrice - The price of the element.
  319. * @param {number} totalPrice - The total price.
  320. */
  321. $elem.trigger('priceChange', [parameters.price, currentPrice]);
  322. }
  323. //change element color
  324. if(parameters.currentColor !== undefined && parameters.pattern == null) {
  325. _changeColor(element, parameters.currentColor);
  326. }
  327. //set pattern
  328. if(parameters.pattern !== undefined) {
  329. _setPattern(element, parameters.pattern);
  330. }
  331. //set filter
  332. if(parameters.filter) {
  333. element.filters = [];
  334. var fabricFilter = _getFabircFilter(parameters.filter);
  335. if(fabricFilter != null) {
  336. element.filters.push(fabricFilter);
  337. }
  338. element.applyFilters(function() {
  339. stage.renderAll();
  340. $body.mouseup();
  341. });
  342. }
ibrsph3r

ibrsph3r1#

这个数字是由jquery自动计算的。

  1. <script type="text/javascript">
  2. jQuery(document).ready(function(){
  3. var yourDesigner = $('#clothing-designer').fancyProductDesigner({
  4. editorMode: false,
  5. fonts: ['Arial', 'Fearless', 'Helvetica', 'Times New Roman', 'Verdana', 'Geneva', 'Gorditas'],
  6. customTextParameters: {
  7. colors: "#000000",
  8. removable: true,
  9. resizable: true,
  10. draggable: true,
  11. rotatable: true,
  12. autoCenter: true,
  13. price: 5,
  14. boundingBox: "ΧΡΩΜΑ"
  15. },
  16. customImageParameters: {
  17. draggable: true,
  18. removable: true,
  19. colors: '#000',
  20. autoCenter: true,
  21. resizable: true,
  22. price: 5,
  23. boundingBox: "ΧΡΩΜΑ"
  24. }
  25. }).data('fancy-product-designer');
  26. //print button
  27. $('#print-button').click(function(){
  28. yourDesigner.print();
  29. return false;
  30. });
  31. //create an image
  32. $('#image-button').click(function(){
  33. var image = yourDesigner.createImage();
  34. return false;
  35. });
  36. //create a pdf with jsPDF
  37. $('#pdf-button').click(function(){
  38. var image = new Image();
  39. image.src = yourDesigner.getProductDataURL('jpeg', '#ffffff');
  40. image.onload = function() {
  41. var doc = new jsPDF();
  42. doc.addImage(this.src, 'JPEG', 0, 0, this.width * 0.2, this.height * 0.2);
  43. doc.save('Product.pdf');
  44. }
  45. return false;
  46. });
  47. //checkout button with getProduct()
  48. $('#checkout-button').click(function(){
  49. var product = yourDesigner.getProduct();
  50. console.log(product);
  51. return false;
  52. });
  53. //event handler when the price is changing
  54. $('#clothing-designer')
  55. .bind('priceChange', function(evt, price, currentPrice) {
  56. $('#thsirt-price').text(currentPrice);
  57. });
  58. //recreate button
  59. $('#recreation-button').click(function(){
  60. var fabricJSON = JSON.stringify(yourDesigner.getFabricJSON());
  61. $('#recreation-form input:first').val(fabricJSON).parent().submit();
  62. return false;
  63. });
  64. //click handler for input upload
  65. $('#upload-button').click(function(){
  66. $('#design-upload').click();
  67. return false;
  68. });
  69. //save image on webserver
  70. $('#save-image-php').click(function() {
  71. $.post( "php/save_image.php", { base64_image: yourDesigner.getProductDataURL()} );
  72. });
  73. //send image via mail
  74. $('#send-image-mail-php').click(function() {
  75. $.post( "php/send_image_via_mail.php", { base64_image: yourDesigner.getProductDataURL()} );
  76. });
  77. //upload image
  78. document.getElementById('design-upload').onchange = function (e) {
  79. if(window.FileReader) {
  80. var reader = new FileReader();
  81. reader.readAsDataURL(e.target.files[0]);
  82. reader.onload = function (e) {
  83. var image = new Image;
  84. image.src = e.target.result;
  85. image.onload = function() {
  86. var maxH = 400,
  87. maxW = 300,
  88. imageH = this.height,
  89. imageW = this.width,
  90. scaling = 1;
  91. if(imageW > imageH) {
  92. if(imageW > maxW) { scaling = maxW / imageW; }
  93. }
  94. else {
  95. if(imageH > maxH) { scaling = maxH / imageH; }
  96. }
  97. yourDesigner.addElement('image', e.target.result, 'my custom design', {colors: $('#colorizable').is(':checked') ? '#000000' : false, zChangeable: true, removable: true, draggable: true, resizable: true, rotatable: true, autoCenter: true, boundingBox: "ΧΡΩΜΑ", scale: scaling});
  98. };
  99. };
  100. }
  101. else {
  102. alert('FileReader API is not supported in your browser, please use Firefox, Safari, Chrome or IE10!')
  103. }
  104. };
  105. });
  106. </script>
展开查看全部
46qrfjad

46qrfjad2#

如果你的html像

  1. <div class="col-md-3">
  2. PRICE <span class="price badge badge-inverse"><span id="thsirt-price">1234</span></span>
  3. </div>

你就可以这样做

  1. var currentPrice = parseInt($('#thsirt-price').text().trim());

这一定有帮助。如果你把号码放在其他地方,请告诉我

相关问题