javascript中有没有一种方法可以获取所有不使用';getElementsByTagName是否违反了同源策略?
我正在编写一个chrome扩展,需要在页面上获得html5视频元素,但一些视频元素在iFrame中。我在函数中添加了搜索iframe的功能,但由于与具有不同src域的iframe相关的同源策略,我开始出现错误 在我的函数中,有没有一种简单的方法可以排除违反同源策略的iFrame?或者更好的是(尽管可能不可能),有没有一种方法仍然可以从主页上搜索具有不同src域的iframe 有关职能: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
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。您得到的框架始终是顶部框架(而不是网页中可能存在的所有子框架)。