2016-09-13 3 views
2

Я работаю над проектом, где у нас есть вызов AJAX, который отвечает блоком, содержащим файл excel. Я хочу, чтобы код открывал файл в качестве загрузки, когда я получаю ответ. Вот обратный вызов:Firefox a.click не срабатывает без точки останова

var blob = new Blob([response.data], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}); 
var objectUrl = URL.createObjectURL(blob); 
var a = document.createElement("a"); 
var header = response.headers("Content-Disposition"); 
a.download = header.substring(header.indexOf("filename=") + "filename=".length); 
a.href = objectUrl; 
document.body.appendChild(a); 
console.debug("Clicking a tag"); 
a.click(); 
document.body.removeChild(a); 
window.URL.revokeObjectURL(objectUrl); 

Этот код прекрасно работает в хром, но в Firefox ничего не происходит, когда a.click() пожаров. Отчет отладки печатается, поэтому я знаю, что обратный вызов происходит. Кроме того, по какой-то причине, если я поставил точку останова на a.click(), он отлично работает.

Может кто-нибудь объяснить, почему клик работает только в режиме отладки?

ответ

2

У Firefox есть пара мер предосторожности или просто странное поведение вокруг таких вещей. Я не знаю, вывод, но получая обратно в браузер на мгновение, прежде чем делать щелчок, как правило, очищает его:

// ... 
a.href = objectUrl; 
document.body.appendChild(a); 
setTimeout(function() { 
    a.click(); 
    document.body.removeChild(a); 
    window.URL.revokeObjectURL(objectUrl); 
}, 0); 
// ... 

Обратите внимание, что код, следующий за setTimeout будет работать перед тем содержание setTimeout делает ,

Вы не могли бы даже нужно два:

// ... 
a.href = objectUrl; 
document.body.appendChild(a); 
setTimeout(function() { 
    a.click(); 
    setTimeout(function() { 
     document.body.removeChild(a); 
     window.URL.revokeObjectURL(objectUrl); 
    }, 0); 
}, 0); 
// ... 
+0

Нет кости. Я просто попробовал это без каких-либо результатов. – user2752635

+0

@ user2752635: Возможно, я ошибаюсь, вам может понадобиться * после * щелчка. Я добавил пример с ним в обоих местах выше. Я также помню что-то в Firefox около года назад, когда тайм-аут '0' не работал, но тайм-аут' 10' не делал этого. (В этот момент я решил переосмыслить весь свой подход, так как мне было неудобно ... :-)) –

+1

Это исправляет проблему для меня. Мне не нравится иметь 'setTimeout (fn, 0)' в моем коде (особенно вложенном), но если он работает, он работает. – user2752635