Heim > Artikel > Web-Frontend > Ausführliche Erläuterung der Videoeinbettung in HTML-Seiten und der Videoumschaltung unter JS control_HTML/Xhtml_Webseitenproduktion
Zuerst lautet der HTML-Code zum Einbetten des Videos in die Seite:
Kopieren Sie den Code
Der Code ist wie folgt:
<p id="youku" class="youku"> <object id="obx" name="obx" width="290" height="260"> <param name="movie" value="http://www.tudou.com/v/6HJvxxkarzk/&resourceId=0_04_11_19/v.swf"></param> <param name="allowFullScreen" value="true"></param> <param name="allowscriptaccess" value="always"></param> <param name="wmode" value="opaque"></param> <embed src="http://www.tudou.com/v/6HJvxxkarzk/&resourceId=0_04_11_19/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="290" height="260"></embed> </object> </p>
Unter anderem soll die gleichzeitige Verwendung der Objekt- und Einbettungs-Tags mit mehr Browsern kompatibel sein. Achten Sie jedoch darauf, dass unter beiden die gleichen Attributwerte beibehalten werden Tags konsistent.
PS: Informationen zur Einführung und Verwendung der Tags 273238ce9338fbb04bee6997e5552b95 und ihrer Attribute finden Sie im Artikel OBJECT- und EMBED-Tags.
Dann sprechen wir darüber, wie man JS verwendet, um die Adresse des eingebetteten Videos dynamisch zu ändern, um das nächste Video abzuspielen.
Zu diesem Zeitpunkt können viele Menschen sofort daran denken, Tag-Namen oder DOM-Methoden zu verwenden, um das Wertattribut des obigen Parameterknotens und das SRC-Attribut des Einbettungsknotens zu finden, und die dynamische Zuweisung von JS zum Ändern der Adresse zu verwenden. Allerdings stellte der Test fest, dass die Videoadresse zwar ersetzt wurde, das auf der Seite angezeigte Video jedoch unverändert blieb, was rätselhaft war.
Es stellt sich heraus, dass alle Parameter des eingebetteten Objekts beim Laden der Seite initialisiert werden. Nur durch erneutes Laden kann der Wechsel zum nächsten Video durchgeführt werden. Eine einfache Änderung seines Adressattributwerts ist nicht möglich . Genau wie bei einem Mitarbeiter des Unternehmens hat sich seine Adresse geändert (umgezogen), er ist immer noch der ursprüngliche Mitarbeiter und nicht jemand anderes.
Es gibt zwei Methoden, die ich oft verwende, um es neu zu laden (nehmen Sie den obigen Code als Beispiel):
① Verwenden Sie die obj.innerHTML-Methode von JS, um das gesamte Objektobjekt zurückzusetzen.
Kopieren Sie den Code
Der Code lautet wie folgt:
/*功能:动态切换视频*/ function setvideo(url){ var youku = document.getElementById("youku"); var htmlstr = "<object id='obx' name='obx' width='290' height='260'>"; htmlstr += "<param name='movie' value='"+url+"'></param>"; htmlstr += "<param name='allowFullScreen' value='true'></param>"; htmlstr += "<param name='allowscriptaccess' value='always'></param>"; htmlstr += "<param name='wmode' value='opaque'></param>"; htmlstr += "<embed src='"+url+"' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' wmode='opaque' width='290' height='260'></embed>"; htmlstr += "</object>"; youku.innerHTML = htmlstr; }
②Platzieren Sie einen Iframe im p-Container, damit die Seite im Iframe sein kann dynamisch aktualisiert, ohne dass sich dies auf die aktuelle übergeordnete Seite auswirkt.
Ich werde den spezifischen Code nicht schreiben. Die allgemeine Idee ist:
1. Verwenden Sie die URL, um den Wert zu übergeben.
2. Die übergeordnete oder untergeordnete Seite erstellt eine versteckte Domäne, um die Adresse dynamisch zu speichern, damit die untergeordnete Seite sie erhalten kann.
3. Verwenden Sie die Methode ①, um das Objektobjekt auf der Unterseite zurückzusetzen.
4. Andere Methoden wie window.open sind weit entfernt und werden nicht empfohlen.
Zu diesem Zeitpunkt wurden die Einbettung und Steuerung der Videoumschaltung erfolgreich implementiert. Aber versehentlich habe ich ein Problem entdeckt:
Nach dem Wechsel zu einem neuen Video führt das Klicken auf „Aktualisieren“ oder das Drücken von F5 oder einer anderen Methode zum Aktualisieren der Seite dazu, dass ein Skriptfehler „Fehlendes Objekt“ angezeigt wird. Ich habe den Fehlercode gefunden und festgestellt, dass es sich um einen internen Skriptfehler in Flash handelt:
function __flash__removeCallback(instance, name) { instance[name] = null; }
Wenn Flash auf der Seite verwendet wird und die Methode flash.external.ExternalInterface.addCallback in Flash verwendet wird, __flash__removeCallback wird gemeldet, wenn die Webseite aktualisiert wird: Fehlendes Objekt (Zeile 53), (Jscript-scriptblock). Der Aufrufort dieser Funktion ist:
__flash__removeCallback(document.getElementById(""), "dewprev");
Offensichtlich gibt document.getElementById("") hier null zurück, was dazu führt, dass __flash__removeCallback einen Fehler meldet. Ich persönlich denke, dass die integrierte Methode von Flash sollte so geschrieben werden:
function __flash__removeCallback(instance, name) { if (instance != null) { instance[name] = null; } }
Jemand hat getestet und festgestellt, dass document.getElementById("") hier das ID/Name-Attribut des Flash-Steuerungsobjekts abruft. Der Grund, warum dieser Fehler auftritt, ist, dass Die ID/der Name ist für die Objekteigenschaften nicht festgelegt. Nach dem Festlegen treten keine Fehler auf. Aber tatsächlich haben alle meine Objekte ID/Name-Attribute, daher bin ich mit diesem Grund nicht einverstanden. Unter diesem Gesichtspunkt kann diese Methode zum Hinzufügen von ID/Namen die Probleme einiger Leute lösen, und dies ist nicht die einzige Ursache für dieses Problem.
Danach habe ich lange gesucht und schließlich auf einer ausländischen Website eine Lösung gefunden. Sie wurde von einer Person namens Dave Smith geschrieben und hat einige Verbesserungen vorgenommen, wodurch die Anzahl der Seiten reduziert wurde. Druck, Code auszuführen. Der von ihm bereitgestellte Code lautet wie folgt:
Code kopieren
Der Code lautet wie folgt:
<script type="text/javascript"> (function(){ var setRemoveCallback = function(){ __flash__removeCallback = function(instance, name){ if (instance){ instance[name] =null; } }; window.setTimeout(setRemoveCallback, 10); }; setRemoveCallback(); })(); </script>
Was er meint, ist ungefähr: Dieses Skript im Inneren neu schreiben Flash kann das Problem lösen. Das aktuelle Problem besteht darin, dass das Skript in Flash irgendwann nach dem Laden des Objekts die von Ihnen neu geschriebene Funktion überschreibt. Daher gibt es keine Garantie dafür, dass der Player die von Ihnen neu geschriebene Funktion zu gegebener Zeit aufruft. Um dieses Ziel zu erreichen, stellte er die Funktion so ein, dass sie alle 10 Millisekunden die im Flash bereitgestellte Funktion überschreibt. Dieses Problem ist gelöst. Gleichzeitig vereinfachte er diesen Code, um die folgenden zwei „Versionen“ zu bilden:
Vereinfachte Version eins: etwas einfacher
Kopieren Sie den Code
Der Code lautet wie folgt :
<script type="text/javascript"> var setRemoveCallback = function() { __flash__removeCallback = function(instance, name) { if(instance) { instance[name] = null; } }; window.setTimeout(setRemoveCallback, 10); }; setRemoveCallback(); </script>
Vereinfachte Version zwei: super einfach
Code kopieren
Der Code ist wie folgt:
<script type="text/javascript"> (function(){ var s=function(){ __flash__removeCallback=function(i,n){if(i)i[n]=null; }; window.setTimeout(s,10);};s();})(); </script>
dachte ich für eine Weile und rationalisierte meine Gedanken:
Dieser Fehler tritt beim Aktualisieren der Seite auf. Der Vorgang der Seitenaktualisierung ist der Tod der alten Seite und das Neuladen der neuen Seite. Theoretisch wird es kein Problem geben, die neue Seite neu zu laden, daher tritt der Fehler in der „Nachsorge“-Arbeit auf, bevor die alte Seite stirbt. Ich kann den gleichen Zweck erreichen, solange ich die Rückruffunktion im Flash neu schreibe, bevor die Seite stirbt. Der Code lautet wie folgt und der Test besteht.
Kopieren Sie den Code
Der Code lautet wie folgt:
/*解决视频切换内部脚本错误*/ <script type="text/javascript"> function endcall(){var s=function(){__flash__removeCallback=function(i,n){if(i)i[n]=null;};window.setTimeout(s,10);};s();} window.onbeforeunload = endcall; </script>