Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z onchange w input file w ie
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
marrrecki
Witam. MAm problem. zrobiłem sobie funkcję, która po wybraniu jednego pliku poprzez input file tworzy mi w divie kolejny input. wszystko działa pod operą i ff, ale pod ie niestety nie chce.
Oto ta funkcja:
  1. function DodajElement()
  2. {
  3. var element = document.createElement('input');
  4. element.setAttribute('type', 'file');
  5. element.setAttribute('onchange', 'javascript:DodajElement();');
  6.  
  7. var liczba = 0;
  8. var ilosc = document.forms['newsy_edit'].elements.length;
  9. for (var i = 0; i < ilosc; i++ )
  10. {
  11. if (document.forms['newsy_edit'].elements[i].type == 'file')
  12. {
  13. liczba += 1;
  14. }
  15. }
  16.  
  17. element.setAttribute('name', 'file-'+(liczba+1));
  18.  
  19. element.style.display = "block";
  20. element.style.margin= "2px";
  21.  
  22. var div = document.getElementById('dodatkowe');
  23. div.appendChild(element);
  24.  
  25. //alert(element.onchange);
  26.  
  27. document.forms["newsy_edit"].dodatkowe_ilosc.value = liczba;
  28. }


Czy ktoś może mi powiedzieć o co biega?
gekon
Pokaż cały kod.

Edyta.
Nie napisałeś co Ci nie działa. Podejrzewam, że onchange. Zrób to osobnym zdarzeniem.
marrrecki
to jest cała funkcja. Dokładnie pod ie nie reaguje na onchange, ale pod ff i operą jest wszystko cacy. Fukcja DodajElement() wywoływana jest przy body onload() i za każdym razem jak jak wybierzemy jakiś plik przez input file.

W jaki sposób mam to wywołać osobnym zdarzeniem? Tu jest tylko jedno zdarzenie i nie mam jak inaczej się do tego zabrać.
gekon
Bez używania żadnej zewnętrznej biblioteki to możesz pobrać wszystkie inputy z diva #dodatkowe i w pętli zrobić przechwytywanie zdarzenia.

  1. var file-inputs = document.getElementById("dodatkowe").getElementsByTagName("input");
  2.  
  3. for(var i =0; i < file-inputs.length; i++){
  4. file-inputs[i].onchange = function(){
  5. // tu piszesz co ma sie dziac...
  6. }
  7. }


PS. Usuń jeden wpis, bo się zdublowały.
marrrecki
niestety to co podałeś nie chce działać. Może jakieś inne pomysły?
gekon
A pokaż jak to zrobiłeś u siebie.
marrrecki
  1. var filez = document.getElementById("dodatkowe").getElementsByTagName("input");
  2.  
  3. for(var i =0; i < filez.length; i++){
  4. filez[i].onchange = function(){
  5. DodajElement();
  6. }
  7. }

Wstawiałem to zarówno w sekcję head jak i w body. Próbowałem również tak:
  1. var filez = document.getElementById("dodatkowe").getElementsByTagType("file");
  2.  
  3. for(var i =0; i < filez.length; i++){
  4. filez[i].onchange = function(){
  5. DodajElement();
  6. }
  7. }

oraz
  1. var filez = document.getElementById("dodatkowe").getElementsByTagName("input");
  2.  
  3. for(var i =0; i < filez.length; i++){
  4. filez[i].onchange =DodajElement();
  5. }
