Uncaught TypeError: Невозможно установить свойство 'FUNCTION_NAME' из неопределенного для реализации виджета - PullRequest
2 голосов
/ 19 октября 2011

Я пытаюсь разработать виджет 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 и не может загрузить виджет. Что может быть не так?

Удивительно, но этот код виджета работает на моем сайте на localhost !!!

Ответы [ 2 ]

0 голосов
/ 22 октября 2011

Хорошо, после бесчисленных попыток я решил это и научился многим вещам. Тем не менее я неясен во многих вещах. Исправьте меня, отредактировав этот ответ, или, пожалуйста, прокомментируйте, если что-то не так.

Первый $.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>

Функция будет выполнена после завершения загрузки страницы.

0 голосов
/ 19 октября 2011

Если jQuery не был определен до выполнения вашего кода, вы получите TypeError здесь:

$.fn.fetchfeed

, потому что $ не является объектом jQuery.Попробуйте переместить эту строку и следующий код в main() в конструкцию jQuery(document).ready(function($){ ... }); выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...