Вход

Просмотр полной версии : полю input c type="file" присвоить значение по умолчанию


Julia1991
14.08.2018, 14:28
Помогите, нужно в форме обратной связи полю input c type="file" присвоить значение по умолчанию. Если вдруг пользователь картинку не загрузил, то так как поле не обязательное по умолчанию, то чтоб было значение по умолчанию. Вариант value="Значение" не работает. Может подскажите как можно скриптом назначить значение по умолчанию? А то если поле пустое отправляется на сервер, то не срабатывает вся форма. Такие правила в последних версиях сафари

laimas
14.08.2018, 14:47
Никак, этому полю произвольный путь указать нельзя, да и что значит "по умолчанию"?

Aetae
14.08.2018, 14:49
Очевидно, что правильное решение - поправить кривую серверную часть.

Но если костылить, то можно сдалать как-то так:<input type="file" onchange="this.name=hidden_file.name; hidden_file.parentNode.removeChild(hidden_file); this.removeAttribute('onchange');">
<input type="hidden" name="file_field_name" id="hidden_file" value="no file"> Т.е. если файл не выбран - значение для отправки берётся из скрытого поля.

Julia1991
14.08.2018, 14:51
Помогите написать костыль под этот инпут <input name="file[]" type="file" id="fileElem2" multiple accept="image/*" onchange="handleFiles2(this.files)">

Aetae
14.08.2018, 14:56
<input type="file" id="fileElem2" multiple accept="image/*" onchange="
name = fileElemFake.name; //устанавливаем name - для передачи на сервер
fileElemFake.parentNode.removeChild(fileElemFake); //удаляем скрытое поле
handleFiles2(this.files) //вызываем обработчик файлов
">
<input type="hidden" name="file[]" id="fileElemFake" value="no file">

laimas
14.08.2018, 14:56
Julia1991,
какой костыль? Если у вас РНР, то POST данные и файлы берутся из разных массивов. Логику серверного скрипта нужно править, а не костыли писать.

laimas
14.08.2018, 14:57
Aetae,
не получится так на сервере.

Aetae
14.08.2018, 15:00
laimas, хм, да, хотя кто знает какая у них там логика на сервере. Зачастую всё сваливают в одну кучу вручную всё равно.)
Ну, в край - можно преписать отправку через ajax и там уж можно что хошь.

laimas
14.08.2018, 15:02
кто знает какая у них там логика на сервере. Зачастую всё сваливают в одну кучу вручную всё равно.

Да не важно, логику на сервере то в любом случае бы править пришлось, так зачем же городить несуразицу, если сразу сделать нормально. Тем более, пустой поле, это не есть трагедия, нужно лишь грамотно обработать условия.

Julia1991
14.08.2018, 15:03
Подскажите тогда условие, чтоб если на сайт вошли через сафари 11 версии и больше, поле input type="file" было обязательным для выполнения (required), с остальных отображалось не обязательным

laimas
14.08.2018, 15:07
Это делается на стороне клиента, но серверу то тоже нужно это проверять, иначе обмануть как два пальца...
То есть сервер должен проверять под каким браузером вход, соответственно и наличие файла присланного, соответственно реагируя.

Julia1991
14.08.2018, 15:12
Как это реализовать? я нашла такой скрипт для iphone

if(window.navigator.userAgent.match(/iP(hone|od|ad)/)){
$('.type:file').setAttribute('required','');
}

laimas
14.08.2018, 15:17
А что если lXxxx, то это обязательно сафари 11?


$('.type:file').setAttribute('required','');

$('.type:file').prop('required', true);

Julia1991
14.08.2018, 15:19
Скрипт правильный?

laimas
14.08.2018, 15:21
Скрипт правильный?

В плане определения агента, если это вас устраивает, то да, только уж коли JQ, то сразу так как исправлено.

Julia1991
14.08.2018, 15:22
Подскажите, как все же написать условие для ios 11.3 и выше?

laimas
14.08.2018, 15:24
Так для ios 11.3 или сафари 11?

Julia1991
14.08.2018, 15:28
Проблема в том что письма не отправляются только с операционных систем MacOS и IOS. А точнее из браузера Safari версии 11.1 и выше (на iOS начиная с версии 11.3) Вот и думаю как лучше прописать условие, для браузера или для операционной системы?

