【问题标题】:More SVG questions (and Javascript) - Interactivity [moving a rectangle]更多 SVG 问题(和 Javascript) - 交互性 [移动矩形]
【发布时间】:2011-07-23 20:51:17
【问题描述】:

下面的代码应该在按下键盘上的 WASD 键时使矩形移动。它不起作用。矩形不移动,但不会产生错误。我怎样才能做到这一点?

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="90%" height="90%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<script type="text/javascript">
    <![CDATA[
    var x;
    var y;
    function move()
    {
        x = new Number(document.getElementById("player").x);
        y = new Number(document.getElementById("player").y);
        switch (event.keyCode)
        {
            case 119:
            y--;
            document.getElementById("player").y=y;
            break;
            case 115:
            y++;
            document.getElementById("player").y=y;
            break;
            case 97:
            x--;
            document.getElementById("player").x=x;
            break;
            case 100:
            x++;
            document.getElementById("player").x=x;
            break;
            default:
        }
    }
    document.documentElement.addEventListener("keypress", move, true);
    ]]>
</script>

<rect x="0" y="0" height="100%" width="100%" style="stroke-width:5; stroke:black; fill:white"></rect>
<rect x="250" y="250" id="player" height="50" width="50" style="stroke-width:1; stroke:red; fill:red"></rect>

</svg>

【问题讨论】:

  • @mortalc 也许您没有看到my answer to your previous question,其中包含要更改代码的特定内容,并为您提供了比上面显示的更简洁的解决方案。此外,不清楚你在这里问什么。我看到的是“为什么?”这是在三个语句的项目符号列表之后,然后是一个关于 DOM 交互基础的单独问题。当您甚至没有查看以前的答案时,这似乎是一个要求总体改进的猎枪问题。
  • 我之所以提出最后一个问题,是因为我正在阅读的 XML DOM 教程中没有提到它,但我最近发现了答案,所以忽略它。现在谈谈你的观点: 1. 正如我所提到的,我试过了,但没有用。我想知道为什么。 2. 我希望我知道那是什么意思! 3. 我不听……对不起 4. 我希望我知道那是什么意思! 5. 好的 6. 按键很重要,因此在按住按钮时它会继续移动。
  • 关于我的观点: 2. 我想知道为什么当使用矩形而不是圆形时,另一个答案(只是我的带有事件侦听器的代码)不起作用。 3. 一个让我困惑的奇怪现象。
  • @mortalc 如果您不理解我在另一个问题中的回答,请在该问题中发表评论。我会在我对这个问题的回答中提供更多细节。
  • @mortalc 我猜不出为什么您的代码在使用矩形而不是圆形时不起作用。如果您需要这方面的帮助,请使用无效的代码编辑您的问题(不是对您所做工作的模糊描述)。

标签: javascript svg interactive


【解决方案1】:

您上面的代码不起作用,因为x and y properties of an SVGRectElementSVGAnimatedLength 对象,表示可以随时间变化的值。

使您的代码“工作”的最简单更改是:

  1. 更改
    x = new Number(document.getElementById("player").x);

    x = new Number(document.getElementById("player").x.baseVal.value);
    (对于 y 也是如此)

  2. 更改
    document.getElementById("player").x=x;

    document.getElementById("player").x.baseVal.value=x;
    (对于 y 也是如此)

这将使您的代码按预期工作。但是,您的代码通常可以根据my answer to your previous question 进行改进。

我会这样写(如果你真的只想一次移动一个单元):

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="90%" height="90%" version="1.1"
 xmlns="http://www.w3.org/2000/svg">
<style>
    #player { stroke-width:1; stroke:red; fill:red }
</style>
<rect x="250" y="250" id="player" height="50" width="50" />
<script type="text/javascript"><![CDATA[
  var KEY = { w:87, a:65, s:83, d:68 };
  var rect = document.getElementById('player');
  var x = rect.getAttribute('x')*1,
      y = rect.getAttribute('y')*1;
  document.documentElement.addEventListener("keydown", function(evt){
    switch (evt.keyCode){
      case KEY.w: rect.y.baseVal.value = --y; break;
      case KEY.s: rect.y.baseVal.value = ++y; break;
      case KEY.a: rect.x.baseVal.value = --x; break;
      case KEY.d: rect.x.baseVal.value = ++x; break;
    }
  }, false);
]]></script>
</svg>

请注意,我已将&lt;rect&gt; 上方移至&lt;script&gt; 块,以便a)用户在脚本开始加载之前看到矩形,但更重要的是b)以便矩形在调用getElementById() 之前存在。如果您的脚本块在定义元素之前出现,则必须改为设置代码引用以响应 onload 或类似的事件处理程序。

【讨论】:

  • 哇,谢谢!我的代码以您建议的方式更改不起作用,但是那个起作用了!现在要弄清楚为什么(当然,除了你提到的原因!)......无论如何,它非常有帮助!谢谢!
  • 刚刚看到您对我的另一个问题的编辑...我现在理解得更好了...我希望。让我们看看它会持续多久!
猜你喜欢
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
相关资源
最近更新 更多