Задний план: Я работаю с Shopify ScriptTag, который позволяет мне добавлять файл JavaScript на витрину магазина. Все, что у меня есть, это файл сценария.
Текущее поведение: Существует опция "Купить сейчас", которая позволяет покупателям оформлять заказ напрямую, пропуская Добавить в корзину. Когда они нажимают на Купить сейчас, Shopify отправляет POST-запрос принести() на кассы.json для создания оформления заказа.
Проблема: Мне нужно определить, что этот "запрос на выборку произошел" в моем собственном файле JavaScript.
self.addEventListener('fetch', event => {
console.info("event happened");
});
Я пробовал Получить API событий, но, похоже, он работает только в области Сервисный работник.
Есть ли возможность обнаружить это?
Например, мы можем обнаружить XMLHttpRequest, переопределив его метод открыть, используя прототипное наследование.
Я не могу контролировать поведение при отправке запроса. Это происходит на той же странице, и мой скрипт тоже там. Могу ли я обнаружить, что «запрос произошел»?
Есть ли <iframe> элементы в HTML document? Код, который делает запрос, находится в <iframe> и, или ваш код в <iframe> в HTML document?
Неа. Пока нет фреймов. Это еще один файл сценария от Shopify (vendor), который делает этот запрос.
См. Обозреватель производительности;
да. В настоящее время я смотрю на ваше решение.
См. фрагменты стека и значение, напечатанное в console в этом отвечать на вопрос Получить фактический URL изображения после перенаправления. См. также Обработка <?xml-stylesheet> аналогична <link rel = "stylesheet">?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Да, вы можете перезаписать window.fetch своей собственной функцией, которая вызывает исходную window.fetch после (или до) запуска вашего собственного кода:
const nativeFetch = window.fetch;
window.fetch = function(...args) {
console.info('detected fetch call');
return nativeFetch.apply(window, args);
}
fetch('https://cors-anywhere.herokuapp.com/')
.then(res => res.text())
.then(text => console.info(text.split('\n')[0]));Не знал, что оператор распространения может помещать аргументы в такие массивы, аккуратно.
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.initiatorType === "fetch") {
console.info('Fetch request detected to', entry.name);
}
}
});
observer.observe({
entryTypes: ["resource"]
});
fetch('https://cors-anywhere.herokuapp.com/')
.then(res => res.text())
.then(text => console.info(text.split('\n')[0]));Использование Наблюдатель за производительностью. Спасибо @guest271314.
Этот ответ следует предпочесть принятому в настоящее время ответу на перезапись window.fetch.
Что вы подразумеваете под "обнаружить"? Код, который вы контролируете, делает запрос, верно?