2015-12-03 15 views
6

मेरे पास सी # कोड है जो SQL में एक क्वेरी चलाता है और लगभग 2000 पंक्तियां देता है। फिर एक वृक्षदृश्य नियंत्रण बनाया जाता है और मेरा मुख्य पृष्ठ जोड़ा जाता है। यह लगभग तुरंत किया जाता है, जो अच्छा है।खोज के लिए जावास्क्रिप्ट कोड अनुकूलन()

var orgId = $('select[name="ctl00$PageContent$FunctionsDropDownList"] option:selected').val(); 
     if (!orgId) { 
      return false; 
     } 
     //calls serverside get data 
     //This line happens quickly 
     $('#ctl00_PageContent_HiddenRulesDialogTriggerButton').click(); 

     //This part takes about 10-15 minutes to finally get to the true 
     var i = setInterval(function() { 
      if ($('#ctl00_PageContent_treeview').find('table').length > 0) 
      { 
       clearInterval(i); 
       StartDialog(); 
       return false; 
      } 
     }); 

तो यह 10-15 मिनट का समय लगता clearInterval(i) हिट करने के लिए। जब यह करता है, i = 978। यकीन नहीं है कि यह इतना लंबा क्यों लगेगा। संभवतः find() वास्तव में धीमा है। क्या कोई वैकल्पिक विकल्प सुझाता है?

संपादित

Version of Internet Explorer

+3

मतदान करना ऐसा करने का सही तरीका नहीं है। संभवतः जब आप डेटा प्राप्त करने के लिए सर्वर को कॉल करते हैं, तो आप '$ .ajax()' का उपयोग कर रहे हैं। जब डेटा आता है तो आपका कॉलबैक कॉल किया जाएगा। शायद यह कॉलबैक पहले से ही आपके कोड में है और इसका उपयोग ट्रीव्यू कंट्रोल को पॉप्युलेट करने के लिए किया जा रहा है। TreeView आपके संवाद को प्रदर्शित करने के लिए पॉप्युलेट होने के बाद आपको अतिरिक्त कोड जोड़ने की आवश्यकता है। – Brandon

+0

आप वृक्षदृश्य कैसे बनाते हैं? जब आप 'वृक्षदृश्य निर्माण कार्रवाई' समाप्त हो जाते हैं तो क्या आप इस 'StartDialog' को कॉलबैक के रूप में संलग्न नहीं कर सकते हैं? – jolmos

+0

मैंने जावास्क्रिप्ट कोड नहीं लिखा, लेकिन मैं इसे ठीक करने की कोशिश कर रहा हूं। पेड़दृश्य पीछे कोड में बनाया गया है। फिर StartDialog() पॉपअप बनाता है और वृक्षदृश्य HTML जोड़ता है। लेकिन StartDialog() समस्या नहीं है। खोज में बाधा आ रही है() –

उत्तर

1

, .one(), DOMNodeInserted घटना का उपयोग कर document को घटना सौंपने के लिए प्रयास करें।

function StartDialog(el) { 
 
    console.log(el) 
 
} 
 

 
$(document) 
 
.one("DOMNodeInserted" 
 
, "#ctl00_PageContent_treeview table" 
 
, function(e) { 
 
    StartDialog(this) 
 
}); 
 

 
$("#ctl00_PageContent_treeview").append("<table></table>")
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> 
 
</script> 
 
<div id="ctl00_PageContent_treeview"></div>

2

समस्या शायद तथ्य यह है कि आप दूसरा तर्क के बिना setInterval बुला रहे हैं (समय अंतराल)

के अपने कोड करने के लिए लगता है क्या पर नजर डालते हैं है।

  1. बैकएंड क्वेरी करें, पेड़दृश्य बनाने के लिए आवश्यक डेटा खींचें। यह तेजी से किया जाता है।
  2. पेड़ को असीमित रूप से बनाएं।
  3. जबकि पेड़ बना रहा है, यह देखने के लिए इसे ढूंढें() यह देखने के लिए कि यह तैयार है या नहीं।

कुछ समस्याएं।

  1. सभी डोम क्वेरी गैर-डोम डेटा मैनिपुलेशन की तुलना में धीमी हैं। तो हां, ढूंढें() सबसे तेज़ फ़ंक्शन नहीं है क्योंकि यह आपके द्वारा निर्दिष्ट मूल ऑब्जेक्ट से शुरू होने वाले पूरे डोम को खोजता है और जो ऑब्जेक्ट पाता है उसे वापस देता है।
  2. आप सिर्फ एक तर्क आप पसंद करते हैं के साथ setInterval चलाते हैं:

कोड:

var timer_id = setInterval(function() { 
    ...code here... 
}); 

... मैं इसे हर मिलीसेकंड निष्पादित करता है। मैं इस कोड के साथ इस परीक्षण किया है:

var k = 1; 
var i = setInterval(function() { 
    if (k < 100) 
    { 
     k += 1; 
    } else { 
     clearInterval(i); 
     window.alert('Finished!'); 
    } 
//No second argument 
}); 

... और यह लगभग तुरंत समाप्त हो गया।

तो मुझे लगता है कि यह इतनी धीमी गति से चल रहा है क्योंकि कार्यक्रम प्रति सेकंड सैकड़ों बार एक महंगा डोम खोज फायर कर रहा है। समाधान हैं:

  1. उस कार्य को प्रदान करें जो आपको पेड़ के निर्माण के अंत में एसिंक्रोनस बिल्डिंग फ़ंक्शन के कॉलबैक के रूप में आवश्यकतानुसार प्रदान करता है। इस तरह आप जांच करने की जरूरत को खत्म करते हैं।
  2. setInterval के लिए एक समय अंतराल की आपूर्ति और देखने के लिए अगर यह कार्यक्रम को मुक्त दोहराया चेकों की जगह पेड़ का निर्माण करने से आपकी समस्या हल करती है का प्रयास करें:

कोड:

var i = setInterval(function() { 
    if ($('#ctl00_PageContent_treeview').find('table').length > 0) 
    { 
     clearInterval(i); 
     StartDialog(); 
     return false; 
    } 
//Once per second 
},1000); 

एक कॉलबैक हैं बेहतर अभ्यास करें लेकिन समय अंतराल की आपूर्ति शायद भी काम करेगा।

+0

मैंने इसे 5000 एमएस पर भी कोशिश की, लेकिन समग्र मुद्दा आईई है। मैं उस कोड को चला गया, अंतराल 5000 पर सेट किया गया, और यह हमेशा के लिए लिया। जैसे ही मैंने इसे फ़ायरफ़ॉक्स में चलाया, इसे प्रदर्शित करने में लगभग 2-3 सेकंड लग गए। –

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