Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   свой метод click() (https://javascript.ru/forum/dom-window/39684-svojj-metod-click.html)

zzzzzz 08.07.2013 11:30

свой метод click()
 
Здравствуйте
<input type="file" id="fileElem" multiple accept="image/*" style="display:none" onchange="handleFiles(this.files)">
<a href="#" id="fileSelect">Select some files</a>

При клике на ссылку fileSelect запускаю функцию а в ней document.getElementById("fileElem").click(); что с свою очередь эмитирует нажатие на input с типом file.
Все это для того чтобы скрыть некрасивую форму загрузки файлов.

У jquery есть метод click(). Как на чистом js написать этот метод и что мне для этого нужно

делал так
document.getElementById("fileElem").onclick;

но не выходит, да и мыслей никаких нет

skrudjmakdak 08.07.2013 11:53

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

zzzzzz 08.07.2013 12:00

skrudjmakdak спасибо, но в моем случае input один а красивых кнопочек будет n-количество(попап окна)

Да и для расширения кругозора хочу научиться писать свой метод клик

skrudjmakdak 08.07.2013 12:06

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

skrudjmakdak 08.07.2013 12:12

вот, даже extjs так делает, как я сказал))
http://docs.sencha.com/extjs/4.1.3/e...le-upload.html

zzzzzz 08.07.2013 12:16

Может подскажите в какую сторону хоть копать, я не знаю даже с чего ночать.

А на счет кроссбраузерности, если не ошибаюсь реализация на jquery кроссбраузерна

skrudjmakdak 08.07.2013 12:27

вот, набросал
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<style type="text/css">
.input_file
{
position: relative;
width: 200px;
height: 30px;
}

.text
{
position: absolute;
top: 0px;
left: 0px;
width: 130px;
height: 24px;
}

.button
{
position: absolute;
top: 0px;
right: 0px;
width: 60px;
height: 30px;
}

.file
{
height: 30px;
width: 200px;
position: absolute;
top: 0px;
left: 0px;
filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);
-moz-opacity: 0;
-khtml-opacity: 0;
opacity: 0; 
}
		</style>
	</head>
	<body>
		<form method="post" action="/login.php">
			<div class="input_file">
				<input type="text" class="text">
				<div class="button">выбрать</div>
				<input type="file" class="file">
			</div>
		</form>
	</body>
</html>

zzzzzz 08.07.2013 12:34

а как свой click() написать не подскажите? хоть что нибудь от чего можно оттолкнуться

danik.js 08.07.2013 12:41

Цитата:

Сообщение от zzzzzz
А на счет кроссбраузерности, если не ошибаюсь реализация на jquery кроссбраузерна

Причем тут jQuery? Вызов метода .click() кнопки не приводит к открытию диалогового окна в некоторых браузерах (не помню каких).

ruslan_mart 08.07.2013 15:01

input[type="file"] {
   position: absolute;
   visibility: hidden;
   z-index: -100;
}


<div>
   <input type="file" />
   <input onclick="fileLoad(this)" type="button" value="Загрузить файл" />
</div>


function fileLoad(a) {
   a.parentNode.getElementsByTagName('input')[0].click();
}

zzzzzz 08.07.2013 17:29

Ruslan, вышеописанное вами я уже реализовал давно, а вот недавно отказался от jquery и переписал практически все на "чистый" js, только вот метод click() не могу свой написать, в этом и загвоздка

skrudjmakdak 08.07.2013 17:32

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

vadim5june 08.07.2013 17:35

Цитата:

Сообщение от zzzzzz
У jquery есть метод click(). Как на чистом js написать этот метод и что мне для этого нужно

Помоему и jquery нельзя этим методом кликнуть на input-file

Deff 08.07.2013 17:39

Цитата:

Сообщение от vadim5june
Помоему и jquery нельзя этим методом кликнуть на input-file

vadim5june,
Вродь onchange работает... И cмысл кликать на него ?
<style>span,input:hover{cursor:pointer}</style>
<span onclick="alert('A')" style="background:url(http://javascript.ru/forum/images/editor/insertimage.gif) no-repeat 140px center;"><input type=file style="opacity:0"></span>

vadim5june 08.07.2013 17:43

Цитата:

Сообщение от Deff
vadim5june,
Вродь onchange работает... B cмысл кликать на него ?

Я так понял что програмно кликнуть методом click хотят
$(inputFile).click()

Deff 08.07.2013 17:54

vadim5june,
Да вродь смысла особого нет, все одно - окно должно открыться - значит событие от пользователя,
типично всё это нужно для костомизации инпута

