小编Mic*_*way的帖子

在事件回调中访问 iFrame 的 localStorage?

我试图用 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

javascript local-storage

6
推荐指数
1
解决办法
1万
查看次数

返回 Typescript 中两种类型之一的方法

我有以下方法,如果之前已注册,则应该返回组件对象

/**
 * 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)

typescript

5
推荐指数
1
解决办法
3899
查看次数

标签 统计

javascript ×1

local-storage ×1

typescript ×1