menschmeyer: "Datei hochladen" mit individuellem "Durchsuchen"-Button

Hallo!

Ich hoffe ich bin hier richtig. Also bitte nicht böse sein wenn dem nicht so ist.

Ich habe einen Bilder-Upload für meine Seite gebastelt. Nun wollte ich das Ganze
auch noch ein bißchen an den Stil der Seite anpassen - klappt aber nicht:

Quellcode:

<form enctype="multipart/form-data" action="test.html" method="POST">  
<input type="hidden" name="MAX\_FILE\_SIZE" value="100000">  
Neues Bild hochladen:  
<input name="uploadedfile" size="53" type="file">  
<input type="image" border="0" value="aendern" src="picture.gif">  
</form>  

Den Button "Datei hochladen" konnte ich ohne Probleme an mein Design anpassen und
mit einem Bild versehen - an den Buttton "Durchsuchen" komme ich aber nicht heran.
Ich habe auch noch auf keiner Seite einen solchen angepassten Button gesehen.
Geht das denn überhaupt?

Vielen Dank für Eure Hilfe!!!

  1. Hallo menschmeyer.

    Ich habe auch noch auf keiner Seite einen solchen angepassten Button gesehen.
    Geht das denn überhaupt?

    Kurz und bündig: nein.

    Einen schönen Montag noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. moin Ashura :)

      Kurz und bündig: nein.

      najaaa.... mit viel viel viel rumtricksen und Javascript geht das schon... Ich habs zumindest gemacht ;)

      liebe Grüße aus Berlin
      lina-

      --
      Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
      1. Moin,

        najaaa.... mit viel viel viel rumtricksen und Javascript geht das schon... Ich habs zumindest gemacht ;)

        das möchtest du uns nicht zufällig mal zeigen wie das geht?

        MfG
        Rouven

        --
        -------------------
        ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
        1. moin Rouven :)

          Moin,

          najaaa.... mit viel viel viel rumtricksen und Javascript geht das schon... Ich habs zumindest gemacht ;)
          das möchtest du uns nicht zufällig mal zeigen wie das geht?

          eigentlich ungern, weil das ne echte Frickelei ist ;)

          Und überhaupt ist davon abzuraten.... weil ja nicht immer (in meinem Fall schon) gewährleistet ist, dass die User Javascript aktiviert haben - und ohne funktioniert meine Lösung nun mal nicht.

          Aber hier (zur Info) sind die schnipsel:

          Javascript:

            
          var  contextpath="<%= request.getContextPath() %>";  
          var removeId=0;  
          var ia;  
          var ir;  
          var file;  
          function mouseOutFile() {  
           if (file.value != "") {  
            handleFileInputs();  
           }  
          }  
          function preLoadImg(){  
           ia = document.createElement('img');  
           ia.className='icon';  
           ia.src="<%=request.getContextPath()%>/img/add.gif"  
           ia.border='0';  
           ir = document.createElement('img');  
           ir.src="<%=request.getContextPath()%>/img/remove.gif"  
           ir.border="0";  
          }  
          /*Elemente erstellen, Abhängigkeiten festlegen*/  
          function handleFileInputs() {  
           if (document.forms[0] == null) return;  
           if (!document.createElement || !document.getElementsByTagName) return;  
           var fakeFileUpload = document.createElement('div');  
           fakeFileUpload.className = 'fakefile';  
           var add = document.createElement('a');  
           add.className = 'add';  
           addText = '<bean:message key="folder.view.upload.add" />';  
           add.appendChild(ia.cloneNode(true));  
           add.appendChild(document.createTextNode(addText));  
             var input = document.createElement('input');  
           input.className = 'file';  
           iname = "file(" + document.forms[0].elements.length + ")";  
            
           if (document.all) {  
               input.type = 'file';  
               input.size='1';  
               input.name = iname;  
               input.id = iname;  
            } else if (document.getElementById) {  
               input.setAttribute('type', 'file');  
               input.setAttribute('name', iname);  
                input.setAttribute('id', iname);  
               input.setAttribute('size', 1);  
             }  
           file = input;  
           fakeInput = document.createElement('input');  
           fakeInput.name="fake";  
           fakeInput.className="notvisible";  
           var remove = document.createElement('a');  
           removeText = '<bean:message key="folder.view.upload.remove" />';  
           remove.className = "remove";  
           remove.id="remove_"+removeId;  
           removeId++;  
           remove.appendChild(ir.cloneNode(true));  
           remove.appendChild(document.createTextNode(removeText));  
           fakeFileUpload.appendChild(add);  
             fakeFileUpload.appendChild(input);  
           fakeFileUpload.appendChild(fakeInput);  
           fakeFileUpload.appendChild(remove);  
           cont = document.getElementById('inputContainer');  
             if (cont != null) {  
              cont.appendChild(fakeFileUpload);  
             }  
           var x = document.getElementsByTagName('input');  
           for (var i=0;i<x.length;i++) {  
            if (x[i].type != 'file') continue;  
            if (x[i].parentNode.className != 'fakefile') continue;  
            if (x[i].relatedElement!= null){  
             var el=x[i].relatedElement;  
             x[i].style.display="none";  
             el.style.display="inline";  
             el.value=x[i].value;  
             el.readOnly=true;  
             el.relatedElement.style.display="inline";  
             el.relatedElement.href="javascript:remove(\""+el.relatedElement.id+"\")";  
             }  
           }  
           input.relatedElement = fakeInput;  
           input.relatedElement.relatedElement = remove;  
           input.setAttribute('onchange', 'handleFileInputs()');  
           input.onchange = handleFileInputs;  
          }  
          function remove(name) {  
           element = document.getElementById(name);  
           if (element != null){  
            eparent = element.parentNode;  
            eparent.parentNode.removeChild(eparent);  
           }  
          }  
          
          

          CSS beispielhaft für Mozilla (für andere Browser ist es ähnlich - nur verschieben sich die "left"-Angaben):

            
          /******************fileupload *****************/  
          div.fakefile {  
           padding:0;  
           margin:0;  
          }  
          img.icon {  
           vertical-align:bottom;  
          }  
          .add {  
           left:-3px;  
           position:relative;  
           z-index:0;  
          }  
          input.file {  
              left:-100px;  
           height:15px;  
           position: relative;  
           z-index:2;  
           -moz-opacity:0 ;  
           filter:alpha(opacity: 0);  
           opacity: 0;  
          }  
          input.notvisible{  
              display:inline;  
              left:-74px;  
           width:150px;  
           z-index:4;  
           position: relative;  
           display:none;  
          }  
          .remove {  
           position:relative;  
           left:-74px;  
           text-align:left;  
           display:none;  
          }  
          /******************fileupload ende *****************/  
          
          

          Die Html-Seite (auszugsweise):

            
          <body id="body" onload="preLoadImg();handleFileInputs();">  
            <div class="iContainer" id="inputContainer"></div>  
          </body>  
          
          

          Nochmal zur Erinnerung: dies ist eine furchtbare Frickelei und ich empfehle _nicht_ sie zu verwenden (für mich funktioniert sie...)

          liebe Grüße aus Berlin
          lina-

          --
          Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
          1. Und überhaupt ist davon abzuraten.... weil ja nicht immer (in meinem Fall schon) gewährleistet ist, dass die User Javascript aktiviert haben - und ohne funktioniert meine Lösung nun mal nicht.

            diese schon http://www.quirksmode.org/dom/inputfile.html (zumindest z.T.)

            Aber hier (zur Info) sind die schnipsel:

            Ich weiß du wurdest gezwungen ;-)
            Trotzdem kann mich nicht, einiger Kommentare abhalten.

            Javascript:

            ...

            if (document.all) {
                 input.type = 'file';
                 input.size='1';
                 input.name = iname;
                 input.id = iname;
              } else if (document.getElementById) {
                 input.setAttribute('type', 'file');
                 input.setAttribute('name', iname);
                  input.setAttribute('id', iname);
                 input.setAttribute('size', 1);
               }

            Nur zur Info, du brauchst setAttribute auch nicht in browsern die keine document.all kennen. Auch in diesen kannst du auf eine eigenschaft in der Form objekt.eigenschaft zugreifen.

            ...

            el.relatedElement.href="javascript:remove(""+el.relatedElement.id+"")";

            und sowas schreit förmlich nach oncklick

            el.relatedElement.onclick = function()
            {
            remove(this.relatedElement.id );
            };

            Wobei du das mit der ID auch nich sparen könntest.

            input.setAttribute('onchange', 'handleFileInputs()');
            input.onchange = handleFileInputs;

            Das ist mehr oder weniger doppeltgemoppelt wobei das erste von einigen Browsern nicht akzeptiert wird und das zweite sogar Uraltbrowser können.

            Struppi.

            --
            Javascript ist toll (Perl auch!)
  2. Ich habe auch noch auf keiner Seite einen solchen angepassten Button gesehen.
    Geht das denn überhaupt?

    eigentlich nicht.

    Hier ist aber ein Versuch das zu umgehen, inkl. aller Probleme die dann aber auftauchen http://www.quirksmode.org/dom/inputfile.html

    Struppi.

    --
    Javascript ist toll (Perl auch!)