如何在JavaScript中转移'devicemotion'属性?

How to transfer 'devicemotion' property in JavaScript?

我有一个 DOM 元素(在某些情况下是几个),我想在设备移动时移动(通过更改 css)。

现在,我想知道为什么这不起作用:

var aDOMElement = document.getElementById("someId");
aDOMElement.DeviceMotionEvent = window.DeviceMotionEvent;
aDOMElement.addEventListener('devicemotion', motionHandler, false);

我考虑了一种解决方法,只使用 window 对象,在回调中我处理存储在数组中的所有对象的移动。

有点像这样:

function motionHandler(event) {
    for (var obj in objectList) {
        obj.move(event);
    }
}

但是,由于某些奇怪的原因,我在将对象存储到列表之前分配给该对象的 move 函数是 undefined。解释 and/or 欢迎解决此问题。

编辑:

以下是我创建对象并将其添加到数组的方式:

var objectList = [];

var elem = document.createElement("div");
//add some properties
elem.id = "someId";
elem.move = specificMoveFunction;
//add it to the list
objectList[elem.id] = elem;

仅仅因为您将 属性 DeviceMotionEvent 分配给 DOM 元素并不意味着它会被触发...您必须连接事件侦听器window (它被触发的地方)到 DOM 元素上的事件侦听器并手动触发它们。您最好监听 window 的事件并在那里进行 DOM 操作。

例如

window.addEventListener('devicemotion', function(event) {
  var domElements = document.getElementsByClassName('could-move');
  for (i=0;i<elements.length;i++) { 
    elements[i].classList.add("moved"); 
  }
});

你之前的 HTML 看起来像:

<span class="could-move">span 1</span>
<span class="could-move">span 2</span>

之后会像

<span class="could-move moved">span 1</span>
<span class="could-move moved">span 2</span>

编辑:

实际上,为什么需要将它从 window 设置到 DOM 元素上?你不能只 aDOMElement.addEventListener('devicemotion', motionHandler, false); 没有 aDOMElement.DeviceMotionEvent = window.DeviceMotionEvent; 吗? MDN 文档没有说这仅在 window.

上触发

编辑二: 这些示例都显示事件仅在 window 上触发:http://www.html5rocks.com/en/tutorials/device/orientation/ 所以我仍然认为您最好只在 window 上收听并在那里工作。