Onchange в attachevent срабатывает не с первого раза.
Вот собственно код
document.getElementById("apslaed").attachEvent("onclick",function() { var newElem = document.createElement("div"); newElem.id = "sizeslide"; newElem.innerHTML = "<form id=\"fileload\" action=\"#\" method=\"post\" enctype=\"multipart/form-data\"><input type=\"file\" name=\"anyfile\" id=\"inpField\"/></form>"; document.body.insertBefore(newElem, document.body.firstChild); document.getElementById("inpField").click(); document.getElementById("inpField").attachEvent("onchange", function(){alert("34343");}); }); Необходимо выполнить функцию после выбора пользователем файла, из динамически созданной формы. Само событие onchange в данном случае работает, если файл выбрать повторно, но все должно происходить сразу. Помогите, пожалуйста, разобраться. |
:) Так проще
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru" dir="ltr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> </head> <body> <div id="apslaed">Клик</div> <script type="text/javascript"> function Onchange(Th){ alert('3434'); alert(Th.value) } document.getElementById("apslaed").attachEvent("onclick",function() { var newElem = document.createElement("div"); newElem.id = "sizeslide"; newElem.innerHTML = "<form id=\"fileload\" action=\"#\" method=\"post\" enctype=\"multipart/form-data\"><input type=\"file\" name=\"anyfile\" id=\"inpField\" onchange=\"Onchange(this)\"/></form>"; document.body.insertBefore(newElem, document.body.firstChild); }); </script> </body> </html> |
Спасибо за ответ, но мне бы хотелось реализовать так, чтобы все события можно было обрабатывать через одну функцию, как это сделано во флеймворках. И соответственно узнать причину о том, почему не работает и найти решение именно через attachevent. Кроме прочего, через attachevent я наверное могу переназначить функцию на данное событие.
|
Еще вот так работает
document.getElementById("inpField").onpropertychange = function(){} Может какое-либо другое событие необходимо использовать в attachEvent, или в чем может быть причина? |
Цитата:
platedz, :) А чем хуже в моём Варианте ? Переопределить просто функцию Onchange(Th) для данного события *Просто к инфе для размышлений |
Цитата:
Вообще в этом плане мне кажется использование addEventListener и attachEvent оказывается не совсем удобно, а в данном случае и вовсе неудобно. Более логичным возможно использовать элемент[событие] = функция. |
Цитата:
Onchange=function (Th) { alert('ИИ'); } |
Цитата:
|
platedz,
Цитата:
if (FirstCreateForm){ var Onchange = function (Th){ alert('3434'); alert(Th.value) } } else { var Onchange=function (Th) { alert('ИИ'); } } Ну или вообще массив по ключу формы |
Спасибо за совет. Вообще я отказался пока от addEventListener и attachEvent. Честно говоря не очень понимаю, зачем они нужны и в чем их преимущество перед On+событие. Может мне кто-нибудь объяснит. Буду крайне признателен.
|
В общем и целом все оказалось не так просто.
При попытке заменить этот код topmenu = (function(window) { return { sub: function(elem,type,block) { try { try { elem.addEventListener(type, block, false); } catch(e) { elem.attachEvent("on"+type, block); } } catch(e){} } } }(window)); на topmenu = (function(window) { return { sub: function(elem,type,block) { elem["on"+type] = block; } } }(window)); elem is undefined Соответственно вопрос. Почему? И как можно решить эту проблему? Также остался вопрос по поводу change в attachevent. Очень надеюсь на Ваши знания и опыт уважаемые специалисты. |
platedz,
<script> topmenu = (function(window) { return { sub: function(elem,type,block) { elem["on"+type] = block; } } }(window)); alert(topmenu.sub.toString()) </script> <script> topmenu = (function(window) { return { sub: function(elem,type,block) { elem["on"+type] = block alert('elem[on'+type+']='+elem["on"+type]) } } }(window)); New_elem=[] topmenu.sub(New_elem,2,3) </script> elem, вводимый в функцию - должен быть заранее определён как массив (или определяйте внутри функции |
Спасибо за ответ. Честно говоря я не очень понял, при чем здесь массив. Вы наверное не верно поняли код. В вашем коде получается, что дожна произойти функция 3, при наступлении события 2, на элементе New_elem.
Вообще проблема была в том, что я возвращал через функцию элемент, что в общем то и должно было вызывать ошибку, учитывая, что элемент отсутствовал. Странно, что когда я не возвращал элемент, а исполнял на него функцию ошибки не происходило. |
Цитата:
elem["on"+type] Это где-то должно быть определено! (или в глобале или внутри функции |
Цитата:
если это не существенно то разницы нет |
Спасибо. В этом случае решил все-таки пока оставить addEventListener.
Жаль, что так и не удалось решить проблему с change в нем. Может кто-нибудь все-таки подскажет ответ. |
Цитата:
elem["on"+type] это тоже самое что и document.getElementById("id")["onclick"] Т.е. это способ обратиться к объекту. Насколько я понимаю, свойство onclick может быть только у объекта, а не у массива. При этом сам по себе объект уже определен как объект, наверное. |
Цитата:
document.getElementById("inpField").click(); document.getElementById("inpField").attachEvent(... местами-сначала назначаем обработчик-потом кликаем хотя если заменить на addEventListener-в хроме работает с первого раза и так Если не будет работать-то возможно проблема в безопасности-они считают что юзер сам должен кликнуть на кнопку-а не програмно это делать |
Часовой пояс GMT +3, время: 00:32. |