加载后返回iFrame元素

时间:2018-02-21 18:03:43

标签: javascript

我有一个类似下面的函数,我需要它在iframe加载后返回iframe元素(或iframe主体中的元素)。

我一直在阅读Promises和Async,但到目前为止我的JS已经过时了。任何指针/帮助表示赞赏。 TIA。

get_my_element = await get_element_inside_iframe();
    console.dir(get_my_element); // await returns promise, without await returns undefined. I need the actual element instead.

async function get_element_inside_iframe() {
    myiFrame = document.getElementById('myiFrame');
    if (myiFrame == null) {
        myiFrame = document.createElement('iframe');
        myiFrame.setAttribute('id', 'myiFrame');
        myiFrame.setAttribute('seamless', '');
        myiFrame.setAttribute('srcdoc', '<html><head><style type="text/css">body {background:red}</style></head><body><div id="myelement">hello</div></body></html>');
        document.body.appendChild(myiFrame);
        myiFrame.addEventListener("load", function(){
            let element_inside_iframe = myiFrame.contentWindow.document.getElementById('myelement');
            return element_inside_iframe;
        });
    }
}

1 个答案:

答案 0 :(得分:0)

最后根据这个解决方案:https://stackoverflow.com/a/14220323/4124433

以下代码有效:

get_element_inside_iframe().then(
        function(val){
            console.log("value="+val);
        }).catch(function(e){
            console.log('error=' + e)
        });

async function get_element_inside_iframe() {
    return new Promise(function(resolve, reject) {
        myiFrame = document.getElementById('myiFrame');
        if (myiFrame == null) {
            myiFrame = document.createElement('iframe');
            myiFrame.setAttribute('id', 'myiFrame');
            myiFrame.setAttribute('seamless', '');
            myiFrame.setAttribute('srcdoc', '<html><head><style type="text/css">body {background:red}</style></head><body><div id="myelement">hello</div></body></html>');
            document.body.appendChild(myiFrame);
            myiFrame.addEventListener("load", function(){
                let element_inside_iframe = myiFrame.contentWindow.document.getElementById('myelement');
                return resolve(element_inside_iframe);
            });
        }
        else {
            resolve(myiFrame.contentWindow.document.getElementById('myelement'))
        }
    });
}