Хорошо, после бесчисленных попыток я решил это и научился многим вещам. Тем не менее я неясен во многих вещах. Исправьте меня, отредактировав этот ответ, или, пожалуйста, прокомментируйте, если что-то не так.
Первый $.fn
был нулевым (или передаваемое ему значение было нулевым / неопределенным). Причина, по которой сценарий выполнялся после вызова <script>$('#my-widget-container').fetchfeed({/*parameters*/});</script>
. Так что .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
});
}
}
Код на сайте / блоге пользователя будет
<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>
Функция будет выполнена после завершения загрузки страницы.