2017-07-18 5 views
13

js में एक फ़ंक्शन है जो तालिका में संदेश प्रदर्शित करता है (संदेश json में संग्रहीत हैं)। Google क्रोम में, यह काम करता है, लेकिन सफारी, ओपेरा या माइक्रोसॉफ्ट एज - नहीं! कोड में एक गलती है जो setTimeout (callback, 5000) पर कॉल से जुड़ा हुआ है (कॉलबैक को कुछ भी नहीं भेजा जाता है)। इसलिए, For (var i = 0; i <respond.length; i ++)respond === undefined के बाद से काम नहीं करेगा।सफारी या ओपेरा में मेरा कोड क्यों काम नहीं करता है?

लेकिन ऐसा क्यों है?

callback(
 
    [{ 
 
     "time": "1500303264", 
 
     "user": "qwe", 
 
     "message": "we", 
 
     "id": 1 
 
    }, 
 
    { 
 
     "time": "1500303987", 
 
     "user": "Max", 
 
     "message": "q", 
 
     "id": 2 
 
    } 
 
    ]); 
 

 
function smile(mess) { 
 
    var smile = ":)"; 
 
    var graficSmile = "<img src = './image/Smile.png' alt='Smile' align='middle'>"; 
 
    var string_with_replaced_smile = mess.replace(smile, graficSmile); 
 

 
    var sad = ":(" 
 
    var graficSad = "<img src = './image/Sad.png' alt='Smile' align='middle'>"; 
 
    var string_with_replaced_smile_and_sad = string_with_replaced_smile.replace(sad, graficSad); 
 

 
    return string_with_replaced_smile_and_sad; 
 
} 
 

 
$.getJSON('data/messages.json', callback); 
 
var exists = []; 
 

 
function callback(respond) { 
 
    var timeNow = Date.now(); 
 

 
    for (var i = 0; i < respond.length; i++) { 
 
    var data = respond[i]; 
 

 
    if (exists.indexOf(data.id) != -1) continue; 
 

 
    var timeInMessage = data.time * 1000; 
 
    var diff_time = (timeNow - timeInMessage); 
 

 
    if (diff_time <= 3600000) { 
 
     var rowClone = $('.mess_hide').clone().removeClass('mess_hide'); 
 

 
     var newDate = new Date(timeInMessage); 
 
     var dateArray = [newDate.getHours(), newDate.getMinutes(), newDate.getSeconds()] 
 
     var res = dateArray.map(function(x) { 
 
     return x < 10 ? "0" + x : x; 
 
     }).join(":"); 
 

 
     $('#messages').append(rowClone); 
 
     $('.time', rowClone).html(res); 
 
     $('.name', rowClone).html(data.user); 
 
     $('.message', rowClone).html(smile(data.message)); 
 
     $('.scroller').scrollTop($('#messages').height()); 
 

 
     exists.push(data.id); 
 
    } 
 
    } 
 
    setTimeout(function(){callback(respond)}, 5000); 
 
}
.scroller { 
 
    width: 490px; 
 
    height: 255px; 
 
    max-height: 255px; 
 
    overflow-y: auto; 
 
    overflow-x: hidden; 
 
} 
 

 
table#messages { 
 
    min-height: 260px; 
 
    width: 100%; 
 
    background: #fffecd; 
 
    border: none; 
 
} 
 

 
table#messages::-webkit-scrollbar { 
 
    width: 1em; 
 
} 
 

 
table#messages::-webkit-scrollbar-track { 
 
    -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); 
 
} 
 

 
table#messages::-webkit-scrollbar-thumb { 
 
    background-color: darkgrey; 
 
    outline: 1px solid slategrey; 
 
} 
 

 
tr { 
 
    height: 20%; 
 
    display: block; 
 
} 
 

 
td.time, 
 
td.name { 
 
    width: 70px; 
 
    max-width: 75px; 
 
    text-align: center; 
 
} 
 

 
td.name { 
 
    font-weight: bold; 
 
} 
 

 
form#text_submit { 
 
    display: inline-flex; 
 
    align-items: flex-start; 
 
} 
 

 
input#text { 
 
    width: 370px; 
 
    height: 30px; 
 
    margin-top: 20px; 
 
    background: #fffecd; 
 
    font-family: 'Montserrat'; 
 
    font-size: 16px; 
 
    border: none; 
 
    align-self: flex-start; 
 
} 
 

 
input#submit { 
 
    padding: 0; 
 
    margin-left: 21px; 
 
    margin-top: 21px; 
 
    height: 30px; 
 
    width: 95px; 
 
    background: #635960; 
 
    border: none; 
 
    color: white; 
 
    font-family: 'Montserrat'; 
 
    font-size: 16px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="scroller"> 
 
    <table id="messages"> 
 
    <tr class="mess_hide"> 
 
     <td class="time"></td> 
 
     <td class="name"></td> 
 
     <td class="message"></td> 
 
    </tr> 
 
    </table> 
 
</div> 
 
<form method="POST" id="easyForm"> 
 
    <input type="text" name="text" id="text"> 
 
    <input type="submit" value="Send" id="submit"> 
 
</form> 
 