gekon
To co podałem to JavaScript, nie PHP.
marrrecki
wiem. nie ten taqg w forum zaznaczylem i forum samo dodalo tagi php.
John
dla ie musi być onChange nie onchange :-) i tak samo dla wszystkich ( onClick etc. )
gekon
@marrrecki: Pokaż cały kod.
marrrecki
Korzystam z szablonów smarty, ale te nie mają żadnego wpływu na działanie skryptów. Zastosowałem się do porady @Johna, ale to tez nic nie dało.

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <title>{$lang_TITLE}</title>
  3. <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8">
  4. <meta name="author" content="jetshop">
  5. <meta name="Keywords" content="{$lang_META_KEYWORDS}">
  6. <meta name="description" content="{$lang_META_DESCRIPTION}">
  7. <meta name="robots" content="noodp">
  8. <link rel="shortcut icon" href="templates/{$current_template}/images/favicon.ico">
  9. <link rel="stylesheet" type="text/css" href="templates/{$current_template}/styles/stylesheet.css">
  10. <script language="JavaScript" src="js/overlib_mini.js"></script>
  11. <script language="JavaScript" src="js/kalendarz.js"></script>
  12. {literal}
  13. <script language="javascript" type="text/javascript" src="tinymce/jscripts/tiny_mce/tiny_mce.js"></script>
  14. <script language="javascript" type="text/javascript">
  15. tinyMCE.init({
  16. mode : "textareas",
  17. elements : "ajaxfilemanager",
  18. theme : "advanced",
  19. plugins : "table,advhr,advimage,advlink,flash,paste,fullscreen,noneditable,contextmenu",
  20. theme_advanced_buttons1_add_before : "newdocument,separator",
  21. theme_advanced_buttons1_add : "fontselect,fontsizeselect",
  22. theme_advanced_buttons2_add : "separator,forecolor,backcolor,liststyle",
  23. theme_advanced_buttons2_add_before: "cut,copy,paste,pastetext,pasteword,separator,",
  24. theme_advanced_buttons3_add_before : "tablecontrols,separator",
  25. theme_advanced_buttons3_add : "flash,advhr,separator,fullscreen",
  26. theme_advanced_toolbar_location : "top",
  27. theme_advanced_toolbar_align : "left",
  28. extended_valid_elements : "hr[class|width|size|noshade]",
  29. file_browser_callback : "ajaxfilemanager",
  30. paste_use_dialog : false,
  31. theme_advanced_resizing : true,
  32. theme_advanced_resize_horizontal : true,
  33. apply_source_formatting : true,
  34. force_br_newlines : true,
  35. force_p_newlines : false,
  36. relative_urls : true
  37. });
  38.  
  39. var ajaxfilemanagerurl = "../../plugins/ajaxfilemanager/ajaxfilemanager.php";
  40. function ajaxfilemanager(field_name, url, type, win) {
  41. switch (type) {
  42. case "image":
  43. ajaxfilemanagerurl += "?type=img";
  44. break;
  45. case "media":
  46. ajaxfilemanagerurl += "?type=media";
  47. break;
  48. case "flash": //for older versions of tinymce
  49. ajaxfilemanagerurl += "?type=media";
  50. break;
  51. case "file":
  52. ajaxfilemanagerurl += "?type=files";
  53. break;
  54. default:
  55. return false;
  56. }
  57. var fileBrowserWindow = new Array();
  58. fileBrowserWindow["file"] = ajaxfilemanagerurl;
  59. fileBrowserWindow["title"] = "Ajax File Manager";
  60. fileBrowserWindow["width"] = "782";
  61. fileBrowserWindow["height"] = "440";
  62. fileBrowserWindow["close_previous"] = "no";
  63. tinyMCE.openWindow(fileBrowserWindow, {
  64. window : win,
  65. input : field_name,
  66. resizable : "yes",
  67. inline : "yes",
  68. editor_id : tinyMCE.getWindowArg("editor_id")
  69. });
  70.  
  71. return false;
  72. }
  73. </script>
  74. <script type="text/javascript">
  75. function DodajElement()
  76. {
  77. var element = document.createElement('input');
  78. element.setAttribute('type', 'file');
  79. element.setAttribute('onChange', 'javascript:DodajElement();');
  80.  
  81. var liczba = 0;
  82. var ilosc = document.forms['newsy_edit'].elements.length;
  83. for (var i = 0; i < ilosc; i++ )
  84. {
  85. if (document.forms['newsy_edit'].elements[i].type == 'file')
  86. {
  87. liczba += 1;
  88. }
  89. }
  90.  
  91. element.setAttribute('name', 'file-'+(liczba+1));
  92.  
  93. element.style.display = "block";
  94. element.style.margin= "2px";
  95.  
  96. var div = document.getElementById('dodatkowe');
  97. div.appendChild(element);
  98.  
  99. document.forms["newsy_edit"].dodatkowe_ilosc.value = liczba;
  100. }
  101. </script>
  102. {/literal}
  103. </head>
  104. <body onload="javascript:DodajElement();">


A tak wygląda div o id dodatkowe:
  1. <div id="dodatkowe"><input type="hidden" name="dodatkowe_ilosc"></div>
John
ponownie body onLoad=funkcja()
marrrecki
akurat tutaj to nie ma znaczenia, bo pierwszy element ładuje się bez żadnego problemu przy ładowaniu okna. dopiero następne przy onchange nie chcą (nadal zaznaczam że wszystko pod IE się dzieje)
gekon
@marrrecki:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  3. <title>{$lang_TITLE}</title>
  4. <script type="text/javascript">
  5. function DodajElement(){
  6. var element = document.createElement('input');
  7. element.setAttribute('type', 'file');
  8.  
  9. var liczba = 0;
  10. var ilosc = document.forms['newsy_edit'].elements.length;
  11. for (var i = 0; i < ilosc; i++ ) {
  12. if (document.forms['newsy_edit'].elements[i].type == 'file'){
  13. liczba += 1;
  14. }
  15. }
  16.  
  17. element.setAttribute('name', 'file-'+(liczba+1));
  18.  
  19. element.style.display = "block";
  20. element.style.margin= "2px";
  21.  
  22. var div = document.getElementById('dodatkowe');
  23. var lastInput = div.appendChild(element);
  24.  
  25. document.forms["newsy_edit"].dodatkowe_ilosc.value = liczba;
  26.  
  27. lastInput.onchange = function(){
  28. DodajElement();
  29. }
  30. }
  31. window.onload = function (){
  32. DodajElement();
  33. }
  34. </head>
  35. <form id="newsy_edit" action="#" method="post">
  36. <input type="text" name="dodatkowe_ilosc" />
  37. <div id="dodatkowe">
  38.  
  39. </div>
  40. </form>
  41. </body>
  42. </html>


@John: http://www.w3.org/TR/html401/interact/scripts.html#events - widzisz tu gdzie onLoad? Bo ja tylko onload itd.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.