2017-11-03 9 views
5

मैं दिनांक की जांच करने के लिए 2 JSON फ़ीड्स का उपयोग कर रहा हूं और ऑब्जेक्ट्स में से किसी एक में तारीख के आधार पर डेटा प्रदर्शित कर रहा हूं, लेकिन किसी कारण से परिवर्तनीय सी वस्तु है अपरिभाषित है जब मैं हार्डकोडेड यूआरएल के साथ 'तत्वों' समारोह में डेटा की जगह, सब कुछ ठीक काम करता है, लेकिन मुझे यकीन है कि क्यों डेटा सी वस्तु के अंदर संग्रहित नहीं है नहीं कर रहा हूँ:जेएसओएन फ़ीड ऑब्जेक्ट से जावास्क्रिप्ट वैरिएबल

jQuery(function ($) { 
    var url1 = 'feed1.json'; 
    var url2 = 'feed2.json'; 
    var id = shop_id.replace(/\[|\]|\"/g, ''); 
    var c = {}; 
    var logo; 

    $.when(request1(), request2()).done(function (r1, r2) { 
     var results1 = $.grep(r1[0], function (e) {return e.id == id}); 
     var results2 = $.grep(r2[0], function (e) {return e.shop_id == id}); 
     var fallback = $.grep(r2[0], function (e) {return e.PSN == 'fallback160'}); 

     if (!$.isEmptyObject(results2)) { 

      if (!$.isEmptyObject(results1)) { 

       var today = new Date(); 
       var endDate = formatDate(results1[0].Ende); 
       var startDate = formatDate(results1[0].Start); 

       console.log(endDate); 
       console.log(startDate); 

       if (today <= endDate && today >= startDate) { 
        c = {'one': results1[0].INC_Suffix, 'separator': ' bis ', 'two': results1[0].Ende, 'link': results1[0].Deeplink, 'logo': results2[0].logo_url}; 
        elements(); 
       } 

      } 
      else { 
       c = {'one': results2[0].STD_INC_Factor, 'separator': ' ', 'two': results2[0].STD_INC_Suffix, 'link': results2[0].deeplink, 'logo': results2[0].logo_url}; 
       elements(); 
      } 
     } 
     else { 
      $('#clicktag').html('<img src="' + fallback[0].logo_url + '">').attr('href', clicktag + encodeURIComponent(fallback[0].deeplink)); 
     } 

     //resize fonts based on height of the container 
     var intBoxHeight = $('#interupter').height(); 
     var intInnerHeight = $('#interupterInner').height(); 
     var intFontSize = parseInt($('#interupterInner').css('font-size')); 

     while (intInnerHeight > intBoxHeight) { 
      --intFontSize; 
      $('#interupterInner').css('font-size', intFontSize + 'px'); 
      intBoxHeight = $('#interupter').height(); 
      intInnerHeight = $('#interupterInner').height(); 
     } 

    }).fail(function() { 
     c = {'one': 'DIE BESTEN', 'separator': ' ', 'two': 'ANGEBOTE', 'link': '#', 'logo': 'img/fallback.png'}; 
     elements(); 
    }) 

    function elements() { 
     $('#storeLogo span').html('<img src=\'' + c.logo + '\'>'); 
     $('#interupterInner').html(c.one + c.separator + c.two); 
     $('#clicktag').attr('href', clicktag + encodeURIComponent(c.link)); 
     tl.play();  
    } 

    function formatDate (d) { 
     var part = d.split('.'); 
     return new Date(part[1] + '.' + part[0] + '.' + part[2]); 
    } 

    console.log(elements()); 
    function request1() {return $.getJSON(url1)}; 
    function request2() {return $.getJSON(url2)}; 

}) 
+0

अनुमान में, अनुरोधों के परिणाम कभी भी उन शर्तों को पूरा नहीं करते हैं जो 'c' मान को असाइन करने के लिए नेतृत्व करते हैं। मेरी सलाह है कि आप अपने ब्राउज़र के जावास्क्रिप्ट डीबगर – Phil

+0

के साथ कदम उठाना चाहते हैं क्षमा करें, मैं यह उल्लेख करना भूल गया था कि समस्या फ़ायरफ़ॉक्स में होती है, क्रोम में यह ठीक काम करता है। – wintermute

+0

इसके अलावा, मैं कंसोल में कुछ भी लॉग इन नहीं कर सकता। – wintermute

उत्तर

1

जब मैं कोड पढ़ता हूं तो मैं सोच रहा था कि क्या आप कहीं भी परिवर्तनीय c का उपयोग करने की योजना बना रहे हैं - यदि नहीं, तो इसे प्रत्येक दायरे में स्थानीय रूप से घोषित करने पर विचार करें और इसे पैरामीटर के रूप में पास करें, यानी elements(c)

मैंने आसान विश्लेषण के लिए उदाहरण को थोड़ा सा तोड़ दिया क्योंकि आपको लगता है कि केवल चर के साथ समस्या है। नीचे सरलीकृत स्निपेट में मैंने return c.one + ' ' + c.two; जोड़ा क्योंकि यह आपके elements() फ़ंक्शन में अनुपलब्ध था, और मैंने चर clicktag के लिए एक घोषणा जोड़ा।

कि इसके अलावा, मैंने देखा है कि console.log(elements());done और fail कार्यों के बाहर कहा जाता है - यदि अनुरोध चल रहा है लंबे समय तक वहाँ एक रेस स्थिति पैदा कर रहा है जब लॉग समारोह कहा जाता है c अभी तक प्रारंभ नहीं किया जा रहा है हो सकता है। यदि आपका परीक्षण बताता है कि यह मामला है, तो प्रत्येक फ़ंक्शन (done और fail) के अंदर लॉग स्टेटमेंट कॉल डालें।

नीचे दिया गया कोड - अनुरोध विलंब के बिना - ठीक चल रहा है (इंटरनेट एक्सप्लोरर और क्रोम - मेरे पास फ़ायरफ़ॉक्स को परीक्षण करने के लिए इंस्टॉल नहीं किया गया है, शायद आप इसे नीचे स्निपेट के साथ कर सकते हैं और मुझे बताएं):

jQuery(function($) { 
 
    var c = {}; 
 
    var clicktag="https://stackoverflow.com/questions/47086470/javascript-variable-from-json-feed-object-not-recognized/47089907?noredirect="; 
 
    $.when(SampleRequest(1), SampleRequest(2)).done(function(r1, r2) { 
 
    c = { 
 
     'one': 'SUCCESS - DIE BESTEN', 
 
     'separator': ' ', 
 
     'two': 'ANGEBOTE', 
 
     'link': '1#', 
 
     'logo': 'img/fallback.png' 
 
    }; 
 
    elements(); 
 
    }).fail(function() { 
 
    c = { 
 
     'one': 'FAIL - DIE BESTEN', 
 
     'separator': ' ', 
 
     'two': 'ANGEBOTE', 
 
     'link': '1#', 
 
     'logo': 'img/fallback.png' 
 
    }; 
 
    elements(); 
 
    }) 
 

 
    // change: commented tl.play, and added return statement 
 
    function elements() { 
 
    $('#storeLogo span').html('<img src=\'' + c.logo + '\'>'); 
 
    $('#interupterInner').html(c.one + c.separator + c.two); 
 
    $('#clicktag').attr('href', clicktag + encodeURIComponent(c.link)); 
 
    //tl.play();  
 
    return c.one + ' ' + c.two; 
 
    } 
 

 
    function formatDate(d) { 
 
    var part = d.split('.'); 
 
    return new Date(part[1] + '.' + part[0] + '.' + part[2]); 
 
    } 
 

 
    console.log(elements()); 
 

 
    function SampleRequest(reqId) { 
 
    return "{id:'" + reqId + "'}"; 
 
    }; 
 

 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<span id='Storelogo'></span> 
 
<div id='interupterInner'></div> 
 
<div id='interupterInner'></div> 
 
<a id='clicktag'>click me</a>

अद्यतन: टिप्पणी में की जबाबwintermute के अनुसार, त्रुटि के लिए कारण फ़ायरफ़ॉक्स में सख्त दिनांक पार्स है।

मुझे एक अच्छा लिंक मिला है कि here को पार्स करने के लिए दिनांक को सही तरीके से प्रारूपित करने का वर्णन किया गया है। संक्षेप में, अगर आप दिनांक विभाजक के रूप में . की अवधि के बजाय आगे स्लैश / का उपयोग कर रहे हैं, तो ऐसा लगता है।

हालांकि, मैंने अब इसे latest Firefox version 57 के साथ आजमाया है, लेकिन इस व्यवहार को पुनः प्राप्त नहीं कर सकता - कोड स्निपेट मेरे पीसी पर किसी भी संशोधन के बिना ठीक चलाता है।

+0

आपकी मदद के लिए धन्यवाद! मुझे लगता है कि यह मुद्दा दिनांक स्वरूपण में है। जब मैं एंड्रॉइड लॉग ऑन करता हूं और क्रोम में डेटडेट शुरू करता हूं तो यह तिथियां दिखाता है, लेकिन एफएफ में 'अमान्य तिथि' – wintermute

+0

कहता है, विशेष रूप से यदि 2 ब्राउज़रों की अलग-अलग तारीख और/या भाषा सेटिंग्स होती हैं। FormatDate फ़ंक्शन के अंदर त्रुटि को पकड़ने और वहां विभिन्न मामलों को संभालने का प्रयास करें। या आईएसओ दिनांक प्रारूप (yyyy-mm-dd) का उपयोग करें, जिसे प्रत्येक ब्राउज़र द्वारा समान तरीके से व्याख्या किया जाना चाहिए (उदा। "2017-11-06 17:42:00")। यदि आवश्यक नहीं है तो समय छोड़ दें। – Matt

+0

बात यह है कि फ़ीड ऑब्जेक्ट में दिनांक "06.11.2017" जैसा स्वरूपित किया गया है। दरअसल वे स्ट्रिंग्स हैं, तिथियां नहीं हैं, और जब उन्हें पार्स किया जाता है और नई डेट ऑब्जेक्ट में डाला जाता है, किसी कारण से उन्हें केवल एफएफ में मान्य तिथियों के रूप में पहचाना नहीं जाता है, जबकि क्रोम में वे होते हैं। – wintermute

0

क्या आप वाकई सही ढंग से jquery लोड कर रहे हैं कि कर रहे हैं ? अपने सर्वर में jquery.min.js फ़ाइल डालने का प्रयास करें और इसे अपने डोमेन से लोड करें।

+0

निश्चित रूप से एक jquery मुद्दा नहीं, मैंने कोशिश की, कोई बदलाव नहीं। – wintermute

संबंधित मुद्दे