More Svg Questions (and Javascript) - Interactivity [moving A Rectangle]
Solution 1:
Your code above does not work because the x
and y
properties of an SVGRectElement are SVGAnimatedLength objects, representing values that can change over time.
The simplest changes to make your code 'work' are:
Change
x = new Number(document.getElementById("player").x);
tox = new Number(document.getElementById("player").x.baseVal.value);
(and similarly for y).Change
document.getElementById("player").x=x;
todocument.getElementById("player").x.baseVal.value=x;
(and similarly for y).
This will cause your code to work as desired. However, your code could generally be improved per my answer to your previous question.
Here is how I would write it (if you really only want to move one unit at a time):
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svgwidth="90%"height="90%"version="1.1"xmlns="http://www.w3.org/2000/svg"><style>#player { stroke-width:1; stroke:red; fill:red }
</style><rectx="250"y="250"id="player"height="50"width="50" /><scripttype="text/javascript"><![CDATA[
varKEY = { 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){
caseKEY.w: rect.y.baseVal.value = --y; break;
caseKEY.s: rect.y.baseVal.value = ++y; break;
caseKEY.a: rect.x.baseVal.value = --x; break;
caseKEY.d: rect.x.baseVal.value = ++x; break;
}
}, false);
]]></script></svg>
Note that I've moved the <rect>
above the <script>
block so that a) the user sees the rectangle before the script starts to load, but more importantly b) so that the rectangle exists before calling getElementById()
. If your script block occurs before your elements have been defined, you must instead set up your code references in response to an onload
or similar event handler.
Post a Comment for "More Svg Questions (and Javascript) - Interactivity [moving A Rectangle]"