Linuchs: Eingebundene swf soll erst bei Klick starten

Hallo,

beim Einbinden von Hörproben sind bei diesem Event nun auch swf-Dateien dabei. Doch die spielen ohne Aufforderung sofort los. Ich möchte den Start erst bei Klick.

<object width="20" height="20" data="http://scl.1x.de/swf/5/6.swf" autoplay="false"></object>

Doch weder mit autoplay="false" noch mit autostart="false" sind die zum Schweigen zu bringen. Wie ist es richtig?

Linuchs

  1. Doch weder mit autoplay="false" noch mit autostart="false" sind die zum Schweigen zu bringen. Wie ist es richtig?

    Das Element object kennt keine Attribute autostart oder autoplay: Referenz:HTML

    Warum wandelst Du die Flash-Videos nicht um und verwendet das video-Element, dass dann sowohl das Attribut autoplay kennt, als auch mittels controls Bedienelemente integriert hat?

    Vorteil ist, dass auch mobile Geräte deine Lieder abspielen können.

    LG Matthias

    1. Hallo Matthias,

      Warum wandelst Du die Flash-Videos nicht um

      Weil die Hörproben auf den Servern der Berechtigten liegen und ich keine Kopien speichere. Damit würde ich den Berechtigten die Möglichkeit nehmen, ihre Hörprobe zu ändern oder zu entfernen.

      Linuchs

  2. Doch weder mit autoplay="false" noch mit autostart="false" sind die zum Schweigen zu bringen. Wie ist es richtig?

    Ich rate dazu die swf-Dateien durch ein offenes Webformat zu ersetzen, dann kannst du das <audio>-Element zum Abspielen der Datein benutzen.

    Das autoplay-Attribut existiert nämlich nur für <video>- und <audio>-Elemente, nicht für <object>. Du könntest allerdings das data-Attribut des <object>-Elements anfänglich weg lassen und erst auf die richtige Quelle setzen, sobald der Sound abgespielt werden soll.

    Eine andere Möglichkeit bestünde darin, das <object>-Element mit einem <template>-Element zu umschließen. Vereinfacht ausgedrückt sind Nachfahren-Elemente von <template>s inaktiv, bis sie mit JavaScript an eine Stelle verschoben werden, die nicht mehr von <template>-Elementen umschlossen wird. Sobald das <object>-Element also verschoben wird, sollte der Sound abgespielt werden.

    Bei beiden Methoden ist die sfw-Datei nicht von Anfang geladen und muss erst noch runtergeladen werden, bevor der Sound abgespielt wird. Wenn man den Download erst beginnt, wenn der Nutzer klickt, dann kann das unerwünschte Wartezeiten zur Folge haben. Um das zu vermeiden, kannst du dem Browser mitteilen, dass er die Datei vorladen soll:

    <link rel="prefetch" href="ihgitt-eine-flash-datei.swf">
    
    1. bis sie mit JavaScript an eine Stelle verschoben werden, ...

      Naja, meine Seiten kommen prinzipiell ohne Javascript aus. Javascript setze ich nur sehr gezielt ein und eher nicht für (Ausnahme-) Sonderfälle, die vom Teilnehmer zu verantworten sind.

      Da lasse ich mal das Provisorium stehen, ein schlichter Link auf die swf Datei.

      Danke für deinen Lösungsvorschlag.

      Linuchs

      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        Da lasse ich mal das Provisorium stehen, ein schlichter Link auf die swf Datei.

        Warum sollte man den Client auch große Datenmengen laden lassen, die er nachher gar nicht nutzen will?

        Ich würde an deiner Stelle aber die Größe der Ressource neben dem Link erwähnen, oder wenn sich die Größe nicht Remote abfragen lässt, zumindest daneben schreiben, dass die Ressource größer sein kann.

        Hier eine kleine hilfreiche Funktion dafür:

        function head_request($url, $status_only=false, $parsed=true)
        {
            ### checks, if an url exists. 
            ### if no scheme is provided, 'http://' will be assumed
            ### if not "$parsed", raw headers shell be returned, 
            ###     otherwise an array shell be produced
            ###
            ### Used own Constants: TIMEOUT_SOCK_OPEN, TIMEOUT_STREAM_READ
            
        	defined('TIMEOUT_SOCK_OPEN') or define('TIMEOUT_SOCK_OPEN', 2);
        	defined('TIMEOUT_STREAM_READ') or define('TIMEOUT_STREAM_READ', 2);
        
        	
            $url = trim($url);
            $_url_parts = parse_url($url);
        
            if (!isset($_url_parts['scheme'])) $url = 'http://' . $url;
        
            $_url_parts = parse_url($url);
            
        #    * scheme - e.g. http
        #    * host
        #    * port
        #    * user
        #    * pass
        #    * path
        #    * query - after the question mark ?
        #    * fragment - after the hashmark #
        
            if (!isset($_url_parts['host'])) return false;
        
            $fp = @fsockopen($_url_parts['host'], 80, $errno, $errstr, TIMEOUT_SOCK_OPEN);
        
            if (!$fp) return false;
        
            stream_set_timeout($fp, TIMEOUT_STREAM_READ);
        	
           	$path = '/';
        	if (isset($_url_parts['path'])) {$path = $_url_parts['path'];}
        	
            $out = "HEAD $path HTTP/1.1\r\n";
            $out .= "Host: " . $_url_parts['host'] . "\r\n";
            $out .= "Connection: Close\r\n\r\n";
            fwrite($fp, $out);
            
            $res = '';
            
            while (!feof($fp)) 
            {
                $res .= fgets($fp, 128);
            }
            
            $_info = stream_get_meta_data($fp);
            fclose($fp);
        
            if ($_info['timed_out']) return false;
            
            $res = str_replace(array('   ', '  '), ' ', $res);  ###*ups* hier nachbessern! ###
            $_lines = explode("\r\n", $res);
        
        #       return $_lines;
            
            foreach ($_lines as $key => $value)
            {
                if (strlen($value) == 0) 
                {
                    unset($_lines[$key]);
                    continue;
                }
                
                $_help[$key] = explode(': ', $value);
        
                if (!isset($_help[$key][1]))
                {
                    $_out['status'] = explode(' ', trim($_help[$key][0]));
                }
                else
                {
                    $_out[strtolower($_help[$key][0])] = explode(' ', trim($_help[$key][1]));
                }   
            }
        
            if (!isset($_out['status'][1])) return false;
            if ($status_only) return $_out['status'][1];
            if (!$parsed) return $res;
            
            return $_out;   
        }
        

        Unter [content-length] solltest Du die Größe der Datei dann finden.

        Die Funktion ist außerdem ganz nützlich, den Link automatisch zu entfernen, wenn der Request auf die Ressource nicht mit Status 200 (...) antwortet.

        Spirituelle Grüße
        Euer Robert
        robert.r@online.de

        --
        Möge der wahre Forumsgeist ewig leben!