spa.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. var pckry;
  2. document.addEventListener('DOMContentLoaded', (event) => {
  3. // 初始化函數
  4. init();
  5. });
  6. function init() {
  7. // 綁定事件
  8. document.querySelector('.buttonAddImage').addEventListener('click', showAddImageForm);
  9. document.querySelector('.buttonCancelAdd').addEventListener('click', hideAddImageForm);
  10. document.querySelector('.buttonApproveAdd').addEventListener('click', addImage);
  11. document.querySelector('.buttonClearCards').addEventListener('click', clearAllCards);
  12. document.querySelector('.buttonSeedCards').addEventListener('click', seedCards);
  13. var cardholder = document.querySelector('.cardholder');
  14. pckry = new Packery(cardholder, {
  15. // Packery 的選項
  16. itemSelector: '.card',
  17. // percentPosition: true, // 如果你想要使用百分比定位
  18. gutter: 1
  19. });
  20. makeAllCardsDraggable();
  21. // 如果有撤銷/重做按鈕的功能,這裡綁定相應的事件
  22. }
  23. function showAddImageForm() {
  24. var modal = document.getElementById('addImageModal');
  25. modal.style.display = "block";
  26. var closeButton = document.querySelector('.close');
  27. closeButton.onclick = function () {
  28. modal.style.display = "none";
  29. }
  30. // 當用戶點擊模態視窗以外的地方,關閉它
  31. window.onclick = function (event) {
  32. if (event.target == modal) {
  33. modal.style.display = "none";
  34. }
  35. }
  36. }
  37. function makeAllCardsDraggable() {
  38. // 對現有的每個卡片使用 Draggabilly
  39. var draggableElems = pckry.getItemElements();
  40. for (var i = 0, len = draggableElems.length; i < len; i++) {
  41. var draggableElem = draggableElems[i];
  42. var draggie = new Draggabilly(draggableElem);
  43. pckry.bindDraggabillyEvents(draggie);
  44. }
  45. }
  46. function hideAddImageForm() {
  47. document.querySelector('.newPictureForm').classList.add('displayNone');
  48. }
  49. function addImage(event) {
  50. event.preventDefault();
  51. const imageUrl = document.getElementById('newPicUrl').value.trim();
  52. if (imageUrl) {
  53. // 創建卡片容器
  54. const card = document.createElement('div');
  55. card.className = 'card';
  56. // 創建圖片元素
  57. const img = document.createElement('img');
  58. img.src = imageUrl;
  59. img.alt = 'Mood Image';
  60. img.className = 'mood-image';
  61. // 將圖片添加到卡片容器
  62. card.appendChild(img);
  63. // 將卡片容器添加到主體(cardholder)中
  64. const cardholder = document.querySelector('.cardholder');
  65. cardholder.appendChild(card);
  66. // 通知 Packery 新增加了一個卡片元素
  67. pckry.appended(card);
  68. // 使新加入的卡片可拖動
  69. var draggie = new Draggabilly(card);
  70. // 將 Draggabilly 事件綁定到 Packery
  71. pckry.bindDraggabillyEvents(draggie);
  72. // 清空輸入欄位
  73. document.getElementById('newPicUrl').value = '';
  74. }
  75. }
  76. function clearAllCards() {
  77. // 移除所有 .card 元素
  78. var cards = document.querySelectorAll('.card');
  79. cards.forEach(function (card) {
  80. pckry.remove(card); // 通知 Packery 移除元素
  81. card.remove(); // 從 DOM 中移除元素
  82. });
  83. // 通知 Packery 重新佈局剩下的元素
  84. pckry.layout();
  85. }
  86. function seedCards() {
  87. getRandomMemeGif(function(gifUrl) {
  88. // 這裡我們直接調用 addImage 函數,將 Giphy 圖片 URL 作為參數
  89. addImageWithUrl(gifUrl);
  90. });
  91. }
  92. // 撤銷/重做功能的實現可以根據你的需求設計
  93. // 將 YOUR_API_KEY 替換成你的 Giphy API 密鑰
  94. function getRandomMemeGif(callback) {
  95. const apiKey = 'SHyO3XJY0R71LuTQlx2SlsRuvTrKBjxD';
  96. const apiUrl = `https://api.giphy.com/v1/gifs/random?api_key=${apiKey}&tag=meme`;
  97. fetch(apiUrl)
  98. .then(response => response.json())
  99. .then(data => {
  100. const gifUrl = data.data.images.original.url;
  101. if (callback) callback(gifUrl);
  102. })
  103. .catch(error => {
  104. console.error('Error fetching random meme gif:', error);
  105. });
  106. }
  107. function addImageWithUrl(imageUrl) {
  108. const card = document.createElement('div');
  109. card.className = 'card';
  110. // 隨機選擇一個大小
  111. const sizeClass = 'card-size-' + (Math.floor(Math.random() * 4) + 1);
  112. card.classList.add(sizeClass);
  113. const img = document.createElement('img');
  114. img.src = imageUrl;
  115. img.alt = 'Mood Image';
  116. img.className = 'mood-image';
  117. img.onload = function() {
  118. card.appendChild(img);
  119. const cardholder = document.querySelector('.cardholder');
  120. cardholder.appendChild(card);
  121. pckry.appended(card);
  122. pckry.layout();
  123. var draggie = new Draggabilly(card);
  124. pckry.bindDraggabillyEvents(draggie);
  125. };
  126. }