</div>

क्रोम Chrome

ओपेरा Opera

उत्तर

13
  1. चूंकि यह है कि var exists माना जाता है - सरणी, लेकिन सरणी का मान ([]) कॉल $.getJSON(...) पर कॉल करने के बाद ही इसे सौंपा गया है। तो, जब callback पहली बार मूल्य []exists हम के लिए सेट नहीं है, के लिए कहा जाता है तो बस callback.
  2. callback टाइमर द्वारा कहा जाता है जब की पहली कॉल ऊपर var exists बढ़ने की जरूरत है, कुछ भी नहीं करने के लिए पारित कर दिया है। लेकिन टाइमर को फ़ाइल से संदेशों को दोबारा पढ़ने की जरूरत है और उन्हें स्क्रीन पर प्रदर्शित करना होगा। इसलिए, setTimeout(function(){callback(respond)}, 5000); हमें setTimeout(function(){$.getJSON('data/messages.json', callback);}, 5000); की आवश्यकता है।

var exists = []; 
 
$.getJSON('data/messages.json', callback); 
 

 
function callback(respond) { 
 
    var timeNow = Date.now(); 
 

 
    for (var i = 0; i < respond.length; i++) { 
 
    var data = respond[i]; 
 

 
    if (exists.indexOf(data.id) != -1) continue; 
 

 
    var timeInMessage = data.time * 1000; 
 
    var diff_time = (timeNow - timeInMessage); 
 

 
    if (diff_time <= 3600000) { 
 
     var rowClone = $('.mess_hide').clone().removeClass('mess_hide'); 
 

 
     var newDate = new Date(timeInMessage); 
 
     var dateArray = [newDate.getHours(), newDate.getMinutes(), newDate.getSeconds()] 
 
     var res = dateArray.map(function(x) { 
 
     return x < 10 ? "0" + x : x; 
 
     }).join(":"); 
 

 
     $('#messages').append(rowClone); 
 
     $('.time', rowClone).html(res); 
 
     $('.name', rowClone).html(data.user); 
 
     $('.message', rowClone).html(smile(data.message)); 
 
     $('.scroller').scrollTop($('#messages').height()); 
 

 
     exists.push(data.id); 
 
    } 
 
    } 
 
    setTimeout(function() { 
 
    $.getJSON('data/messages.json', callback); 
 
    }, 5000); 
 
}

+0

क्या आप किसी भी व्यक्ति के लिए अपना उत्तर समझा नहीं सकते हैं, बस कहें कि आपने एक समय निकाला है और क्यों। –

+1

@ मार्टिन बार्कर हां। नया जवाब देखें। –

5

callback के बाद से एक सरणी एक तर्क के रूप में पारित करने की आवश्यकता है, setTimeout सुनिश्चित करना चाहिए कि जब यह callback कहता है, यह पी सरणी asses।

बदलें

setTimeout(callback, 5000);

setTimeout(function(){callback(respond)}, 5000);

जो कॉलबैक को उस अज्ञात फ़ंक्शन setTimeout द्वारा बुलाया जाएगा के शरीर के रूप में एक तर्क के साथ कॉल करने की अनुमति देता है।

इसके अलावा, एक पक्ष नोट के रूप में, यदि आप एक गिनती for पाश के बजाय respond.forEach() इस्तेमाल किया, कोड अधिक स्वच्छ होगा:

respond.forEach(function(data) { 

    if (exists.indexOf(data.id) != -1) continue; 

    var timeInMessage = data.time * 1000; 
    var diff_time = (timeNow - timeInMessage); 

    if (diff_time <= 3600000) { 
     var rowClone = $('.mess_hide').clone().removeClass('mess_hide'); 

     var newDate = new Date(timeInMessage); 
     var dateArray = [newDate.getHours(), newDate.getMinutes(), newDate.getSeconds()] 
     var res = dateArray.map(function(x) { 
     return x < 10 ? "0" + x : x; 
     }).join(":"); 

     $('#messages').append(rowClone); 
     $('.time', rowClone).html(res); 
     $('.name', rowClone).html(data.user); 
     $('.message', rowClone).html(smile(data.message)); 
     $('.scroller').scrollTop($('#messages').height()); 

     exists.push(data.id); 
    } 
    }); 
+0

मैं अपने संपादन शुरू की है, लेकिन अब कोड बिल्कुल संदेशों को प्रदर्शित करने बंद कर दिया है। हालांकि त्रुटि वहां नहीं है) –

+0

लेकिन 'प्रतिक्रिया' का मूल्य कहां से आना चाहिए? प्रश्न में कोड की वर्तमान स्थिति में, 'setTimeout() 'पास' प्रतिक्रिया 'पास करता है लेकिन इसे कहीं भी परिभाषित नहीं किया जाता है। (ऐसा लगता है कि इसे '$ .getJSON() 'कॉल से वापस आना चाहिए, इसलिए मुझे यकीन नहीं है कि टाइमआउट चीज में भी आंकड़े कैसे हैं। – Pointy

+0

@ पॉइंट हां, लेकिन अगर यह प्रकट नहीं होता है तो क्या गलत है? –

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