function wait(milliseconds) {
return new Promise(resolve => setTimeout(resolve, milliseconds));
}
const stream = new ReadableStream({
async start(controller) {
await wait(1000);
controller.enqueue('This ');
await wait(1000);
controller.enqueue('is ');
await wait(1000);
controller.enqueue('a ');
await wait(1000);
controller.enqueue('slow ');
await wait(1000);
controller.enqueue('request.');
controller.close();
},
}).pipeThrough(new TextEncoderStream());
fetch(url, {
method: 'POST',
headers: {'Content-Type': 'text/plain'},
body: stream,
duplex: 'half',
});
Чтобы уменьшить нагрузку от фоновых вкладок, браузеры устанавливают минимальную задержку таймаута для таймеров в неактивных вкладках.
Особенности реализации здесь зависят от браузера:
- Firefox Desktop и Chrome имеют минимальное время ожидания 1 секунду для неактивных вкладок.
- Firefox для Android имеет минимальный таймаут 15 минут для неактивных вкладок и может полностью их выгрузить.
- Firefox не блокирует неактивные вкладки, если вкладка содержит AudioContext.
dom.min_background_timeout_value 1000
dom.min_background_timeout_value_without_budget_throttling 1000
<form class="row justify-content-center">
<div class="col-8">
<label for="inputPassword2" class="visually-hidden">URL</label>
<input type="text" class="form-control" id="inputUrl" placeholder="Url">
</div>
<div class="col-auto">
<button type="submit" class="btn btn-primary mb-3">Open</button>
</div>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
$(function() {
$('form').submit(function() {
event.preventDefault();
$('body').html('<iframe src="'+$('#inputUrl').val()+'"></iframe>')
});
});
</script>
async function primer() {
var testDataVal = await $.ajax({
url: 'https://site.com/script.php',
method: 'POST',
dataType: 'JSON',
data: { text: 'test' }
});
console.log(testDataVal);
}
primer(); // Запускаем пример
// Установка обработчика для проксирования некоторых исходящих запросов:
browser.proxy.onRequest.addListener(proxySetter, { urls: [ '<all_urls>' ] });
когда перевожу из base64 в blob
<img src="data:image/gif;base64,R0lGODlhDQAMANUAAFRVVtHd74S192aZzHqVuLq0rvf39+zr6bXI4qizwufdz5WhsmSt/5rC+r3Ezm1zeJiSjmum8tzm9bvZ/6bB5a6qpn+t5dvVzZK88+v8/7vg/7DJ4P/99V5gY8zMzObm5ofD/6zQ/3Fua8fX69fm+vDy9OPi4czh/4SXrJLC/////+7u7Wmt/87f9oG2/5Oku5mZmf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUUADEALAAAAAANAAwAAAZTwJhwSIwhDsUixZEkWhLNYeQVjYUYBIVKSCKeGIOCymCISTATISsCu5RKW1VAkHKBUBDToRxTcUYNGhsdFR8GW0IqJS0ZDyIrh0kqCwBIVR4eTUEAOw==" />
(function() {
var deferred_original = jQuery.Deferred;
jQuery.Deferred = function() {
var callbacks = [];
var callbacks_original = jQuery.Callbacks;
jQuery.Callbacks = function() {
var callback = callbacks_original.apply(this, arguments);
callbacks.push(callback);
return callback;
}
var deferred = deferred_original.apply(this, arguments);
deferred.callbacks = jQuery(callbacks);
jQuery.Callbacks = callbacks_original;
return deferred;
}
})();
// Проверка:
var deferred = $.Deferred();
var callback = function(n) {
console.log('Test ' +n);
}
deferred.progress(callback);
deferred.notify(1);
// Команда ниже успешно удалит обработчик прогресса:
deferred.callbacks.each(function(n, c) { c.remove(callback); });
deferred.notify(2);
$('button:contains("Скачать выбранные")').on('click', function() {
var zip = new JSZip();
var selector = $(this).data('target');
var inputs = $(selector).find('input:checkbox:checked');
if (inputs.length > 0) {
var deferreds = inputs.map(function(n, element) {
return $.Deferred(function(deferred) {
var fileID = $(element).attr('id').replace('download-docs-', '');
$.ajax({
url: filesObj.params[fileID]['SRC'],
type: 'GET',
xhrFields: { responseType: 'blob' },
dataType: 'binary',
success: function(blob) {
blob.name = filesObj.params[fileID]['NAME'];
zip.file(filesObj.params[fileID]['NAME'], blob);
deferred.resolve(blob);
},
error: function(jqxhr, status) {
deferred.reject(jqxhr);
}
});
});
});
$.when.apply(this, deferreds).done(function(blobs) {
zip.generateAsync({ type: 'blob' }).then(function(blob) {
saveAs(blob, 'files.zip');
}, function(err) {
console.log('Не удалось создать архив:', err);
});
}).fail(function(jqxhr) {
console.log('При скачивании файлов произошла ошибка, один из файлов не скачался:', jqxhr);
});
}
});