2

我正在尝试开发一个可以嵌入任何站点的 jQuery 小部件。以下是脚本代码:

(function($) {
    var jQuery;
    if (window.jQuery === undefined || window.jQuery.fn.jquery !== '1.6.2')
    {
        var script_tag = document.createElement('script');
        script_tag.setAttribute("type","text/javascript");
        script_tag.setAttribute("src","http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js");
        script_tag.onload = scriptLoadHandler;
        script_tag.onreadystatechange = function () 
        { 
            if (this.readyState == 'complete' || this.readyState == 'loaded')
                scriptLoadHandler();
        };
        (document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);
    }
    else 
    {
        jQuery = window.jQuery;
        main();
    }
    function scriptLoadHandler() 
    {
        jQuery = window.jQuery.noConflict(true);
        main();
    }
    function main() {
        jQuery(document).ready(function($) {
            var css = $("<link>", { rel: "stylesheet", type: "text/css", href: "http://mysite.com/my_css_path.css" });
            css.appendTo('head');
        });
        $.fn.fetchfeed = function(options) {
            var defaults = {
                //default params;
            };
            var opts = $.extend(defaults, options);

            var myURL = "http://mysite.com/"+opts.user+".json?";
            var params = "&callback=?"
            var jsonp_url = myURL + encodeURIComponent(params);

            $.getJSON(jsonp_url, function(data) {
                //build widget html
            })
            .error(function() {
                //show error
            });
        }
    }
})(jQuery);

以下是需要放置在用户网站上的代码:

 <script id='mywidgetscript' src='http://my_site.com/javascripts/widget.js'></script>
 <div id='my-widget-container'></div>
 <script>$('#my-widget-container').fetchfeed({/*parameters*/});</script>

当我将此代码放在其他站点并尝试加载小部件时,它给了我Uncaught TypeError: Can not set property 'fetchfeed' of undefined错误并且无法加载小部件。有什么问题?

令人惊讶的是,这个小部件代码正在我的本地主机上的网站上运行!!!

4

2 回答 2

0

如果在你的代码执行之前 jQuery 是未定义的,那么你会TypeError来到这里:

$.fn.fetchfeed

因为$不是 jQuery 对象。尝试将这一行和下面的代码移动main()到上面的jQuery(document).ready(function($){ ... });结构中。

于 2011-10-19T08:05:53.040 回答
0

好的,经过无数次尝试,我解决了它并学到了很多东西。我仍然不清楚很多事情。请通过编辑此答案来纠正我,或者如果您发现任何错误,请发表评论。

首先$.fn是 null(或传递给它的值是 null/未定义)。原因,脚本在<script>$('#my-widget-container').fetchfeed({/*parameters*/});</script>被调用后被执行。所以.fetchfeed({...})是未定义的。

然后我把代码移到window.onload里面给了我错误can not call method fetchfeed on null。一定是因为它没有获取元素(即$('#my-widget-container')),脚本也无法识别$

经过几次调整后再次$.fn.fetchfeedfunction fetchfeed() {...}了我错误undefined fetchfeed。这是因为函数 fetchfeed 在另一个函数中。

编码&callback=?参数也给出Access-Control-Allow-Origin错误。这应该按原样在 url 中传递。

经过一番研究,我修改了如下代码,现在可以正常工作。

function fetchfeed(options) {
    var o = options;
    var jQuery;
    if (window.jQuery === undefined || window.jQuery.fn.jquery !== '1.6.2')
    {
        var script_tag = document.createElement('script');
        script_tag.setAttribute("type","text/javascript");
        script_tag.setAttribute("src","http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js");
        script_tag.onload = scriptLoadHandler;
        script_tag.onreadystatechange = function () 
        { 
            if (this.readyState == 'complete' || this.readyState == 'loaded')
                scriptLoadHandler();
        };
        (document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);
    }
    else 
    {
        jQuery = window.jQuery;
        ff(jQuery, o);
    }
    function scriptLoadHandler() 
    {
        jQuery = window.jQuery.noConflict(true);
        ff(jQuery, o);
    }
    function ff($, options) {
        var defaults = {
            ...
        };
        var opts = $.extend(defaults, options);

        var jsonp_url = "http://mysite.com/?callback=?";            
        $.getJSON(jsonp_url, function(data) {
            //success
        })
        .error(function() {
            //fail
        });
    }
}

用户网站/博客上的代码将是

<div id='my-widget-container'></div>
<script id='my_widget_script' src='https://PATH_OF_SCRIPT/FILE_NAME.js'></script>
<script type='text/javascript'>
    fetchfeed({/*params*/});
</script>

该函数将在页面加载完成时执行。

于 2011-10-22T07:02:14.587 回答