Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Один я не знал про file.outerHTML=file.outerHTML или грабли? (https://javascript.ru/forum/dom-window/50860-odin-ya-ne-znal-pro-file-outerhtml%3Dfile-outerhtml-ili-grabli.html)

kostyanet 14.10.2014 19:57

Один я не знал про file.outerHTML=file.outerHTML или грабли?
 
Раньше удалял "файл" путем клонирования и удаления кнопки. Ну то есть юзер жмет "удалить" то, что выбрал и еще не загрузил - надо кнопку удалить, ибо валуе-её ридонли. Подумал мож с тех пор что новое появилось, ну а вдруг. Оказалось есть еще более старое

file.outerHTML=file.outerHTML

где file - реф кнопки (элемент).

В оригинале было про inner, я тоже подумал какой там иннер, там одни атрибуты - аутер проканал. Работает. Но как-то не заметно активного применения судя по результатам поиска.

Может оно и не работает?

Octane 14.10.2014 20:18

Как вариант, можно поместить input в новую форму, выполнить form.reset() и вернуть input на место.

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<meta charset="UTF-8">
</head>
<body>
<div>
    <input type="file">
</div>
<button>Reset</button>
<script>
document.querySelector('button').onclick = function () {
    var fakeForm = document.createElement('form'),
        inputFile = document.querySelector('input[type="file"]'),
        inputFileContainer = inputFile.parentNode;

    fakeForm.appendChild(inputFile);
    fakeForm.reset();
    inputFileContainer.appendChild(inputFile);
};
</script>
</body>
</html>

kostyanet 14.10.2014 20:24

Нормально так, да, мощно.

Мотив лезть проверять нет ли новых методов и возник из-за того, что скрипт лежит инлайн и должен быть максимально компактным.

danik.js 14.10.2014 20:26

Незаметно оно потому что outerHTML долго небыло в Firefox'е (до 11 версии, если верить ненавистной тебе MDN)

danik.js 14.10.2014 20:27

Цитата:

Сообщение от kostyanet
скрипт лежит инлайн

Ну ты вася. Выдуманные правила - не повод говнокодить )

danik.js 14.10.2014 20:33

file.parentNode.replaceChild(file.cloneNode(true),file)

file.outerHTML=file.outerHTML


Че, много сэкономил?

Aetae 14.10.2014 21:21

file.value = '';
чем не устраивает?

kostyanet 14.10.2014 21:58

Цитата:

Сообщение от Aetae
чем не устраивает?

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

И еще в том проекте заметил ликвидацию факепатха с комментом что он от Хрома. И до сих пор он там есть. Придется и тут чистить. В другой форме валуи файла передаются на сервер вместе с текстовым полем в котором копии этих имен файлов но сортированные пользователем - с этого поля все и валится в БД, прикольно будет потом попробовать открыть с этого с:\fakepath\somepic.png Каждый браузер просто обязан какую-нибудь какашку подсунуть.

Затупон: теперь-то я беру с files, с API, а там нет факепатхов, поэтому все и работало.

UPD, оказывается это кошерная спецификация показывать именно C:\fakepath\ никаких других букв. В чем глубокий смысл окодемиков w3c.org не пойму.

API наглушняк путь не возвращает, FF в своей проперти только показывает в консоли, а в переменную не выдает. И зачем фак тогда?

kostyanet 14.10.2014 22:14

Цитата:

Сообщение от danik.js
Ну ты вася. Выдуманные правила - не повод говнокодить )

Это императив: в инлайне не писать ничего сложнее а+б=сидели 5 лет.

danik.js 14.10.2014 22:49

Цитата:

Сообщение от kostyanet
ибо валуе-её ридонли

Цитата:

Сообщение от Aetae
file.value = '';

Странное ридонли.. kostyanet у тя обе руки оттуда растут, или только правая?

kostyanet 15.10.2014 12:47

Вам палец покажи - вы руку откусите (я старый рунетовец, и не такое видел) :)


Часовой пояс GMT +3, время: 20:33.