首次检索Iframe数据的问题

时间:2017-03-04 17:30:38

标签: javascript html iframe electron

我有一个功能

function serializeUpgradeData(){
     var workingFrame = document.querySelector('#upgradeFrame');
     var iframeWrapper = document.createElement('div');
     iframeWrapper.innerHTML = workingFrame.contentDocument.body.innerHTML;
     var tableData = iframeWrapper.querySelectorAll('div > table:nth-child(2) > tbody > tr');
     return tableData;
 }

这会从使用此功能

添加到文档中的iframe中获取数据
function loadFileAsFrame(fileName){
    upgradeFrame.id ='upgradeFrame'
    upgradeFrame.style.display = 'none';
    document.body.appendChild(upgradeFrame);
    upgradeFrame.src = fileName;
}

upgradeFrame定义为document.createElement('iframe')

的位置

这两个都是从这个

运行的
function openFileDialog(){
dialog.showOpenDialog({properties: ['openFile'], filters: [{name:'HTML', extensions:
                      ['html', 'htm']}]}, function (fileName) {

    loadFileAsFrame(fileName);
    var table = serializeUpgradeData()
    console.log(table);
});

}

文件只是我正在测试的html文档。第一次运行iframeWrapper只检索<div></div>。如果我第二次使用相同的文件,它会检索我想要的数据。

注意:这也是一个电子应用

1 个答案:

答案 0 :(得分:1)

我怀疑当没有&#39; upgradeFrame&#39;时,会调用serializeUpgradeData函数。然而,解决方案是使用回调或承诺,你的电话

  function loadFileAsFrame(fileName ,callback){
    upgradeFrame.id ='upgradeFrame'
    upgradeFrame.style.display = 'none';
    document.body.appendChild(upgradeFrame);
    upgradeFrame.src = fileName;
   callback(upgradeFrame)
}

然后使用它;

        function openFileDialog(){
        dialog.showOpenDialog({properties: ['openFile'], filters: [{name:'HTML', extensions:
                              ['html', 'htm']}]}, function (fileName) {

            loadFileAsFrame(fileName , function(upgradeFrame){
            serializeUpgradeData(upgradeFrame);
         });       
     });
}

终于

function serializeUpgradeData(upgradeFrame){
     var workingFrame = upgradeFrame
     var iframeWrapper = document.createElement('div');
     iframeWrapper.innerHTML = workingFrame.contentDocument.body.innerHTML;
     var tableData = iframeWrapper.querySelectorAll('div > table:nth-child(2) > tbody > tr');
     return tableData;
 }

现在还有另一种方法可以更轻松地完成你想做的事情 如果我理解正确,你想选择/选择一个html文件并将其显示在电子窗口中,为此你应该使用browserWindow创建一个新窗口,并将文件url作为入口点。它将提供更多控制,并减少编写代码。

希望这有帮助