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

使用Interact JS实现元素缩放时遇Unexpected Identifier错误求助

解决Interact.js缩放拖拽示例的Unexpected Identifier错误

我帮你排查出几个导致Unexpected Identifier错误的核心问题,还有一些影响功能的小问题,一步步来修复:

1. 移除对象末尾的多余逗号(触发错误的关键)

你的JavaScript代码里,resizable配置的modifiers数组中,两个配置对象的最后一个属性后面都加了多余的尾随逗号。在早期JavaScript规范(比如ES5严格模式)中,对象或数组最后一项的尾随逗号会解析失败,直接抛出Unexpected Identifier错误。

错误代码片段:

modifiers: [
  interact.modifiers.restrictEdges({
    outer: 'parent',
    endOnly: true, // 这里的多余逗号要删除
  }),
  interact.modifiers.restrictSize({
    min: { width: 100, height: 50 }, // 这里的多余逗号也要删除
  }),
],

修正后:

modifiers: [
  // keep the edges inside the parent
  interact.modifiers.restrictEdges({
    outer: 'parent',
    endOnly: true
  }),
  // minimum size
  interact.modifiers.restrictSize({
    min: { width: 100, height: 50 }
  })
],

2. 补充缺失的dragMoveListener函数

你在draggable配置中指定了onmove: window.dragMoveListener,但这个函数并没有定义,会导致拖拽功能失效并报错。需要在你的JavaScript代码开头添加这个函数:

// 定义拖拽移动的监听函数
function dragMoveListener(event) {
  const target = event.target;
  // 获取元素当前的位置偏移量
  const x = parseFloat(target.getAttribute('data-x')) || 0;
  const y = parseFloat(target.getAttribute('data-y')) || 0;

  // 更新元素的位置
  target.style.transform = `translate(${x + event.dx}px, ${y + event.dy}px)`;

  // 保存新的位置数据到元素属性
  target.setAttribute('data-x', x + event.dx);
  target.setAttribute('data-y', y + event.dy);
}

// 将函数挂载到window对象,确保interact能调用到
window.dragMoveListener = dragMoveListener;

3. 修复HTML的DOCTYPE声明

你的HTML开头的<!DOCTYPE html5>是错误的,正确的标准HTML5声明是<!DOCTYPE html>,这会影响浏览器的渲染模式,建议修正:

<!DOCTYPE html>
<html>
<!-- 其余代码不变 -->
</html>

4. (可选)优化Interact.js的CDN链接

你当前引入的interact-js@2.1.0是旧的包名,官方现在的包名是interactjs,可以换成更稳定的官方CDN链接:

<script src="https://cdn.jsdelivr.net/npm/interactjs/dist/interact.min.js"></script>

修正后的完整代码

JavaScript(drag.js):

// 定义拖拽移动的监听函数
function dragMoveListener(event) {
  const target = event.target;
  const x = parseFloat(target.getAttribute('data-x')) || 0;
  const y = parseFloat(target.getAttribute('data-y')) || 0;

  target.style.transform = `translate(${x + event.dx}px, ${y + event.dy}px)`;
  target.setAttribute('data-x', x + event.dx);
  target.setAttribute('data-y', y + event.dy);
}

window.dragMoveListener = dragMoveListener;

interact('.resize-drag')
  .draggable({
    onmove: window.dragMoveListener,
    modifiers: [
      interact.modifiers.restrict({
        restriction: 'parent',
        elementRect: { top: 0, left: 0, bottom: 1, right: 1 }
      })
    ]
  })
  .resizable({
    edges: { left: true, right: true, bottom: true, top: true },
    modifiers: [
      interact.modifiers.restrictEdges({
        outer: 'parent',
        endOnly: true
      }),
      interact.modifiers.restrictSize({
        min: { width: 100, height: 50 }
      })
    ],
    inertia: true
  })
  .on('resizemove', function (event) {
    var target = event.target,
        x = (parseFloat(target.getAttribute('data-x')) || 0),
        y = (parseFloat(target.getAttribute('data-y')) || 0);

    target.style.width = event.rect.width + 'px';
    target.style.height = event.rect.height + 'px';

    x += event.deltaRect.left;
    y += event.deltaRect.top;

    target.style.webkitTransform = target.style.transform =
        'translate(' + x + 'px,' + y + 'px)';

    target.setAttribute('data-x', x);
    target.setAttribute('data-y', y);
    target.textContent = Math.round(event.rect.width) + '\u00D7' + Math.round(event.rect.height);
  });

HTML:

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" type="text/css" href="drag.css">
  <script src="https://cdn.jsdelivr.net/npm/interactjs/dist/interact.min.js"></script>
  <script src="drag.js"></script>
  <title>Drag and drop</title>
</head>
<body>
  <div class="resize-container">
    <div class="resize-drag">
    </div>
  </div>
</body>
</html>

CSS(drag.css):

.resize-drag {
  background-color: #29e;
  color: white;
  font-size: 20px;
  font-family: sans-serif;
  border-radius: 8px;
  padding: 20px;
  margin: 30px 20px;
  touch-action: none;
  width: 120px;
  box-sizing: border-box;
}

.resize-container {
  display: inline-block;
  width: 100%;
  height: 240px;
  border: 1px solid #ddd; /* 可选:添加边框方便查看容器范围 */
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:06:26