为什么 Chrome 将我的新标签检测为广告? - ReactJS
Why Chrome detects my new tab as an Ad ? - ReactJS
我有一个可能很奇怪的问题,但仍然有点烦人。
在我们的界面中,我们通过简单地单击按钮并在新选项卡上预览 PDF 文件来创建用户交互。一切正常,但如果您 Chrome AdBlocker 扩展已激活,它会自动触发,并且不允许用户预览他的文档。这有点烦人,因为我必须为每个用户显示一条大消息,以便有一个正常工作的应用程序来禁用他们的 AdBlocker 扩展。所以我问自己有没有办法防止这种情况发生?
const postHeader = {
responseType: 'arraybuffer',
headers: {
'Content-Type': 'application/json;charset=UTF-8',
'Access-Control-Allow-Origin': '*',
'Accept': 'application/pdf',
'Authorization': 'Bearer ' + token
}
};
// Prepare request to the BE body
const postBody = {
customerNumber,
tenant
};
if (!isNaN(pdfID)) {
// Firing the request to the BE
axios.post(serverUrl + '/api/user/bill/' + pdfID, postBody, postHeader)
.then((response) => {
// If there is blob data with the PDF, we show it
if (response.data.byteLength > 0) {
// We create a file from the blob
const file = new Blob([response.data], {
type: 'application/pdf'
});
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(file, "output.pdf");
} else {
const objectUrl = URL.createObjectURL(file);
window.open(objectUrl);
console.log(objectUrl)
}
浏览器中常见的弹出窗口阻止策略是要求任何新的 window/tab 作为用户交互的直接结果打开。由于您的点击事件处理程序启动了一个异步过程,并且您在新的 window 解决之前不会打开它,这意味着浏览器将阻止它,因为用户交互和 [=11= 之间已经过去了太多时间].
解决此问题的最简单方法是在开始读取数据之前打开 window,然后在准备好数据后写入它。这样的事情应该有效:
if (!isNaN(pdfID)) {
const pdfWindow = window.open('about:blank');
// Firing the request to the BE
axios.post(serverUrl + '/api/user/bill/' + pdfID, postBody, postHeader)
.then((response) => {
// If there is blob data with the PDF, we show it
if (response.data.byteLength > 0) {
// We create a file from the blob
const file = new Blob([response.data], {
type: 'application/pdf'
});
const objectUrl = URL.createObjectURL(file);
pdfWindow.document.location.href = objectUrl;
您也可以使用静态页面作为占位符,而不是 about:blank
,例如一个只显示消息的页面,例如 Loading...
.
我不确定如何处理那个 window.navigator.msSaveOrOpenBlob
事情,因为我一点也不熟悉它。
我有一个可能很奇怪的问题,但仍然有点烦人。
在我们的界面中,我们通过简单地单击按钮并在新选项卡上预览 PDF 文件来创建用户交互。一切正常,但如果您 Chrome AdBlocker 扩展已激活,它会自动触发,并且不允许用户预览他的文档。这有点烦人,因为我必须为每个用户显示一条大消息,以便有一个正常工作的应用程序来禁用他们的 AdBlocker 扩展。所以我问自己有没有办法防止这种情况发生?
const postHeader = {
responseType: 'arraybuffer',
headers: {
'Content-Type': 'application/json;charset=UTF-8',
'Access-Control-Allow-Origin': '*',
'Accept': 'application/pdf',
'Authorization': 'Bearer ' + token
}
};
// Prepare request to the BE body
const postBody = {
customerNumber,
tenant
};
if (!isNaN(pdfID)) {
// Firing the request to the BE
axios.post(serverUrl + '/api/user/bill/' + pdfID, postBody, postHeader)
.then((response) => {
// If there is blob data with the PDF, we show it
if (response.data.byteLength > 0) {
// We create a file from the blob
const file = new Blob([response.data], {
type: 'application/pdf'
});
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(file, "output.pdf");
} else {
const objectUrl = URL.createObjectURL(file);
window.open(objectUrl);
console.log(objectUrl)
}
浏览器中常见的弹出窗口阻止策略是要求任何新的 window/tab 作为用户交互的直接结果打开。由于您的点击事件处理程序启动了一个异步过程,并且您在新的 window 解决之前不会打开它,这意味着浏览器将阻止它,因为用户交互和 [=11= 之间已经过去了太多时间].
解决此问题的最简单方法是在开始读取数据之前打开 window,然后在准备好数据后写入它。这样的事情应该有效:
if (!isNaN(pdfID)) {
const pdfWindow = window.open('about:blank');
// Firing the request to the BE
axios.post(serverUrl + '/api/user/bill/' + pdfID, postBody, postHeader)
.then((response) => {
// If there is blob data with the PDF, we show it
if (response.data.byteLength > 0) {
// We create a file from the blob
const file = new Blob([response.data], {
type: 'application/pdf'
});
const objectUrl = URL.createObjectURL(file);
pdfWindow.document.location.href = objectUrl;
您也可以使用静态页面作为占位符,而不是 about:blank
,例如一个只显示消息的页面,例如 Loading...
.
我不确定如何处理那个 window.navigator.msSaveOrOpenBlob
事情,因为我一点也不熟悉它。