未捕获的TypeError:无法为小部件实现设置未定义的’FUNCTION_NAME’
我正在尝试开发一个可以嵌入任何网站的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 = $("", { 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);
以下是需要放在用户网站上的代码:
$('#my-widget-container').fetchfeed({/*parameters*/});
当我将此代码放在其他站点上并尝试加载小部件时,它会给我Uncaught TypeError: Can not set property 'fetchfeed' of undefined
错误的Uncaught TypeError: Can not set property 'fetchfeed' of undefined
并且无法加载小部件。 可能有什么不对?
令人惊讶的是,这个小部件代码正在我的网站上运行!
如果在代码执行之前未定义jQuery,那么您在此处获得TypeError
:
$.fn.fetchfeed
因为$
不是jQuery对象。 尝试将此行和main()
中的代码移动到jQuery(document).ready(function($){ ... });
上面的建设。
好吧,经过无数次的尝试,我解决了它并开始学习很多东西。 我还不清楚很多事情。 通过编辑此答案来纠正我,或者如果您发现任何错误,请发表评论。
第一个$.fn
为null(或传递给它的值为null / undefined)。 原因是,脚本在被调用。 所以
.fetchfeed({...})
未定义。
然后我在window.onload
移动了代码,它给了我错误can not call method fetchfeed on null
。 它必须是因为它没有获得元素(即$('#my-widget-container')
)脚本也无法识别$
。
再次经过几次调整后, $.fn.fetchfeed
function 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 }); } }
用户网站/博客上的代码将是
页面加载完成后将执行该function。