Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Закачка файлов JS (https://javascript.ru/forum/misc/6798-zakachka-fajjlov-js.html)

Deller 23.12.2009 15:37

Закачка файлов JS
 
Точнее даже не закачка. Есть поле
<input style="display:none;" type="file" id="id1">
и есть некая ссылка.
<a href="#" onclick="addfoto(); return false;">
Так вот, как сделать чтобы при нажатии на ссылку появлялось окно выбора файла ( как при нажатии кнопки обзор около инпута) и соответственно выбранный файл добавлялся в поле инпут. Буду очень благодарен за подсказку.

x-yuri 23.12.2009 16:19

надо чтобы твой input type="file" был невидимым и под мышкой, когда ты щелкаешь. Т.е. чтобы фактически ты щелкал по невидимому input type="file"

micscr 23.12.2009 17:03

Цитата:

Сообщение от x-yuri (Сообщение 38952)
надо чтобы твой input type="file" был невидимым и под мышкой, когда ты щелкаешь. Т.е. чтобы фактически ты щелкал по невидимому input type="file"

Интересно как невидимый элемент получит событие? Да и контейнером input не является также.

Deller если что-то придумаешь отпиши плиз - интересно. А то я тоже не знаю как такое сделать и можно ли вообще.

Deller 23.12.2009 17:36

все решил. Надо быть проще, мы сами себе жизнь усложняем. Делаем вот так style="opacity:0;" для инпута (невидимость не надо). А ссылку над кнопкой "обзор" инпута.:)

Kolyaj 23.12.2009 18:00

Цитата:

Сообщение от Deller
Делаем вот так style="opacity:0;" для инпута (невидимость не надо).

x-yuri про это и говорил.

Deller 23.12.2009 18:02

Цитата:

Сообщение от Kolyaj (Сообщение 38960)
x-yuri про это и говорил.

Да я понял. просто догадался чуть раньше чем он написал. А потом уже зашел сюда на форум. Но за желание помочь всем респект.

micscr 23.12.2009 18:17

Deller, везде работает? В ИЕ6?

PeaceCoder 23.12.2009 23:07

Цитата:

Сообщение от Deller
А ссылку над кнопкой "обзор" инпута.

Я бы сказал наоборот. Ссылку под инпут. иначе событие получает ссылка а не кнопка. или так работает? такими махимахами не занимался...

Rinas 17.07.2012 02:39

Ваше решение - бред. opacity работает только в CSS3, следовательно этот вариант не кроссбраузерный. Это делается по-другому.
Создается элемент <input type='file' id='file'> и <div></div>. у инпута ставится css свойство display:none. Затем

$("div").click(function(){
$("#file").trigger('click');
});

После этого выбранный файл лежит в форме, которую не видно. вы можете создать кнопку <input type='submit'> или просто отслеживать событие изменения элемента с id='file'. После этого ajax'ом отправлять данные на сервер, для этого есть jquery плагин ajaxForm

плагин

Deff 17.07.2012 03:22

Цитата:

Сообщение от Rinas
у инпута ставится css свойство display:none.

В ИЕ скрытый инпут в форме - недоступен, нун скрывать z-index и position:relative

B@rmaley.e><e 17.07.2012 07:29

Цитата:

Сообщение от Rinas
opacity работает только в CSS3

opacity и его аналоги уже сто лет как поддерживаются всеми браузерами.

А вот Ваше решение — действительно бред. Нельзя программно кликнуть на input[type=file].

<input type="file" id="file" />

<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script>
var file = $('#file');
alert("Let's click of #file…");
file.trigger('click');
alert('Clicked! Value: '  + file.attr('value'))
</script>

devote 17.07.2012 07:41

Rinas,
некропостить обязательно? Ты на год последнего поста смотрел? И все браузеры давно поддерживают opacity, и даже для ишака есть решение, если ты не в курсе, то делается оно очень просто:
style="opacity: 0; filter: Alpha(opacity=0);"

bes 17.07.2012 13:05

В хроме такое прокатывает
<a href="#">
  <label style="cursor: pointer">
    <input type="file" style="display: none">
    link
  </label>
</a>

devote 17.07.2012 13:52

в опере такое прокатывает:
<label style="cursor: pointer">
    <input type="file" style="width:0;height:0;visibility:hidden;position:absolute;">
    link
</label>

bes 17.07.2012 14:00

так везде катит, кроме FF
<label style="cursor: pointer">
    <input type="file" style="position: absolute; left: -200px; top: -200px;">
    link
</label>

devote 17.07.2012 15:03

Цитата:

Сообщение от bes
так везде катит, кроме FF

ну ФФ всегда был капризным к полю типа файл, даже размер input'а не меняется по человечески.

tadjik1 17.07.2012 19:41

<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script>
$(function() {
$('#uploadbtn').click(function(e) {
$('#upload').click();
});
});
</script>

<p><input id="uploadbtn" type="button" value="Select Files"/></p>
<input id="upload" type="file" name="loadfile" style="visibility: hidden; opacity: 0; position: absolute;">

Deff 17.07.2012 19:48

tadjik1,
Туть не кликают программно - а речь о размещении прозрачного input выше видимой, красиво оформленной кнопки,
т.е в итоге кликают все по тому же <input type="file"

tadjik1 17.07.2012 19:50

Deff,
да я уже начал проверять во всём, что установлено просто))

на самом деле мне не нужно поддерживать оперу, довольно редко ИЕ, в основном только последние хром и фф. это кусок, который у меня используется. полый хтмл:

