Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.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 如何检查URL是否与当前页面和/或工作页面的来源相同_Javascript_Web Worker - Fatal编程技术网

Javascript 如何检查URL是否与当前页面和/或工作页面的来源相同

Javascript 如何检查URL是否与当前页面和/或工作页面的来源相同,javascript,web-worker,Javascript,Web Worker,这里有一个类似的问题 不幸的是,它没有指定答案必须同时在页面和工作程序中工作,因此所有答案都不能在工作程序中工作 特别是,我正在尝试使用fetchapi以一种尽可能自动的方式获取图像。获取图像时,我希望将模式设置为cors,但前提是URL不是同一来源。我需要知道如何在页面上下文和工作上下文中都做到这一点 伪码 函数loadImageBitmap(url){ 常量选项={}; 如果(url不是相同的来源(url)){ options.mode='cors'; } 返回获取(url、选项) 。然

这里有一个类似的问题

不幸的是,它没有指定答案必须同时在页面和工作程序中工作,因此所有答案都不能在工作程序中工作

特别是,我正在尝试使用fetchapi以一种尽可能自动的方式获取图像。获取图像时,我希望将模式设置为
cors
,但前提是URL不是同一来源。我需要知道如何在页面上下文和工作上下文中都做到这一点

伪码

函数loadImageBitmap(url){
常量选项={};
如果(url不是相同的来源(url)){
options.mode='cors';
}
返回获取(url、选项)
。然后((响应)=>{
如果(!response.ok){
投掷反应;
}
返回response.blob();
}).然后((blob)=>{
返回全局.createImageBitmap(blob);
});
}
函数urlIsNotSameOrigin(url){
//我在这里放什么?
}
//例子
异步函数main(){
常量位图=Promise.all([
'https://notsamedomain.com/foo.jpg',
“../relative/image.png”,
“/absolute/thing.jpg”,
“//other/absolute/thing.jpg”,
'https://samedomain.com/bar.gif',
].map(loadImageBitmap));
}

URL()构造函数和它可以钩住的锚之间的区别

因此,为了使URL()构造函数的行为与锚点相同,您需要做些什么

这意味着在文档
中,只要生成的uri有效,新URL(uri,document.baseURI)
将返回与
Object.assign(document.createElement('a'),{href:uri})
相同的URL属性

现在,在Worker中,我们仍然无法访问节点的baseURI,而且还不清楚要挂接哪个节点

在大多数情况下,您可以简单地使用
self.location.href
作为基本URI,如果您要获取相同的源资源,这实际上可能是您想要的,但是如果您确实从blobURL初始化工作程序,您可能必须从主作用域传递它,就像我在StackSnippet®过度保护的iframe中所做的那样

//从blobURI初始化工作程序。。。
const worker\u url=getWorkerURL(worker\u脚本);
const worker=新的worker(worker\u url);
worker.onmessage=e=>console.log(e.data);
worker.postMessage({
//我们传递基本URL
基数:'https://samedomain.com/foo.html',
URI:[
'https://notsamedomain.com/foo.jpg',
“../relative/image.png”,
“/absolute/thing.jpg”,
“//other/absolute/thing.jpg”,
'https://samedomain.com/bar.gif'
]
});
//__杂项__________
//根据生成的Blob获取我们的工作人员的blobURL
//从元素textContent
函数getWorkerURL(el){
常量内容=el.textContent;
constblob=newblob([content],{type:'application/javascript'});
返回URL.createObjectURL(blob);
}

onmessage=e=>{
常数d=e.数据;
//如果我们不是在空源iframe的blobURI中,我们可以
//const self_url=新url(location.href)
//但这里我们通过了假基域
const self_url=新url(d.base);
const sameorigins=d.uris.filter(uri=>{
试试{//裹在一个试抓中,残疾人扔
const url=新的url(uri,self_url);
返回url.origin==self\u url.origin;
}catch(e){return false;}
})
邮递信息(sameorigins);
};

URL()构造函数和它可以钩住的锚之间的区别

因此,为了使URL()构造函数的行为与锚点相同,您需要做些什么

这意味着在文档
中,只要生成的uri有效,新URL(uri,document.baseURI)
将返回与
Object.assign(document.createElement('a'),{href:uri})
相同的URL属性

现在,在Worker中,我们仍然无法访问节点的baseURI,而且还不清楚要挂接哪个节点

在大多数情况下,您可以简单地使用
self.location.href
作为基本URI,如果您要获取相同的源资源,这实际上可能是您想要的,但是如果您确实从blobURL初始化工作程序,您可能必须从主作用域传递它,就像我在StackSnippet®过度保护的iframe中所做的那样

//从blobURI初始化工作程序。。。
const worker\u url=getWorkerURL(worker\u脚本);
const worker=新的worker(worker\u url);
worker.onmessage=e=>console.log(e.data);
worker.postMessage({
//我们传递基本URL
基数:'https://samedomain.com/foo.html',
URI:[
'https://notsamedomain.com/foo.jpg',
“../relative/image.png”,
“/absolute/thing.jpg”,
“//other/absolute/thing.jpg”,
'https://samedomain.com/bar.gif'
]
});
//__杂项__________
//根据生成的Blob获取我们的工作人员的blobURL
//从元素textContent
函数getWorkerURL(el){
常量内容=el.textContent;
constblob=newblob([content],{type:'application/javascript'});
返回URL.createObjectURL(blob);
}

onmessage=e=>{
常数d=e.数据;
//如果我们不是在空源iframe的blobURI中,我们可以
//const self_url=新url(location.href)
//但这里我们通过了假基域
const self_url=新url(d.base);
const sameorigins=d.uris.filter(uri=>{
试试{//裹在一个试抓中,残疾人扔
const url=新的url(uri,self_url);
返回url.origin==self\u url.origin;
}catch(e){return false;}
})
邮递信息(sameorigins);
};

所说的“工作人员”是指网络工作人员吗?所说的“工作人员”是指网络工作人员吗?IIRC blob具有相同的限制,这意味着blob URL实际上被视为一个不同的域,因此需要cors权限才能执行几乎所有操作anything@gman是的,除了来自同一来源的其他Bloburi,这要么是从主文档创建的,要么是从工作者本身创建的(也可能是从从同一主文档创建的其他工作者创建的),但我从未尝试过这种场景,也不知道如何浏览