Nexus
14.08.2018, 15:35
Проблема в том что письма не отправляются только с операционных систем MacOS и IOS
В чем сложность дебага под macOS?
Возьмите мак, откройте в сафари ваш сайт, потыкайте в форму, чтобы она сломалась и откройте консоль в devtools.

Julia1991
14.08.2018, 15:39
Эта проблема не решаемая. Письма не отправляются только с операционных систем MacOS и IOS. А точнее из браузера Safari версии 11.1 и выше (на iOS начиная с версии 11.3). И при условии, если в форме обратной связи предусмотрено прикрепление файла.

Если пользователь не прикрепил никакого файла к сообщению, то браузер блокирует ajax запрос.

laimas
14.08.2018, 15:39
Письмо, я так полагаю, будет отправлять сервер ваш, а не iOS, коли речь идет о веб приложении. Браузер только форму отправляет серверу. Получается, что не может отправить файл. Если так, то нужно рег. выражением проверять версию ОС. Свойство window.navigator.userAgent может содержать номер версии ОС, а вот выдается ли она iOS сказать не могу. Выведите ее в консоль и приверьте, если у вас есть "яблоко".

laimas
14.08.2018, 15:40
Если пользователь не прикрепил никакого файла к сообщению, то браузер блокирует ajax запрос.

Причем тут браузер, если это сугубо скрипта задача?

Julia1991
14.08.2018, 15:41
"Яблока" нет(

laimas
14.08.2018, 15:43
"Яблока" нет(


Я тоже ем груши. Напрягите гугл по данному вопросу, думаю в сети примеры этого есть.

Aetae
14.08.2018, 15:44
0_о, т.е. форма у вас отправляется ajax'ом?
Очевидно проблема в говнокоде внутри этой самой отправки ajax'ом. Почти наверняка в сафари падает с ошибкой, которую лекго отдебажить. Ничто нам не может "блокироваться".

Nexus
14.08.2018, 15:45
Причем тут браузер, если это сугубо скрипта задача?
<form id="form">
<input type="text" required name="some-name"/>
<input type="submit"/>
</form>
<script>
document.getElementById('form').onsubmit=function( ){
alert('Send request');
};
</script>

Aetae
14.08.2018, 15:48
Основная проблема отсутствие сафари, понятно. Вы можете попростить того, кто об этом сообщил прислать скриншот консоли. Или воспользоваться сервисами типа browserstack.com (https://www.browserstack.com/.).

laimas
14.08.2018, 15:49
Nexus,
и к чему это? Если required, то выбрасываем, браузер то причем тут? Сафари под "вин", хоть и понимает это, но как-то по-боку. Ну так и не браузер же определяет эти атрибуты, действия скриптов и т.п.

Julia1991
14.08.2018, 15:49
Вот обычная рабочая форма http://1292378.rhino17.web.hosting-test.net/

Julia1991
14.08.2018, 15:50
Вот статья про проблему в браузерах https://yanakhodkina.com/ne-rabotaet-contact-form-7-ne-otpravlyaet-pisma/

Nexus
14.08.2018, 15:53
laimas, это к тому, что браузер таки может блокировать отправку запроса.

laimas
14.08.2018, 15:54
Так у вас плагин готовый, в котором обнаружена проблема. Ну так решение же написано или у вас иная платформа на сервере и потому не подходит?

laimas
14.08.2018, 15:55
это к тому, что браузер таки может блокировать отправку запрос

Ну да, причем по собственной инициативе? :)

Julia1991
14.08.2018, 16:01
У меня не плагин. Вот моя форма http://1292378.rhino17.web.hosting-test.net/ сделанная вручную

laimas
14.08.2018, 16:01
Nexus,
по ссылке написано, что это якобы баг браузера. Не знаю, может быть, но уж очень странный если не аляпистый баг, во что с трудом верится. Но я не яблочник, проверить не могу )

Julia1991
14.08.2018, 16:03
Подскажите скрипт, допустим если сафари 11.1 и выше, то поле type="file становится required

Julia1991
14.08.2018, 16:03
Так?
if(user.browser.name === 'Safari11.1 +'){
$('.type:file').setAttribute('required','');
}

laimas
14.08.2018, 16:04
У меня не плагин.

То есть получается, что действительно правда и с пустым полем именно file не отправляет, а другие любые могут быть пусты?

Julia1991
14.08.2018, 16:04
Да, другие поля могут быть пустыми

Nexus
14.08.2018, 16:05
Ну да, причем по собственной инициативе?
Не совсем, но если от балды понаставлять атрибутов, то потом можно удивляться отсутствию события submit.

Julia1991
14.08.2018, 16:07
Если форма имеет поле для загрузки файлов, то, если оно пустое, форма не отправится на сервер! Это в Safari версии 11.1 и выше. Баг такой

Julia1991
14.08.2018, 16:10
Написала скрипт для хрома, чтоб тестировать if(user.browser.family === 'Chrome'){
$('.type:file').setAttribute('required','');
} но он не работает

Alexandroppolus
14.08.2018, 16:11
я так понимаю, продолжение темы https://javascript.ru/forum/css-html-browser/74874-dannye-iz-formy-ne-otpravlyayutsya-esli-ne-zagruzhena-kartinka.html :)

надо смотреть, почему на сервере неправильно что-то работает

Julia1991
14.08.2018, 16:11
И так не работает if(user.browser.family === 'Chrome'){
$('.type:file').prop('required', true);
}

Aetae
14.08.2018, 16:11
laimas, судя по "решению" - уровень писавшего невелик, так что ставлю на глюк в плагине.

Julia1991, сейчас проверил с айфона - пишет "Данные отправлены", так что хз в чём вообще проблема.)

