jQuery and Vimeo Froogaloop API

Drew Baker picture Drew Baker · May 14, 2011 · Viewed 23k times · Source

I'm building a plugin to WordPress and so far so good with the PHP library. But I am having some issues with the JavaScript API.

I'm trying to use it with jQuery, and I think the WordPress version of jQuery is messing with the $f shortcut. Why wouldn't this work?

var vimeoPlayer = {

    init: function() {
        var vimeoPlayers = document.querySelectorAll('iframe'),
        player;

        jQuery('iframe.vimeo-player').each(function(index, iframe){
            player = vimeoPlayers[index];
            $f(player).vimeoPlayer.addEvent('ready', vimeoPlayer.ready);
        });
    },

    addEvent: function(element, eventName, callback) {
        if (element.addEventListener) {
            element.addEventListener(eventName, callback, false);
        }
        else {
            element.attachEvent(eventName, callback, false);
        }
    },

    ready: function(player_id) {
        alert(player_id);
    }
}

jQuery(document).ready(function($){
    vimeoPlayer.init.call();
});

You can see it in action at temp.woodshop.tv/?work/?dickies-campaign/?.

I get this error:

TypeError: Result of expression '$f(player).vimeoPlayer' [undefined] is not an object.

Answer

Jon Kirkman picture Jon Kirkman · Jun 1, 2011

One issue is that addEvent is both a function that you've defined and also a method of the $f(player) object. It appears that you're confusing the two. The addEvent method of the $f(player) object only takes two arguments, the name of the player event and the function to be called. It should be used as $f(your-iframe).addEvent('vimeo event', your_function);

Your addEvent function will unify events between IE and W3C methods. It's not needed because you're using jQuery. jQuery(whatever).click() does the same thing. I don't see any part of your snippet where you need it but if you do, I'd just use the jQuery method.

Also, the video player object should be $f(player) instead of $f(player).vimeoPlayer

Try this

jQuery('iframe.vimeo-player').each(function(){
    $f(this).addEvent('ready', ready);
});

Another thing to note is that any additional player events need to be added from your ready callback function. For example:

function ready(player_id){
    $f(player_id).addEvent('play', play);
    $f(player_id).api('play');
    alert("Ready!!!");
}
function play(){
    alert("Playing!!!");
}

I've had a hard time finding the info I want on Vimeo's Froogaloop api but after scouring Vimeo Froogaloop API Playground about a dozen times I'm starting to get the idea of how it works.

Good luck!