【问题标题】:Using own handler for Jquery Oembed为 Jquery Oembed 使用自己的处理程序
【发布时间】:2011-02-08 02:07:43
【问题描述】:

我正在尝试使用自己的函数(从不喜欢 $(document).ready())从 URL 动态加载嵌入。

我正在尝试这样:

function video(donde,url) {
    $("#"+donde).oembed(url);
    return false;
}

还有一个使用示例:

<div class="texto">
  [my title]
  <span style="float: right;">
      <img onclick="video('video68084','http://www.youtube.com/watch?v=ORZTCQjAuZY');" src="http://i1.ytimg.com/vi/ORZTCQjAuZY/default.jpg" alt="preview" onerror="this.src='images/linket.png';" class="caja_con_sombra" style="width: 80px; height: 60px;">  </span>
  <div style="float: left; width: 76%;">
       [my description]
  </div>
  <div id="video68084"></div>
</div>

哪个跳跃:

b.type is not a function
[Interrumpir en este error] b.ready);var j=false;try{j=E.frameElem...ow(j))return false;if(j.constructor&& 

Onclick 通过 firebug :(

知道我错过了什么吗?错误源文件是 jquery.min.js :S

【问题讨论】:

    标签: javascript jquery oembed


    【解决方案1】:

    您没有遗漏任何东西,您在 oembed 插件中发现了一个错误。很好的发现,也许你在质量保证方面有未来的职业:)

    看起来 oembed 和 jQuery 都想使用 .type,但 jQuery 以 oembed 的字符串 .type 结尾,它想要自己的函数 .type

    oembed plugin 可以在 jQuery-1.3.2 中正常工作,但在 jQuery-1.4.3 中会中断。

    您可以从此 jsfiddle 中提取 oembed 插件的功能版本:http://jsfiddle.net/ambiguous/ZVhUn/1/

    这个问题一直是reported several times,但oembed作者似乎没有在听。如果需要,这里有一个固定版本的插件:

    (function($) {
        $.fn.oembed = function(url, options, callback) {
    
            options = $.extend(true, $.fn.oembed.defaults, options);
    
            return this.each(function() {
    
                var container = $(this),
                    resourceURL = (url != null) ? url : container.attr("href"),
                    provider;
    
                if (!callback) callback = function(container, oembed) {            
                     $.fn.oembed.insertCode(container, options.embedMethod, oembed);
                };
    
                if (resourceURL != null) {
                    provider = getOEmbedProvider(resourceURL);
    
                    if (provider != null) {                        
                        provider.params = getNormalizedParams(options[provider.name]) || {};
                        provider.maxWidth = options.maxWidth;
                        provider.maxHeight = options.maxHeight;                                        
                        provider.embedCode(container, resourceURL, callback);
                        return;
                    }
                }
    
                callback(container, null);
            });
        };
    
        // Plugin defaults
        $.fn.oembed.defaults = {
            maxWidth: null,
            maxHeight: null,
            embedMethod: "replace" // "auto", "append", "fill"
        };
    
        $.fn.oembed.insertCode = function(container, embedMethod, oembed) {
            if (oembed == null)
                return;
            switch(embedMethod)
            {
                case "auto":                
                    if (container.attr("href") != null) {
                        $.fn.oembed.insertCode(container, "append", oembed);
                    }
                    else {
                        $.fn.oembed.insertCode(container, "replace", oembed);
                    };
                    break;
                case "replace":    
                    container.replaceWith(oembed.code);
                    break;
                case "fill":
                    container.html(oembed.code);
                    break;
                case "append":
                    var oembedContainer = container.next();
                    if (oembedContainer == null || !oembedContainer.hasClass("oembed-container")) {
                        oembedContainer = container
                            .after('<div class="oembed-container"></div>')
                            .next(".oembed-container");
                        if (oembed != null && oembed.provider_name != null)
                            oembedContainer.toggleClass("oembed-container-" + oembed.provider_name);        
                    }
                    oembedContainer.html(oembed.code);                
                    break;            
            }
        };
    
        $.fn.oembed.getPhotoCode = function(url, data) {
            var alt = data.title ? data.title : '';
            alt += data.author_name ? ' - ' + data.author_name : '';
            alt += data.provider_name ? ' - ' +data.provider_name : '';
            var code = '<div><a href="' + url + '" target="_blank"><img src="' + data.url + '" alt="' + alt + '"/></a></div>';
            if (data.html)
                code += "<div>" + data.html + "</div>";
            return code;
        };
    
        $.fn.oembed.getVideoCode = function(url, data) {
            var code = data.html;
            return code;
        };
    
        $.fn.oembed.getRichCode = function(url, data) {
            var code = data.html;
            return code;
        };
    
        $.fn.oembed.getGenericCode = function(url, data) {
            var title = (data.title != null) ? data.title : url,
                code = '<a href="' + url + '">' + title + '</a>';
            if (data.html)
                code += "<div>" + data.html + "</div>";
            return code;
        };
    
        $.fn.oembed.isAvailable = function(url) {
            var provider = getOEmbedProvider(url);
            return (provider != null);
        };
    
        /* Private Methods */
        function getOEmbedProvider(url) {
            for (var i = 0; i < providers.length; i++) {
                if (providers[i].matches(url))
                    return providers[i];
            }
            return null;
        }
    
        function getNormalizedParams(params) {
            if (params == null)
                return null;
            var normalizedParams = {};
            for (var key in params) {
                if (key != null)
                    normalizedParams[key.toLowerCase()] = params[key];
            }
            return normalizedParams;
        }
    
        var providers = [
            new OEmbedProvider("fivemin", "5min.com"),
            new OEmbedProvider("amazon", "amazon.com"),
            new OEmbedProvider("flickr", "flickr", "http://flickr.com/services/oembed", "jsoncallback"),    
            new OEmbedProvider("googlevideo", "video.google."),
            new OEmbedProvider("hulu", "hulu.com"),
            new OEmbedProvider("imdb", "imdb.com"),
            new OEmbedProvider("metacafe", "metacafe.com"),
            new OEmbedProvider("qik", "qik.com"),
            new OEmbedProvider("revision3", "revision3.com"),
            new OEmbedProvider("slideshare", "slideshare.net"),
            new OEmbedProvider("twitpic", "twitpic.com"),
            new OEmbedProvider("viddler", "viddler.com"),
            new OEmbedProvider("vimeo", "vimeo.com", "http://vimeo.com/api/oembed.json"),
            new OEmbedProvider("wikipedia", "wikipedia.org"),
            new OEmbedProvider("wordpress", "wordpress.com"),
            new OEmbedProvider("youtube", "youtube.com"),
            new OEmbedProvider("vids.myspace.com", "vids.myspace.com", "http://vids.myspace.com/index.cfm?fuseaction=oembed"),
            new OEmbedProvider("screenr", "screenr.com", "http://screenr.com/api/oembed.json")
        ];
    
        function OEmbedProvider(name, urlPattern, oEmbedUrl, callbackparameter) {
            this.name = name;
            this.urlPattern = urlPattern;
            this.oEmbedUrl = (oEmbedUrl != null) ? oEmbedUrl : "http://oohembed.com/oohembed/";
            this.callbackparameter = (callbackparameter != null) ? callbackparameter : "callback";
            this.maxWidth = 500;
            this.maxHeight = 400;
    
            this.matches = function(externalUrl) {
                // TODO: Convert to Regex
                return externalUrl.indexOf(this.urlPattern) >= 0;
            };
    
            this.getRequestUrl = function(externalUrl) {
    
                var url = this.oEmbedUrl;
    
                if (url.indexOf("?") <= 0)
                    url = url + "?";
                else
                    url = url + "&";
    
                var qs = "";
    
                if (this.maxWidth != null && this.params["maxwidth"] == null)
                    this.params["maxwidth"] = this.maxWidth;                
    
                if (this.maxHeight != null && this.params["maxheight"] == null)
                    this.params["maxheight"] = this.maxHeight;
    
                for (var i in this.params) {
                    // We don't want them to jack everything up by changing the callback parameter
                    if (i == this.callbackparameter)
                      continue;
    
                    // allows the options to be set to null, don't send null values to the server as parameters
                    if (this.params[i] != null)
                        qs += "&" + escape(i) + "=" + this.params[i];
                }            
    
    
                url += "format=json&url=" + escape(externalUrl) +             
                        qs + 
                        "&" + this.callbackparameter + "=?";
    
                return url;
            };
    
            this.embedCode = function(container, externalUrl, callback) {
    
                var request = this.getRequestUrl(externalUrl);
    
                $.getJSON(request, function(data) {
    
                    var code, type = data.type;
                    var oembed = $.extend({ }, data);
    
                    switch (type) {
                        case "photo":
                            oembed.code = $.fn.oembed.getPhotoCode(externalUrl, data);
                            break;
                        case "video":
                            oembed.code = $.fn.oembed.getVideoCode(externalUrl, data);
                            break;
                        case "rich":
                            oembed.code = $.fn.oembed.getRichCode(externalUrl, data);
                            break;
                        default:
                            oembed.code = $.fn.oembed.getGenericCode(externalUrl, data);
                            break;
                    }
    
                    callback(container, oembed);
                });
            };
        }
    })(jQuery);
    

    唯一的变化是我在文件底部的this.embedCode 中将var oembed = $.extend(data); 替换为var oembed = $.extend({ }, data);

    【讨论】:

    • 如果你这样做会更好,因为我不得不承认我没有很好地理解,所以,就我而言,你的代码是我的解决方案吗?我也不明白 谢谢!
    • @Toni Michel Caubet:oembed 插件在最新版本的 jQuery 中存在问题,对 oembed 源代码的小改动解决了这个问题。如果您访问 jsfiddle.net 链接,则 JavaScript 面板中有一个固定版本的 oembed 插件,您可以使用它来代替您下载的 oembed 插件。我会发送一个补丁。
    • @Toni Michel Caubet:其他几个人 (code.google.com/p/jquery-oembed/issues/list) 发现了这个问题,但 oembed 的作者似乎没有在听。我用更好的修复更新了我的 jsfiddle,我会在我的答案中抛出整个问题。
    • 更新:它在 chrome 和 safari 上运行良好,但无法在 firefox 上运行。为什么可能? (如果想尝试:keepyourlinks.com 任何带有播放图标的图像(但不是图标,图像:P))
    • 在 Firefox 和 Chrome 中对我来说似乎都可以正常工作。 jsfiddle 链接在 Firefox 中是否适合您?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多