{$expr: {$lt: [{$size: "$array"}, "$field_in_this_document_with_int_value"] }
В запросах $expr
вы можете использовать любые допустимые выражения-агрегаторы .
Редактировать:
По-видимому, вызов addEventListener
для объекта player
заставляет сценарий использоваться в качестве строки в свойстве XML, которое передается в объект flash - это исключает замыкания и тому подобное, так что пришло время для некрасивого взлома старой школы:
function onYouTubePlayerReady(playerId) {
var player = $('#'+playerId)[0];
player.addEventListener('onStateChange', '(function(state) { return playerState(state, "' + playerId + '"); })' );
}
function playerState(state, playerId) {
console.log(state);
console.log(playerId);
}
Проверено и работает!
Вот хорошая статья, в которой рассказывается о создании класса для упаковки отдельного проигрывателя, включая отправку событий отдельным объектам с использованием аналогичного подхода. к тому, что упоминалось в предыдущем ответе.
http://blog.jcoglan.com/2008/05/22/dispatching-youtube-api-events-to-individual-javascript-objects/
Я использую плагин JQuery SWFobject, SWFobject
Важно добавить & enablejsapi = 1 в конце видео
HTML:
<div id="embedSWF"></div>
JQuery:
$('#embedSWF').flash({
swf: 'http://www.youtube.com/watch/v/siBoLc9vxac',
params: { allowScriptAccess: "always"},
flashvars: {enablejsapi: '1', autoplay: '0', allowScriptAccess: "always", id: 'ytPlayer' },
height: 450, width: 385 });
function onYouTubePlayerReady(playerId) {
$('#embedSWF').flash(function(){this.addEventListener("onStateChange", "onPlayerStateChange")});
}
function onPlayerStateChange(newState) {
alert(newState);
}
onYouTubePlayerReady должен находиться за пределами $ (document) .ready (function (), чтобы его уволили
У меня была такая же проблема, и я попробовал принятый ответ. Это не сработало для меня; функция playerState() никогда не вызывалась. Однако это направило меня на правильный путь. В итоге я сделал следующее:
// Within my mediaController "class"
window["dynamicYouTubeEventHandler" + playerID] = function(state) { onYouTubePlayerStateChange(state, playerID); }
embedElement.addEventListener("onStateChange", "dynamicYouTubeEventHandler" + playerID);
// End mediaController class
// Global YouTube event handler
function onYouTubePlayerStateChange(state, playerID) {
var mediaController = GetMediaControllerFromYouTubeEmbedID(playerID);
mediaController.OnYouTubePlayerStateChange(state);
}
Это довольно неприятно, но таково текущее состояние API YouTube JavaScript.
Вот другой полезный/неприятный код, если вы используете какие-либо продвинутые шаблоны прототипирования. В основном это позволяет вам получить экземпляр "класса" из идентификатора плеера YouTube:
// Within my mediaController "class"
// The containerJQElement is the jQuery wrapped parent element of the player ID
// Its ID is the same as the player ID minus "YouTubeEmbed".
var _self = this;
containerJQElement.data('mediaController', _self);
// End mediaController class
// Global YouTube specific functions
function GetMediaControllerFromYouTubeEmbedID(embedID) {
var containerID = embedID.replace('YouTubeEmbed', '');
var containerJQObject = $("#" + containerID);
return containerJQObject.data('mediaController');
}
function onYouTubePlayerReady(playerId) {
var mediaController = GetMediaControllerFromYouTubeEmbedID(playerId);
mediaController.OnYouTubeAPIReady();
}