jquery - конвертирует функцию в переменную - PullRequest
0 голосов
/ 01 мая 2018

У меня есть несколько предопределенных параметров для beans.js , который является бесплатным плагином для создания анимированных фонов. Пользователь может изменить цвет анимации и прозрачность. Позже я хочу добавить параметры частиц.js в zip-файл, используя jsZip.

Проблема: я не могу сохранить параметры / функцию в переменной для jsZip.

Вот мой пример кода для Particles.Js

function particleBG2(particleColor, particleAlpha) {
  particlesJS("particles-js", {
    particles: {
      number: {
        value: 80,
        density: {
          enable: true,
          value_area: 800
        }
      },
      color: {
        value: particleColor
      },
      shape: {
        type: "circle",
        stroke: {
          width: 0
        },
        polygon: {
          nb_sides: 5
        },
        image: {
          src: "img/github.svg",
          width: 100,
          height: 100
        }
      },
      opacity: {
        value: particleAlpha,
        random: false,
        anim: {
          enable: false,
          speed: 1,
          opacity_min: 0.1,
          sync: false
        }
      },
      size: {
        value: 3,
        random: true,
        anim: {
          enable: false,
          speed: 40,
          size_min: 0.1,
          sync: false
        }
      },
      line_linked: {
        enable: true,
        distance: 150,
        color: particleColor,
        opacity: particleAlpha,
        width: 1
      },
      move: {
        enable: true,
        speed: 3,
        direction: "none",
        random: false,
        straight: false,
        out_mode: "out",
        bounce: false,
        attract: {
          enable: false,
          rotateX: 600,
          rotateY: 1200
        }
      }
    },
    interactivity: {
      detect_on: "canvas",
      events: {
        onhover: {
          enable: false,
          mode: "repulse"
        },
        onclick: {
          enable: false,
          mode: "push"
        },
        resize: true
      },
      modes: {
        grab: {
          distance: 400,
          line_linked: {
            opacity: 1
          }
        },
        bubble: {
          distance: 400,
          size: 40,
          duration: 2,
          opacity: 8,
          speed: 3
        },
        repulse: {
          distance: 200,
          duration: 0.4
        },
        push: {
          particles_nb: 4
        },
        remove: {
          particles_nb: 2
        }
      }
    },
    retina_detect: true
  });
}

Если я могу каким-то образом хранить все это в переменной, т.е. particlescript, тогда я могу предоставить его jsZip для добавления в виде файла сценария.

var zip = new JSZip();
zip.file("script.js", particlescript);
zip.generateAsync({type:"blob"}).then(function(content) {
    saveAs(content, "project.zip");
});

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете сохранить содержимое скрипта в виде строки. Сохраните переменные в качестве заполнителей и замените их значениями, введенными пользователем.

Примерно так:

var template = `function particleBG2() {
  var particleColor = '{particleColor}';
  var particleAlpha = '{particleAlpha}';
  particlesJS("particles-js", {
    particles: {
      number: {
        value: 80,
        density: {
          enable: true,
          value_area: 800
        }
      },
      color: {
        value: particleColor
      },
      shape: {
        type: "circle",
        stroke: {
          width: 0
        },
        polygon: {
          nb_sides: 5
        },
        image: {
          src: "img/github.svg",
          width: 100,
          height: 100
        }
      },
      opacity: {
        value: particleAlpha,
        random: false,
        anim: {
          enable: false,
          speed: 1,
          opacity_min: 0.1,
          sync: false
        }
      },
      size: {
        value: 3,
        random: true,
        anim: {
          enable: false,
          speed: 40,
          size_min: 0.1,
          sync: false
        }
      },
      line_linked: {
        enable: true,
        distance: 150,
        color: particleColor,
        opacity: particleAlpha,
        width: 1
      },
      move: {
        enable: true,
        speed: 3,
        direction: "none",
        random: false,
        straight: false,
        out_mode: "out",
        bounce: false,
        attract: {
          enable: false,
          rotateX: 600,
          rotateY: 1200
        }
      }
    },
    interactivity: {
      detect_on: "canvas",
      events: {
        onhover: {
          enable: false,
          mode: "repulse"
        },
        onclick: {
          enable: false,
          mode: "push"
        },
        resize: true
      },
      modes: {
        grab: {
          distance: 400,
          line_linked: {
            opacity: 1
          }
        },
        bubble: {
          distance: 400,
          size: 40,
          duration: 2,
          opacity: 8,
          speed: 3
        },
        repulse: {
          distance: 200,
          duration: 0.4
        },
        push: {
          particles_nb: 4
        },
        remove: {
          particles_nb: 2
        }
      }
    },
    retina_detect: true
  });
}`;


document.querySelector('button').addEventListener('click', function() {
  var particleAlpha = document.querySelector('#particleAlpha').value;
  var particleColor = document.querySelector('#particleColor').value;
  var particlescript = template.replace(/\{(.*)\}/g, function(a, b, c) {
    return eval(b);
  });
  console.log(particlescript);
  
  // var zip = new JSZip();
  // zip.file("script.js", particlescript);
  // zip.generateAsync({type:"blob"}).then(function(content) {
  //   saveAs(content, "project.zip");
  // });
});
<input id="particleColor" type="text" placeholder="particleColor" value="#ddd" /><br />
<input id="particleAlpha" type="text" placeholder="particleAlpha" value="0.5" /><br />
<button>Save</button>
...