У меня проблема с JavaScript, который не работает так, как я ожидаю в Safari.Все работает, как и ожидалось в IE 11, Edge, Chrome и Firefox.Safari - единственный причудливый.
Мой пример использования следующий:
- Пользователю должен быть предоставлен файл для загрузки
- Может потребоваться сервернекоторое время для создания файла
- Сервер отправляет файл с заголовком Content-Disposition и соответствующим типом MIME
- . Пользователь должен быть перенаправлен на другую страницу после загрузки файла
- Предпочтительно я не хочу менять серверную часть
Мое текущее решение выглядит следующим образом:
<button id="btn1" onClick="send(this, 'testfile');">Download</button>
<script>
console.log("Loading page");
var oReq = new XMLHttpRequest();
oReq.onload = function(oEvent) {
console.log(this)
var header = oReq.getResponseHeader('Content-Disposition')
if(header === null) {
// do some error handling here...
} else {
var startIndex = header.indexOf("filename=") + 10; // Adjust '+ 10' if filename is not the right one.
var endIndex = header.length - 1; //Check if '- 1' is necessary
var filename = header.substring(startIndex, endIndex);
var blob = this.response;
var blobUrl = window.URL.createObjectURL(new Blob([blob], {type: blob.type}));
var a = document.createElement("a");
var currentLoc = window.location
if(a.download !== undefined){
// works in Chrome and Firefox
console.log(blob);
document.body.appendChild(a);
a.style = "display: none";
a.href = blobUrl;
a.download = filename ;
a.onclick = function() {
window.location = currentLoc;
};
a.click();
} else if(navigator.msSaveBlob !== undefined) {
// Works in IE
navigator.msSaveBlob(blob, filename);
window.location = currentLock;
}
}
};
function send(btn, fil) {
btn.disabled = true
oReq.open("GET", "/"+fil, true);
oReq.responseType = "blob";
console.log("Clicked button!")
oReq.send()
}
</script>
Первая проблема, с которой я столкнулся, заключалась в том, что Safari вообще не загружал файл,Я исправил это, отложив перенаправление страницы на событие onclick привязки загрузки.Однако теперь Safari отказывается от перенаправления.Я могу это исправить, добавив setTimeout вокруг перенаправления, но я хотел бы понять, почему это происходит, и избежать setTimeout.
Тайм-ауты имеют тенденцию работать, пока они по какой-то причине не установлены слишком низкими и, следовательно, неРабота.Поэтому я стараюсь, чтобы избежать их, если это возможно.
1023 * Кто-нибудь есть какие-либо идеи, почему Safari упорно отказывается обрабатывать задание местоположения, а все остальные браузеры действуют хорошо?