vadim5june 08.07.2013 17:59

Цитата:

Сообщение от Deff
типично всё это нужно для костомизации инпута

может я не понял что имелось ввиду
Цитата:

Сообщение от zzzzzz
При клике на ссылку fileSelect запускаю функцию а в ней document.getElementById("fileElem").click(); что с свою очередь эмитирует нажатие на input с типом file.
Все это для того чтобы скрыть некрасивую форму загрузки файлов.


Deff 08.07.2013 18:06

vadim5june,
Да все извраты, чтобы свой инпут оформить, кликнуть по нему, а тот передаст клик настоящему
Точно так же, можно упразрачнить текущий, и клик по нему , сделать видимым - якобы клика по своему, а событие клика - отслеживается идентично,

vadim5june 08.07.2013 18:07

Цитата:

Сообщение от Deff
Да все извраты, чтобы свой инпут оформить, кликнуть по нему, а тот передаст клик настоящему

понятно

zzzzzz 08.07.2013 20:51

Это не извраты это мозилла советует https://developer.mozilla.org/en-US/...b_applications см. раздел "Using hidden file input elements using the click() method"

Мне уже сказали что это не кроссбраузерно но я все же хочу покопаться в этом, хуже не будет

Ребят каждый ваш вариант правильный, но все же мне хочется научиться делать такое хоть даже не кроссбр-но, я не могу просто пройти мимо и забить, так не могу, поэтому прошу пояснить логику этого метода click() от jq и перечислить встроенные методы js которые могут понадобится, мне бы толчок, а то не знаю даже как начать

danik.js 08.07.2013 21:08

Хм, оказыается вариант с click() довольно таки кроссбраузерный.
http://stackoverflow.com/a/8924420
Не работает в Firefox до 4 версии, что слегка расстраивает. Также непонятно работает ли это в мобильных браузерах.

zzzzzz 08.07.2013 23:22

В чем преимущество варианта реализации от мозилла на примере моего проекта. Есть возможность создавать попап окна, и у каждого окна есть кнопка загрузить, если придерживаться вашего метода придется при каждом вывозе попап каждому окну создавать скрытый инпут и красивенькую кнопку. В моей же реализации input будет один и грузится с основной страницей, а красивенькая кнопка у попап окна вызывает тот самый один инпут а не n-ое его количество

Deff 08.07.2013 23:41

zzzzzz,
:) В принципе, отправка FormData автоматически вызывает диалоговое окно загрузки файлов, при наличии input File в отправляемой форме

zzzzzz 08.07.2013 23:43

я писал про количество input с типом file, не хочу их плодить поэтому реализация мозилла мне подошла

Deff 08.07.2013 23:51

zzzzzz,
Если отправлять FormData, у Вас реальных инпутов - может и вообще не быть, а заполняться через скрипт Вашими методами, а включение в FormData input File, вызовет перед отправкой - диалоговое окно, а отправить форму через FormData можно чисто программно, или по вашему клику

danik.js 09.07.2013 04:30

Deff, а можешь пример накидать?
zzzzzz, при желании можно один и тот же инпут накладывать на целую кучу кнопок по событиям mouseover и focus

Deff 09.07.2013 05:42

Цитата:

Сообщение от danik.js
zzzzzz, при желании можно один и тот же инпут накладывать на целую кучу кнопок по событиям mouseover и focus

Опять жа, не во всех браузерах можно потом вставить этот input File в форму, ежли только опять FormDatой
Цитата:

Сообщение от danik.js
Deff, а можешь пример накидать?

Не а, - недосуг, тут типо отвлекалки от собственных задач

danik.js 09.07.2013 08:47

Цитата:

Сообщение от Deff
Опять жа, не во всех браузерах можно потом вставить этот input File в форму, ежли только опять FormDatой

В webkit инпут прекрасно перемещается по DOM-дереву не теряя выбранный файл. А где-то это не проканает?

skrudjmakdak 09.07.2013 09:27

Цитата:

Сообщение от danik.js (Сообщение 261232)
Deff, а можешь пример накидать?

вы про это?
var r= document.createElement('input');
r.type = 'file';
r.click();

zzzzzz 12.07.2013 20:30

РЕШЕНО. Кому нужно копайте в сторону dispatchEvent

http://stackoverflow.com/questions/2...-dispatchevent
http://habrahabr.ru/qa/17222/
http://stackoverflow.com/questions/2...-dispatchevent
http://help.dottoro.com/ljrinokx.php

danik.js 12.07.2013 21:29

И чем это поможет? Напиши в кратце какую проблему решает dispatchEvent и в чем отличе от click()


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