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

Svelte组件中如何将变量值传入div内的script标签?

解决Svelte组件中Freestar广告脚本变量替换问题

方案一:动态创建DOM元素(推荐,安全可控)

Svelte对组件内的内嵌script标签不会自动做变量插值,通过动态创建DOM元素的方式可以完美解决变量注入问题:

<script>
  import { onMount } from 'svelte';
  // 定义可外部传入的变量
  export let placementId = 'default_placement';
  export let slotId = 'default_slot';

  onMount(() => {
    // 确保freestar全局对象已加载
    if (typeof freestar === 'undefined') return;

    // 创建广告容器div
    const adContainer = document.createElement('div');
    adContainer.id = 'desktop_native';

    // 创建script标签并注入变量
    const adScript = document.createElement('script');
    adScript.type = 'text/javascript';
    adScript.dataset.cfasync = 'false';
    adScript.textContent = `
      freestar.config.enabled_slots.push({ 
        placementName: "${placementId}", 
        slotId: "${slotId}" 
      });
    `;

    // 将元素挂载到组件内的预留位置
    adContainer.appendChild(adScript);
    document.getElementById('ad-mount-point').appendChild(adContainer);
  });
</script>

<!-- 组件内预留广告挂载节点 -->
<div id="ad-mount-point"></div>

方案二:使用@html指令(注意XSS风险)

如果变量来源完全可信(无用户输入等不可控内容),可以通过拼接HTML字符串并用@html渲染的方式实现:

<script>
  export let placementId = 'some_placement_id';
  export let slotId = 'some_slot_id';

  // 拼接带变量的HTML字符串,注意script标签闭合要转义
  $: adHtml = `
    <div id="desktop_native">
      <script data-cfasync="false" type="text/javascript">
        freestar.config.enabled_slots.push({ 
          placementName: "${placementId}", 
          slotId: "${slotId}" 
        });
      <\/script>
    </div>
  `;
</script>

<!-- 渲染动态HTML内容 -->
{@html adHtml}

关键注意事项

  • 必须确保全局的freestar对象在组件挂载前已加载完成,否则会触发undefined错误,可在onMount中增加判断逻辑
  • 若需要广告刷新功能,可将动态创建脚本的逻辑封装为独立函数,按需调用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:37:09