Браузер Chrome версии 72.0.3626.96 вызывает ошибкунажмите (диалог выбора файла) из функции JavaScript - PullRequest
0 голосов
/ 09 февраля 2019

В Chrome версии 72.0.3626.96 у меня есть простой пример, где я устанавливаю якорь <a> (стилизованный как кнопка с помощью начальной загрузки), а также я устанавливаю <input type="file">.Я скрываю <input type="file">, используя CSS, а затем использую JavaScript, чтобы вызвать диалоговое окно выбора файла при щелчке привязки.

Например:

$('#upload-button').on('click', function(e) {
  if (confirm('Are you sure?')) {
    $('#upload-file').trigger('click');
  }
});
#upload-file {
  display: none;
}
<link href="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<div class="container">
  <div class="row">
    <div class="col">
      <a id="upload-button" class="btn btn-primary">
        <span>Upload Something!</span>
      </a>
      <input type="file" id="upload-file">
    </div>
  </div>  
</div>

То, как это должно работать, заключается в том, что пользователь нажимает кнопку <a>, при этом открывается диалоговое окно подтверждения, а затем пользователь нажимает "OK ", и это открывает диалоговое окно выбора файла.

Это работает в Firefox и в более ранних версиях Chrome, и, как ни странно, оно работает даже в Chrome версии 72.0.3626.96, пока вы нажимаете кнопку" ОК "в сообщении подтверждения достаточно быстро после его открытия.

Ошибка состоит в том, что если вы подождете 2-4 секунды после того, как откроется сообщение подтверждения, а затем нажмете «ОК», оно не откроет диалоговое окно выбора файла.

Есть идеи о том, как заставить это работать?Похоже, это допустимая ошибка в этом выпуске Chrome, которая должна быть отправлена?

ОБНОВЛЕНИЕ: я пришел к выводу, что это, вероятно, как-то связано с обновлениями безопасности для активации пользователя (хотя я не уверенв частности, почему) ... однако, в любом случае, кажется, что в конечном итоге легче и чище заменить старую школу confirm() более современным модальным подходом.Кажется, что нажатие реальной кнопки в модале начальной загрузки всегда работает правильно.

Новый пример здесь:

$('#upload-button').on('click', function() {
  $('#upload-confirm-modal').modal();
});

$('#upload-confirm-button').on('click', function() {
  $('#upload-file').trigger('click');
  $('#upload-confirm-modal').modal('hide');
});
#upload-file {
  display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>

<div class="container">
  <div class="row">
    <div class="col">
      <a id="upload-button" class="btn btn-primary">
        <span>Upload Something!</span>
      </a>
      <input type="file" id="upload-file">
    </div>
  </div>  
</div>

<!-- Modal -->
<div class="modal fade" id="upload-confirm-modal" role="dialog">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-body">
        <h4>Are you sure?</h4>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">No</button>
        <button type="button" class="btn btn-primary" id="upload-confirm-button">Yes</button>
      </div>
    </div>
  </div>
</div>

1 Ответ

0 голосов
/ 01 марта 2019

Команда Chrome решила эту проблему как By Design, отметив, что это было преднамеренное изменение, сделанное для предотвращения слишком долгого сохранения флага активации пользователя. crbug.com / 936505

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...