Julia1991
14.08.2018, 16:12
Это не плагин!

Julia1991
14.08.2018, 16:13
Работаетс айфона 5! Там версия браузера старая!

Nexus
14.08.2018, 16:13
Это в Safari версии 11.1 и выше. Баг такой
Думаю это баг плагина валидации, а не браузера.
Почему не удалить багнутый плагин и не написать свою валидацию на клиенте?

Julia1991
14.08.2018, 16:14
Меня интересует этот скрипт if(user.browser.family === 'Chrome'){
$('.type:file').prop('required', true);
}
почему он не работает?

laimas
14.08.2018, 16:14
Julia1991,
нужно анализировать navigator.userAgent. Нет у меня яблок чтобы проверить все и вся, я также могу только из сети почерпнуть:

https://gist.github.com/selkie-snippet/6454049

Судя по возвращаемым строкам в нем есть ОС и ее версия, а также о браузере. Что именно для версии ОС/браузера вами желаемого будет в ней я сказать не могу.

PS. Кстати, если детектируется проблемный браузер, то проще удалить поле из формы, а не заставлять пользователя грузить файл, если это ему не нужно.

Julia1991
14.08.2018, 16:14
10 й раз повторяю, эта форма сделана не с помощью плагина!

Aetae
14.08.2018, 16:20
Да мы поняли.
А у вас точно есть проблема то?))

Вообще от противного давайте, удалим перед отправкой все пустые файлы в форме:document.addEventListener('submit', function(event){
[].forEach.call(
event.target.querySelectorAll('input[type="file"]'),
function(input){
if(input.files.length === 0)
input.parentNode.removeChild(input);
}
);
}, true); :)

Nexus
14.08.2018, 16:22
10 й раз повторяю, эта форма сделана не с помощью плагина!
То ли я дурак, то ли лыжи не едут.
На этой страничке (view-source:http://1292378.rhino17.web.hosting-test.net/) подключено только jq, jquery.validate и ваш скрипт "multiengine", в котором используется jquery.validate с отправкой асинхронного запроса.
Вопрос: как "не с помощью плагина", если таки с его помощью?

Julia1991
14.08.2018, 16:26
Плагин даже не установлен на cms. Форма на ajax и php

laimas
14.08.2018, 16:28
Julia1991,
вот это надо получить

Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3

Что там будет для проблемной версии я не в курсе. Но получив это, просто удалить поле file из формы.

Nexus
14.08.2018, 16:33
Плагин даже не установлен на cms
Тем не менее отправка формы идет только через "jquery.validate".
Если все поля могут быть пустыми, то зачем вообще предварительная валидация?
Не исключено, что jquery.validate просто неправильно что-то обрабатывает.

Если ошибка действительно в браузере, то форма с пустым полем "file" должна не отправляться даже с отключенным javascript.

Julia1991
14.08.2018, 16:50
Этот скрипт помог, спасибо Вам большое!