Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中有没有一种方法可以获取所有不使用';getElementsByTagName是否违反了同源策略?_Javascript_Iframe_Google Chrome Extension - Fatal编程技术网

javascript中有没有一种方法可以获取所有不使用';getElementsByTagName是否违反了同源策略?

javascript中有没有一种方法可以获取所有不使用';getElementsByTagName是否违反了同源策略?,javascript,iframe,google-chrome-extension,Javascript,Iframe,Google Chrome Extension,我正在编写一个chrome扩展,需要在页面上获得html5视频元素,但一些视频元素在iFrame中。我在函数中添加了搜索iframe的功能,但由于与具有不同src域的iframe相关的同源策略,我开始出现错误 在我的函数中,有没有一种简单的方法可以排除违反同源策略的iFrame?或者更好的是(尽管可能不可能),有没有一种方法仍然可以从主页上搜索具有不同src域的iframe 有关职能: function getVideo() { var videos = document.getElem

我正在编写一个chrome扩展,需要在页面上获得html5视频元素,但一些视频元素在iFrame中。我在函数中添加了搜索iframe的功能,但由于与具有不同src域的iframe相关的同源策略,我开始出现错误

在我的函数中,有没有一种简单的方法可以排除违反同源策略的iFrame?或者更好的是(尽管可能不可能),有没有一种方法仍然可以从主页上搜索具有不同src域的iframe

有关职能:

function getVideo() {
    var videos = document.getElementsByTagName("video");
    if (videos.length >= 1) {
        return videos[0];
    }
    var iframes = document.getElementsByTagName("iframe");
    if (iframes.length >= 1) {
        for (const frame of iframes) {
            videos = frame.contentWindow.document.getElementsByTagName("video");
            if (videos.length >= 1) {
                return videos[0];
            }
        }
    }
    return null; // if a video doesn't exist
}

当你认为你已经在这里搜索了足够长的时间来证明一个问题时,你发现了一些实际有用的东西

根据的答案,我将代码更新为:

function getVideo() {
    var videos = document.getElementsByTagName("video");
    if (videos.length >= 1) {
        return [videos[0], "main"];
    }

    // Code that will run only inside iframe
    if (parent === top) {
        var videos = document.getElementsByTagName("video");
        if (videos.length >= 1) {
            return [videos[0], "iframe"];
        }
    }
    return [null, null]; // if a video doesn't exist
}
并将其包含在我的清单中,以便脚本也被注入iFrame中:

"content_scripts": [{
    "all_frames": true,
    ...

    ...
}],
这是可行的,但它确实让我的其他函数非常难看。例如:

// if a video exists, set it to the speed and give a notification
function setSpeed(newSpeed) {
    var returnVal = getVideo();
    var video = returnVal[0], type = returnVal[1];
    if (video != null && type === "main") {
        video.playbackRate = newSpeed;
        inWindowAlert("Speed: " + newSpeed, 1000);
        setIcon(newSpeed);
    }
    if (parent === top) {
        if (video != null && type === "iframe") {
            video.playbackRate = newSpeed;
            inWindowAlert("Speed: " + newSpeed, 1000);
            setIcon(newSpeed);
        }
    }
}

我会尝试想出一个更干净的解决方案,但现在它起作用了。希望这对任何人都有帮助。

如果您在Manifest.json中将所有帧设置为false,那么我认为您不需要检查fame父项===top。您得到的框架始终是顶部框架(而不是网页中可能存在的所有子框架)。