我试图用 localStorage 作弊。该规范定义了当 localStorage 中的值发生变化时,同一域上的所有其他打开的页面都会收到一个存储事件回调。我还希望在更改值的页面上触发该事件。
我向每个页面添加了一个隐藏的 iFrame,它从同一域加载一个空文档,并尝试将其用作 localStorage 更改的目标(因此从技术上讲,我正在查看的页面不是 localStorage 更改的来源)
它工作正常,除非我在事件回调中做同样的事情......
function fnSetupMusicPlayerSection(i, oSection) {
var oAudio, oLocalStorageFrame, oLocalStorageWindow;
oAudio = oSection.querySelector('audio');
oLocalStorageFrame = oSection.querySelector('iframe.local-storage-target');
oLocalStorageWindow = oLocalStorageFrame.contentWindow || oLocalStorageFrame;
oLocalStorageWindow.localStorage.setItem('loadSetter', '1111');
oAudio.addEventListener('play', function(oEvent) {
oLocalStorageWindow.localStorage.setItem('callbackSetter', '2222');
});
}
Run Code Online (Sandbox Code Playgroud)
loadSetter存储成功,所有窗口都接收到存储事件。当我单击播放音频时,我在回调中收到以下错误 - Uncaught DOMException: Failed to execute 'setItem' on 'Storage': access is denied for this document。
我能做些什么来解决这个问题吗?我真的不想写代码来单独更新当前页面
更新:我不知道我在上面给出的例子中是否做错了什么,但代码似乎在一些回调中工作。我在页面上有一个带有单击事件的锚点,我可以在其中通过 iFrame 设置 localStorage
我有以下方法,如果之前已注册,则应该返回组件对象
/**
* Retrieve a component
* @param string sComponentName The name of the component to look for
* @return ComponentInterface | boolean
*/
public getComponent(sComponentName: string): boolean | ComponentInterface {
if(!this.hasComponent(sComponentName)) {
return false;
}
return this.components[sComponentName];
}
Run Code Online (Sandbox Code Playgroud)
一切都编译并运行良好,但我的编辑器抛出以下警告......
Property 'x' does not exist on type 'boolean | ComponentInterface'
Run Code Online (Sandbox Code Playgroud)
当我尝试跑步时...
const oPositionComponent = oEntity.getComponent('position');
console.log(oPositionComponent.x);
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来编写此内容,以便我的编辑知道我想要实现的目标?
解决方案
好吧,因为我实际上是在上一步中检查组件是否存在,所以我只是对返回值进行了类型转换......
aEntities = aEntities.filter((oEntity) => {
return oEntity.hasComponent('position');
});
aEntities.forEach((oEntity) => {
const oPositionComponent = <ComponentInterface> oEntity.getComponent('position');
this.context.translate(oPositionComponent.x, oPositionComponent.y);
});
Run Code Online (Sandbox Code Playgroud)