Jquery скрипт не загружается в логическом порядке - PullRequest
0 голосов
/ 17 июня 2020

Я получил этот код здесь, в файле JS, где я поместил два console.log(), один в начале и один в конце, чтобы понять, почему у меня проблемы с таргетингом с указанием c ID / класс. Теперь я вижу, что console.log() в конце загружается раньше, чем в начале. Даже когда я помещаю console.log() вне файла под тегом <script>, который загружает этот JS файл, он загружается перед файлом JS, что для меня не имеет никакого смысла. Как я могу исправить эту проблему?

/*!
 * jquery.instagramFeed
 *
 * @version 1.2.7
 *
 * @author Javier Sanahuja Liebana <bannss1@gmail.com>
 * @contributor csanahuja <csanahuja10@gmail.com>
 *
 * https://github.com/jsanahuja/jquery.instagramFeed
 *
 */
(function($){
    var defaults = {
        'host': "https://www.instagram.com/",
        'username': 'username',
        'tag': '',
        'container': '#instagram',
        'display_profile': true,
        'display_biography': true,
        'display_gallery': true,
        'display_igtv': false,
        'get_data': false,
        'callback': null,
        'styling': true,
        'items': 8,
        'items_per_row': 4,
        'margin': 0.5,
        'image_size': 640
    };
    var image_sizes = {
        "150": 0,
        "240": 1,
        "320": 2,
        "480": 3,
        "640": 4
    };
    var escape_map = {
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;',
        '"': '&quot;',
        "'": '&#39;',
        '/': '&#x2F;',
        '`': '&#x60;',
        '=': '&#x3D;'
    };
    function escape_string(str){
        return str.replace(/[&<>"'`=\/]/g, function (char) {
            return escape_map[char];
        });
    }

    $.instagramFeed = function(opts){


      //console log at the beginning of the function
      console.log("Beginning instagramFeed");



        var options = $.fn.extend({}, defaults, opts);
        if(options.username == "" && options.tag == ""){
            console.error("Instagram Feed: Error, no username or tag found.");
            return false;
        }
        if(typeof options.get_raw_json !== "undefined"){
            console.warn("Instagram Feed: get_raw_json is deprecated. See use get_data instead");
            options.get_data = options.get_raw_json;
        }
        if(!options.get_data && options.container == ""){
            console.error("Instagram Feed: Error, no container found.");
            return false;
        }
        if(options.get_data && options.callback == null){
            console.error("Instagram Feed: Error, no callback defined to get the raw json");
            return false;
        }

        var is_tag = options.username == "",
            url = is_tag ? options.host + "explore/tags/"+ options.tag + "/" : options.host + options.username + "/";

        $.get(url, function(data){
            try{
                data = data.split("window._sharedData = ")[1].split("<\/script>")[0];
            }catch(e){
                console.error("Instagram Feed: It looks like the profile you are trying to fetch is age restricted. See https://github.com/jsanahuja/InstagramFeed/issues/26");
                return;
            }
            data = JSON.parse(data.substr(0, data.length - 1));
            data = data.entry_data.ProfilePage || data.entry_data.TagPage;
            if(typeof data === "undefined"){
                console.error("Instagram Feed: It looks like YOUR network has been temporary banned because of too many requests. See https://github.com/jsanahuja/jquery.instagramFeed/issues/25");
                return;
            }
            data = data[0].graphql.user || data[0].graphql.hashtag;

            if(options.get_data){
                options.callback(data);
                return;
            }   

            //Setting styles
            var styles = {
                'profile_container': "",
                'profile_image': "",
                'profile_name': "",
                'profile_biography': "",
                'gallery_image': ""
            };
            if(options.styling){
                styles.profile_container = " style='text-align:center;'";
                styles.profile_image = " style='border-radius:10em;width:15%;max-width:125px;min-width:50px;'";
                styles.profile_name = " style='font-size:1.2em;'";
                styles.profile_biography = " style='font-size:1em;'";
                var width = (100 - options.margin * 2 * options.items_per_row)/options.items_per_row;
                styles.gallery_image = " style='margin:"+options.margin+"% "+options.margin+"%;width:"+width+"%;float:left;'";
            }

            var html = "";
            //Displaying profile
            if(options.display_profile){
                html += "<div class='instagram_profile'" +styles.profile_container +">";
                html += "<img class='instagram_profile_image' src='"+ data.profile_pic_url +"' alt='"+ (is_tag ? data.name + " tag pic" : data.username + " profile pic") +"'"+ styles.profile_image +" />";
                if(is_tag)
                    html += "<p class='instagram_tag'"+ styles.profile_name +"><a href='https://www.instagram.com/explore/tags/"+ options.tag +"' rel='noopener' target='_blank'>#"+ options.tag +"</a></p>";
                else
                    html += "<p class='instagram_username'"+ styles.profile_name +">@"+ data.full_name +" (<a href='https://www.instagram.com/"+ options.username +"' rel='noopener' target='_blank'>@"+options.username+"</a>)</p>";

                if(!is_tag && options.display_biography)
                    html += "<p class='instagram_biography'"+ styles.profile_biography +">"+ data.biography +"</p>";

                html += "</div>";
            }

            //image size
            var image_index = typeof image_sizes[options.image_size] !== "undefined" ? image_sizes[options.image_size] : image_sizes[640];

            if(options.display_gallery){
                if(typeof data.is_private !== "undefined" && data.is_private === true){
                    html += "<p class='instagram_private'><strong>This profile is private</strong></p>";
                }else{
                    var imgs = (data.edge_owner_to_timeline_media || data.edge_hashtag_to_media).edges;
                        max = (imgs.length > options.items) ? options.items : imgs.length;

                    html += "<div class='instagram_gallery'>";
                    for(var i = 0; i < max; i++){
                        var url = "https://www.instagram.com/p/" + imgs[i].node.shortcode,
                            image, type_resource, caption, date, likes, comments;


                        switch(imgs[i].node.__typename){
                            case "GraphSidecar":
                                type_resource = "sidecar"
                                image = imgs[i].node.thumbnail_resources[image_index].src;
                                date = new Date(imgs[i].node.taken_at_timestamp * 1000);
                                likes = imgs[i].node.edge_media_preview_like.count;
                                comments = imgs[i].node.edge_media_to_comment.count;
                                break;
                            case "GraphVideo":
                                type_resource = "video";
                                image = imgs[i].node.thumbnail_src
                                break;
                            default:
                                type_resource = "image";
                                image = imgs[i].node.thumbnail_resources[image_index].src;
                                date = new Date(imgs[i].node.taken_at_timestamp * 1000);
                                likes = imgs[i].node.edge_media_preview_like.count;
                                comments = imgs[i].node.edge_media_to_comment.count;
                        }
                                console.log(date);
                                console.log(likes);
                                console.log(comments);

                        if(
                            typeof imgs[i].node.edge_media_to_caption.edges[0] !== "undefined" && 
                            typeof imgs[i].node.edge_media_to_caption.edges[0].node !== "undefined" && 
                            typeof imgs[i].node.edge_media_to_caption.edges[0].node.text !== "undefined" && 
                            imgs[i].node.edge_media_to_caption.edges[0].node.text !== null
                        ){
                            caption = imgs[i].node.edge_media_to_caption.edges[0].node.text;
                        }else if(
                            typeof imgs[i].node.accessibility_caption !== "undefined" && 
                            imgs[i].node.accessibility_caption !== null
                        ){
                            caption = imgs[i].node.accessibility_caption;
                        }else{
                            caption = (is_tag ? data.name : data.username) + " image " + i;
                        }

                        html += "<a id='instagramID" + i + "' class='instagramimg instagram-" + type_resource + "' rel='noopener' target='_blank'>";
                        html += "<img class='instagramicon' src='https://cdn.shopify.com/s/files/1/0278/9644/7113/files/instagram-icon.svg?v=1592246117' alt='instagramicon'>";
                        html += "<div class='instagramhover'></div>";
                        html += "<img src='" + image + "' alt='" + escape_string(caption) + "'"/* + styles.gallery_image*/ +" />";
                        html += "</a>";
                    }

                  }
                }


            if(options.display_igtv && typeof data.edge_felix_video_timeline !== "undefined"){
                var igtv = data.edge_felix_video_timeline.edges,
                    max = (igtv.length > options.items) ? options.items : igtv.length
                if(igtv.length > 0){
                    html += "<div class='instagram_igtv'>";
                    for(var i = 0; i < max; i++){
                        html += "<a href='https://www.instagram.com/p/"+ igtv[i].node.shortcode +"' rel='noopener' target='_blank'>";
                        html += "<img src='"+ igtv[i].node.thumbnail_src +"' alt='"+ options.username +" instagram image "+ i+"'"+styles.gallery_image+" />";
                        html += "</a>";
                    }
                    html += "</div>";
                }
            }

            $(options.container).html(html);
        }).fail(function(e){
            console.error("Instagram Feed: Unable to fetch the given user/tag. Instagram responded with the status code: ", e.status);
        });

        return true;
    };


  // Ending of the code
  console.log("Ending instagramFeed");



})(jQuery);

