Fiddle Links: Kaynak kodu - Önizleme - Küçük sürüm
Güncelleme: Bu küçük işlev kodu yalnızca tek bir yönde yürütür. Tam destek istiyorsanız (örn. Olay dinleyicileri / alıcıları), jQuery'de Youtube Etkinliğini Dinleme'ye göz atın
Derin kod analizinin bir sonucu olarak, bir işlev oluşturdum: function callPlayer
çerçeveli herhangi bir YouTube videosunda bir işlev çağrısı ister. Olası işlev çağrılarının tam listesini almak için YouTube Api referansına bakın . Açıklama için kaynak kodundaki yorumları okuyun.
17 Mayıs 2012 tarihinde, oyuncunun hazır durumuna bakmak için kod boyutu iki katına çıkarıldı. Oyuncunun hazır durumu ile ilgilenmeyen kompakt bir işleve ihtiyacınız varsa, bkz. Http://jsfiddle.net/8R5y6/ .
/**
* @author Rob W <gwnRob@gmail.com>
* @website https://stackoverflow.com/a/7513356/938089
* @version 20190409
* @description Executes function on a framed YouTube video (see website link)
* For a full list of possible functions, see:
* https://developers.google.com/youtube/js_api_reference
* @param String frame_id The id of (the div containing) the frame
* @param String func Desired function to call, eg. "playVideo"
* (Function) Function to call when the player is ready.
* @param Array args (optional) List of arguments to pass to function func*/
function callPlayer(frame_id, func, args) {
if (window.jQuery && frame_id instanceof jQuery) frame_id = frame_id.get(0).id;
var iframe = document.getElementById(frame_id);
if (iframe && iframe.tagName.toUpperCase() != 'IFRAME') {
iframe = iframe.getElementsByTagName('iframe')[0];
}
// When the player is not ready yet, add the event to a queue
// Each frame_id is associated with an own queue.
// Each queue has three possible states:
// undefined = uninitialised / array = queue / .ready=true = ready
if (!callPlayer.queue) callPlayer.queue = {};
var queue = callPlayer.queue[frame_id],
domReady = document.readyState == 'complete';
if (domReady && !iframe) {
// DOM is ready and iframe does not exist. Log a message
window.console && console.log('callPlayer: Frame not found; id=' + frame_id);
if (queue) clearInterval(queue.poller);
} else if (func === 'listening') {
// Sending the "listener" message to the frame, to request status updates
if (iframe && iframe.contentWindow) {
func = '{"event":"listening","id":' + JSON.stringify(''+frame_id) + '}';
iframe.contentWindow.postMessage(func, '*');
}
} else if ((!queue || !queue.ready) && (
!domReady ||
iframe && !iframe.contentWindow ||
typeof func === 'function')) {
if (!queue) queue = callPlayer.queue[frame_id] = [];
queue.push([func, args]);
if (!('poller' in queue)) {
// keep polling until the document and frame is ready
queue.poller = setInterval(function() {
callPlayer(frame_id, 'listening');
}, 250);
// Add a global "message" event listener, to catch status updates:
messageEvent(1, function runOnceReady(e) {
if (!iframe) {
iframe = document.getElementById(frame_id);
if (!iframe) return;
if (iframe.tagName.toUpperCase() != 'IFRAME') {
iframe = iframe.getElementsByTagName('iframe')[0];
if (!iframe) return;
}
}
if (e.source === iframe.contentWindow) {
// Assume that the player is ready if we receive a
// message from the iframe
clearInterval(queue.poller);
queue.ready = true;
messageEvent(0, runOnceReady);
// .. and release the queue:
while (tmp = queue.shift()) {
callPlayer(frame_id, tmp[0], tmp[1]);
}
}
}, false);
}
} else if (iframe && iframe.contentWindow) {
// When a function is supplied, just call it (like "onYouTubePlayerReady")
if (func.call) return func();
// Frame exists, send message
iframe.contentWindow.postMessage(JSON.stringify({
"event": "command",
"func": func,
"args": args || [],
"id": frame_id
}), "*");
}
/* IE8 does not support addEventListener... */
function messageEvent(add, listener) {
var w3 = add ? window.addEventListener : window.removeEventListener;
w3 ?
w3('message', listener, !1)
:
(add ? window.attachEvent : window.detachEvent)('onmessage', listener);
}
}
Kullanımı:
callPlayer("whateverID", function() {
// This function runs once the player is ready ("onYouTubePlayerReady")
callPlayer("whateverID", "playVideo");
});
// When the player is not ready yet, the function will be queued.
// When the iframe cannot be found, a message is logged in the console.
callPlayer("whateverID", "playVideo");
Olası sorular (ve cevaplar):
S : Çalışmıyor!
C : "Çalışmıyor" açık bir açıklama değil. Hata mesajı alıyor musunuz? Lütfen ilgili kodu gösterin.
S : playVideo
videoyu oynatmıyor.
C : Oynatma için kullanıcı etkileşimi ve allow="autoplay"
iframe üzerinde bulunması gerekir . Https://developers.google.com/web/updates/2017/09/autoplay-policy-changes ve https://developer.mozilla.org/en-US/docs/Web/Media/Autoplay_guide sayfasına bakın.
S : Kullanarak bir YouTube videosu yerleştirdim <iframe src="http://www.youtube.com/embed/As2rZGPGKDY" />
ancak işlev herhangi bir işlev yürütmüyor!
A : Sen eklemek zorunda ?enablejsapi=1
senin URL'nin sonunda: /embed/vid_id?enablejsapi=1
.
S : "Geçersiz veya geçersiz bir dize belirtildi" hata iletisini alıyorum. Neden?
Y : API, yerel bir ana bilgisayarda ( file://
) düzgün çalışmıyor . (Test) sayfanızı çevrimiçi olarak barındırın veya JSFiddle kullanın . Örnekler: Bu cevabın üst kısmındaki bağlantılara bakın.
S : Bunu nasıl bildin?
Y : API'nin kaynağını manuel olarak yorumlamak için biraz zaman harcadım. postMessage
Yöntemi kullanmak zorunda olduğum sonucuna vardım . Hangi bağımsız değişkenlerin iletileceğini bilmek için iletileri engelleyen bir Chrome uzantısı oluşturdum. Uzantının kaynak kodu buradan indirilebilir .
S : Hangi tarayıcılar desteklenir?
C : JSON ve postMessage
.
- IE 8+
- Firefox 3.6+ (aslında 3.5, ancak
document.readyState
3.6'da uygulandı)
- Opera 10.50+
- Safari 4+
- Chrome 3+
İlgili cevap / uygulama: jQuery
Tam API desteğini kullanarak çerçeveli bir videoda solma : jQuery
Resmi API'sinde Youtube Etkinliğini Dinleme : https://developers.google.com/youtube/iframe_api_reference
Revizyon Geçmişi
- 17 2012 olabilir
Uygulanan onYouTubePlayerReady
: callPlayer('frame_id', function() { ... })
.
Oynatıcı henüz hazır olmadığında işlevler otomatik olarak sıraya alınır.
- 24 Temmuz 2012
Desteklenen tarayıcılarda güncellendi ve başarıyla test edildi (ileriye bakın).
- 10 ekim 2013 Bir işlev bağımsız değişken olarak iletildiğinde
callPlayer
, hazır olup olmadığını denetlemeye zorlar. Bu gereklidir, çünkü callPlayer
belge hazırken iframe'in yerleştirilmesinden hemen sonra çağrıldığında, iframe'in tamamen hazır olduğundan emin olamaz. Internet Explorer ve Firefox'ta, bu senaryonun bir çok erken çağırma sonuçlandı postMessage
göz ardı edildi.
- 12 Aralık 2013,
&origin=*
URL'ye eklenmesi önerilir .
- 2 Mar 2014,
&origin=*
URL'ye kaldırma önerisini geri çekti .
- 9 Nisan 2019, sayfa hazır olmadan YouTube yüklendiğinde sonsuz bir tekrarlamaya neden olan hatayı düzeltin. Otomatik oynatma hakkında not ekleyin.