You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Svelte中整合Buy Me Coffee脚本并自定义按钮位置?

在Svelte中整合Buy Me Coffee脚本与现有TypeScript代码并自定义按钮位置

一、整合两个脚本

无需额外添加独立的<script>标签,直接在现有TypeScript脚本的onMount钩子中动态加载Buy Me Coffee的外部脚本即可,既避免脚本加载顺序冲突,又能和现有代码完美兼容。

修改后的完整TypeScript代码如下:

<script lang='ts'>
    import { onMount } from 'svelte';
  
    let sectionsVisible = [false, false, false, false];
  
    function handleScroll() {
      const sections = document.querySelectorAll('section');
      sections.forEach((section, index) => {
        const rect = section.getBoundingClientRect();
        if (rect.top < window.innerHeight * 0.75) {
          sectionsVisible[index] = true;
        }
      });
    }
  
    onMount(() => {
      // 初始化滚动逻辑并绑定监听
      handleScroll();
      window.addEventListener('scroll', handleScroll);

      // 动态创建Buy Me Coffee脚本标签
      const bmcScript = document.createElement('script');
      bmcScript.type = 'text/javascript';
      bmcScript.src = 'https://cdnjs.buymeacoffee.com/1.0.0/button.prod.min.js';
      // 配置BMC按钮属性
      bmcScript.setAttribute('data-name', 'bmc-button');
      bmcScript.setAttribute('data-slug', 'slug_name');
      bmcScript.setAttribute('data-color', '#FFDD00');
      bmcScript.setAttribute('data-emoji', '☕');
      bmcScript.setAttribute('data-font', 'Lato');
      bmcScript.setAttribute('data-text', 'Buy me a coffee');
      bmcScript.setAttribute('data-outline-color', '#000000');
      bmcScript.setAttribute('data-font-color', '#000000');
      bmcScript.setAttribute('data-coffee-color', '#ffffff');

      // 避免重复加载脚本
      if (!document.querySelector('script[data-name="bmc-button"]')) {
        document.body.appendChild(bmcScript);
      }

      // 组件卸载时清理资源
      return () => {
        window.removeEventListener('scroll', handleScroll);
        const existingScript = document.querySelector('script[data-name="bmc-button"]');
        if (existingScript) existingScript.remove();
        const bmcButton = document.querySelector('.bmc-button');
        if (bmcButton) bmcButton.remove();
      };
    });
  </script>

二、将按钮放置到指定位置

默认情况下BMC脚本会把按钮添加到body末尾,你可以通过以下步骤自定义按钮位置:

  1. 在组件HTML部分的目标位置添加一个容器:
<!-- 放在你想要显示按钮的位置 -->
<div id="bmc-button-container" class="your-custom-styles"></div>
  1. 在onMount中添加脚本加载完成后的按钮移动逻辑:
    在创建bmcScript的代码后,追加以下监听事件:
// 脚本加载完成后移动按钮到指定容器
bmcScript.onload = () => {
  setTimeout(() => {
    const bmcButton = document.querySelector('.bmc-button');
    const container = document.getElementById('bmc-button-container');
    if (bmcButton && container) {
      container.appendChild(bmcButton);
    }
  }, 100); // 短延迟确保按钮已被脚本创建
};

补充说明

  • 延迟时间可根据实际情况调整,保证按钮元素已生成;
  • 可通过给容器#bmc-button-container添加CSS,自定义按钮的布局样式;
  • 卸载清理函数能避免页面残留无用元素与事件监听器。

内容的提问来源于stack exchange,提问作者Gumrai Aung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:40:55