Эта функция вызывается так в части html. Также здесь console.log("before instagramFeed.JS"); загружается вместе с console.log("after instagramFeed.JS");, и после этого я получаю

    console.log(date);
    console.log(likes);
    console.log(comments);

, которые находятся внутри for l oop функции.

<script src="{{ 'jquery.instagramFeed.js' | asset_url }}"></script>
      <div id="instagram"></div> 
      <script>
        console.log("before instagramFeed.JS");
          (function($){
              $(window).on('load', function(){
                  $.instagramFeed({
                      'username': 'username',
                      'container': "#instagram",
                      'display_profile': false,
                      'display_biography': false,
                      'display_gallery': true,
                      'callback': null,
                      'styling': true,
                      'items': 10,
                      'items_per_row': 5,
                      'margin': 0.2 
                  });
              });
          })(jQuery);
        console.log("after instagramFeed.JS");
      </script>

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Ваш код выполняется в следующем порядке:

  • первый фрагмент (определение instagramFeed плагина) выполняется во время загрузки страницы. console.log операторы вне этого плагина также выполняются.
  • окно загружается (все содержимое тегов script читается и выполняется), ваш обработчик загрузки окна срабатывает. Он вызывает вашу функцию instagramFeed так, как вы установите его во втором фрагменте. Здесь выполняется before/after instagramFeed.JS логов. Функция instagramFeed запускает сетевой вызов, результат которого обрабатывается после завершения работы обработчика нагрузки.
  • Ответ на сетевой вызов обрабатывается. комментарии, лайки и дата регистрируются на этом этапе.

В результате все работает, как ожидалось, если я правильно понимаю цель.

UPD : чтобы использовать элементы, сгенерированные обработчиком ответа на сетевой вызов (при условии, что у вас есть возможность напрямую редактировать код плагина), вы можете добавить функцию в объект options, например onImageElementsCreated и назовите его после l oop в плагине. Затем вы можете указать свою функцию в качестве другого варианта во втором фрагменте.

0 голосов
/ 17 июня 2020

Я не могу сказать это со 100% уверенностью, так как я не запускал код. Однако мне кажется, что строка console.log ("Ending instagramFeed"); запускается перед строкой console.log ("Beginning instagramFeed");, потому что она находится за пределами функции $ .instagramFeed = function (opts).

Функция создается, затем вызывается конечная строка журнала, затем что-то вызывает функцию, затем вызывается начальная строка журнала.

Где в вашем коде вы вызываете $ .instagramFeed ()?

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