<div class="dropareainner">
		<p class="dropfiletext">Drop files here</p>
		<p>or</p>
		<p><input id="uploadbtn" type="button" value="Select Files"/></p>
		<p>Max size: <%= data.size_limit %>kb</p>
		<!-- extra feature -->
		<p id="err"><!-- error message --></p>
	</div>
	<input id="upload" type="file" name="loadfile">
</div>

bes 17.07.2012 21:21

Ну а что, в FF click() катит.
Так работает везде
<label style="cursor: pointer">
  <input type="file" style="position: absolute; left: -200px; top: -200px;">
  <span onclick="if (navigator.userAgent.indexOf('Firefox') != -1) {this.parentNode.children[0].click();}">
  link</span>
</label>

bes 17.07.2012 21:34

label тоже не нужен
<input type="file" style="position: absolute; left: -200px; top: -200px;">
<span onclick="this.previousSibling.previousSibling.click()">link</span>


Цитата:

Сообщение от B@rmaley.e><e
Нельзя программно кликнуть на input[type=file]

получается можно, tadjik1 прав

Deff 17.07.2012 21:37

bes,
Красиво - но в Опере не проходит ( нун как то привязать наведение мышью

bes 17.07.2012 21:41

Цитата:

Сообщение от Deff
bes,
Красиво - но в Опере не проходит ( нун как то привязать наведение мышью

Проверяю в 12-й, работает

Deff 17.07.2012 21:43

bes,
Зы - уже лучше - в 11.52 - не работает

bes 17.07.2012 21:47

Цитата:

Сообщение от Deff
bes,
Зы - уже лучше - в 11.52 - не работает

А вариант с label?
PS: c оперой почти не работаю, поэтому пока не найду, как запустить её в режиме совместимости (хотя по идее без doctype она и так должна работать в этом режиме)

Deff 17.07.2012 22:08

bes,
Проще установить cтарую версию в какую нидь папку на D или е , указав, при установке, что для одного пользователя

bes 17.07.2012 22:12

Цитата:

Сообщение от Deff
bes,
Проще установить cтарую версию в какую нидь папку на D или е , указав, при установке, что для одного пользователя

А в опере вообще есть нечто наподобие как в IE режимы браузера переключаются (судя по ответу с этим проблемы возникают)

devote 17.07.2012 22:12

Цитата:

Сообщение от bes
label тоже не нужен

Опера 11.64, полет нормальный.

Deff 17.07.2012 22:21

devote,
Походу с 11.6 тады норма.. (Именно оттель трабл с картинками начался

B@rmaley.e><e 17.07.2012 23:56

Цитата:

Сообщение от bes
получается можно, tadjik1 прав

Хм, действительно. Видимо, мои данные устарели, т.к., насколько я помню, ещё несколько лет тому назад программно кликнуть было нельзя.

Deff 17.07.2012 23:58

Цитата:

Сообщение от B@rmaley.e><e
Видимо, мои данные устарели, т.к.,

Хм, это было еще перед новым годом актуально

devote 18.07.2012 00:26

Цитата:

Сообщение от B@rmaley.e><e
Хм, действительно. Видимо, мои данные устарели, т.к., насколько я помню, ещё несколько лет тому назад программно кликнуть было нельзя.

ну дык до сих пор нельзя:
<input id="fl" type="file" style="">
<script>
    document.getElementById('fl').click();
</script>

Можно лишь тогда когда пользователь сделает какое-то действие, клик иль еще чего... то-есть так как это всегда было сделано во флешь.
<input id="fl" type="file" style="">
<script>
    document.onkeydown = function() {
        document.getElementById('fl').click();
    }
</script>

Deff 18.07.2012 00:42

Интересно - а клик с координатами input file - не проходит?

B@rmaley.e><e 18.07.2012 22:54

Цитата:

Сообщение от Deff
Интересно - а клик с координатами input file - не проходит?

Что такое "клик с координатами"?

bes 18.07.2012 23:36

Цитата:

Сообщение от B@rmaley.e><e
Что такое "клик с координатами"?

Если я правильно понял, вопрос в том как вызывать клик, как будто курсор находится в некоторой точке экрана (по сути программно сместить курсор в эту точку и программно кликнуть).
Насколько я знаю, такое пока не провернуть (и скорее всего такого и не будет в целях безопасности), хотя

Dim@ 18.07.2012 23:56

Цитата:

Сообщение от bes (Сообщение 189802)
Если я правильно понял, вопрос в том как вызывать клик, как будто курсор находится в некоторой точке экрана (по сути программно сместить курсор в эту точку и программно кликнуть).
Насколько я знаю, такое пока не провернуть (и скорее всего такого и не будет в целях безопасности), хотя

такое не провернуть :no: , но есть выход
Как можно использовать координаты синтетического события.

vadim5june 19.07.2012 00:00

Цитата:

Сообщение от Dim@ (Сообщение 189805)
такое не провернуть :no: , но есть выход

ничего не выйдет-клик тоже синтетический

Однако, стоит помнить следующее:
«Ручной» запуск (генерация) события не создает по умолчанию действие, связанное с этим событием. Например, программная генерирация события focus на элементе не означает, он получит фокус, вручную сгенерированное событие submit не заставит форму отправить данные (следует использовать метод submit формы), сгенерированное событие нажатия клавиши не означает, что символ появится в поле ввода, программное нажание на ссылку не активирует переход по ней, и т. д. Такие ограничения необходимы в целях безопасности и предотвращения сценариев имитации работы пользователя и взаимодействия с браузером

http://habrahabr.ru/post/114244/

Dim@ 19.07.2012 10:45

vadim5june,
да ну, правда что ле ?

bes 19.07.2012 11:55

Цитата:

Сообщение от Dim@
такое не провернуть , но есть выход
Как можно использовать координаты синтетического события.

Dim@, можно простой пример, как это удалось применить


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