2010-09-02 17 views
28

मेरे पास ऐसा पृष्ठ है जिसमें पृष्ठ लोड पर चलाने के लिए कुछ जावास्क्रिप्ट है। ने कहा कि जावास्क्रिप्ट को सर्वरकंट्रोल के क्लाइंट-साइड घटक का पता लगाने की आवश्यकता है, जो यह $ find() के साथ करता है।

बेशक

, अगर मैं पेज पर सीधे मेरी कोड फेंकना, वह निष्पादित के रूप में पेज पढ़ा जा रहा है, और विफल रहता है, क्योंकि कुछ भी नहीं पर निर्भर करता है अभी तक आरंभ नहीं हो जाता।

अगर मैं एक Pageload() फ़ंक्शन के अंदर अपने कोड डाल, यह ठीक चलाता है क्योंकि Pageload नामित किसी भी समारोह के लिए asp.net स्वचालित रूप से तारों को एक ऑनलोड हैंडलर()। समस्या यह है कि मुझे वास्तव में पेज लोड() समाधान पसंद नहीं है - मुख्य रूप से क्योंकि यह एक वैश्विक नाम है। अगर मैं पेज लोड() का उपयोग करके कुछ कोड करता हूं, तो मुझे पता है कि कुछ अन्य प्रोग्रामर दृष्टिकोण की प्रतिलिपि बनाने जा रहे हैं, कहीं अनुपयुक्त हैं, और हम एक ऐसे पृष्ठ के साथ समाप्त होने जा रहे हैं जिसमें दो या दो से अधिक अलग पृष्ठ लोड() फ़ंक्शन शामिल हैं, और नतीजा रहस्यमय त्रुटियों का एक गुच्छा होगा जो हमेशा ट्रैक करने के लिए ले जाएगा।

तो, मैं एक गुमनाम समारोह jQuery के $ (document) .ready के लिए पारित() के अंदर अपने कोड डाल दिया। यह विफल रहता है, क्योंकि यह सर्वरकंट्रोल के क्लाइंट-साइड घटक मौजूद होने से पहले चलता है।

तो, मैं एक गुमनाम समारोह Sys.Application.add_load द्वारा लिए पारित() के अंदर अपने कोड डाल दिया। यह भी विफल रहता है, क्योंकि Sys अपरिभाषित है।

तो मैं अंत में Sys.Application.add_load() के अंदर अपने कोड डालने पर व्यवस्थित, और फिर उस एक समारोह $ से बुलाया अंदर (document) .ready() डाल दिया। यह काम करता है, लेकिन यह पेज लोड() के रूप में लगभग दिल की धड़कन देता है।

<script type="text/javascript"> 
    $(document).ready(function(){ 
     Sys.Application.add_load(function(){ 
      var component = $find(<clientid>); 
      if (component) { <do something> } 
     }); 
    }); 
</script> 

इसे संभालने का एक बेहतर तरीका होना चाहिए।

कोई भी विचार?

उत्तर

20

आप पर नियंत्रण है, तो कोड-पीछे, आप की तरह कुछ के माध्यम से स्टार्टअप पर चलाने के लिए जावास्क्रिप्ट रजिस्टर कर सकते हैं:

this.Page.ClientScript.RegisterStartupScript(
    this.GetType(), 
    "StartupScript", 
    "Sys.Application.add_load(function() { functioncall(); });", 
    true); 
जब तक

के रूप में अपने घटक Sys.Application.add_init के माध्यम से लोड किया गया है() आप ठीक होना चाहिए ...

+0

ऐसा लगता है कि हमारे लिए काम करता है। –

3

मुझे विश्वास है कि यदि आप अपने स्क्रिप्ट ब्लॉक के ऊपर स्क्रिप्ट मैनेजर नियंत्रण जोड़ते हैं (या स्थानांतरित करते हैं), तो आपको इसे jQuery के $(document).ready() फ़ंक्शन में लपेटने की आवश्यकता नहीं होगी। ऐसा करने से जाहिरा तौर पर Sys ScriptManager के रूप में उपलब्ध हो जाएगा:

सटीक स्थान कि ScriptManager नियंत्रण पेज में पर स्थित होती है में है कि जावास्क्रिप्ट के थोक injects। [http://encosia.com/2007/08/16/updated-your-webconfig-but-sys-is-still-undefined/]

हालांकि, इस समाधान अभी भी आप असंतोष के रूप में यह निश्चित रूप से नहीं किसी भी असंदिग्ध डेवलपर क्या ScriptManager वास्तव में यहाँ प्रदान कर रहा है के लिए स्पष्ट हो जाएगा दे सकता है।

स्क्रिप्ट मैनेजर के अंदर स्क्रिप्ट संदर्भों को जोड़ने के लिए एक और तरीका है (उपरोक्त लिंक किए गए आलेख में चर्चा की गई "बेहतर तरीका" देखें) मेरे साथ यह अच्छी तरह से नहीं बैठता है क्योंकि मैं पूरे स्क्रिप्ट मैनेजर दृष्टिकोण का एक बड़ा प्रशंसक नहीं हूं।

5

मैं जो बाहरी पुस्तकालयों बनाने की कोशिश और नेट के भीतर जितना संभव हो उतना विनीत जावास्क्रिप्ट मानसिकता का पालन करने की कोशिश कर रहे हैं के लिए एक विकल्प प्रदान करना चाहते हैं।

पेज लोड स्वचालित रूप से AJAX ईवेंट को तार करने के लिए एक उत्कृष्ट तरीका है जो प्रत्येक पृष्ठ लोड पर आग लगाना चाहिए (चाहे वह लोड इस पृष्ठ पर बैक बटन नेविगेशन से आता है, पृष्ठ पर एक अग्रेषित बटन नेविगेशन, एक AJAX कॉलबैक, मानक पेज लोड, इत्यादि), और चूंकि आपको स्क्रिप्ट मैनेजर को डोम में मौजूद होने की प्रतीक्षा करने की चिंता करने की आवश्यकता नहीं है, और इसे इस तरह से नामित किया गया है जो अधिकांश भाग के लिए समझ में आता है (पेज लोड बनाम body.onload थोड़ा है गैर .NET कोडर्स के लिए भ्रमित, लेकिन एक .NET व्यक्ति के लिए, यह समझ में आता है कि पेज लोड प्रत्येक पृष्ठ लोड को फायर करता है, कॉलबैक के बाद, क्योंकि व्यवहार सर्वर पक्ष पृष्ठ_लोड के लिए समान है)। कहा जा रहा है कि, आपकी चिंताओं अच्छे हैं - आप किसी दिए गए पृष्ठ पर पेज लोड के दो उदाहरण नहीं चाहते हैं, क्योंकि यह टूट जाएगा। यहां एक सीधे जावास्क्रिप्ट समाधान है जो आपके डेवलपर्स के लिए सभी का पालन करने के लिए सुरक्षित है, पेज लोड के उपयोग की अनुमति देता है, मौजूदा डीओएम के बारे में चिंतित नहीं है, कोई कोड टकराव सुनिश्चित नहीं करता है, और हमारे लिए अद्भुत काम करता है।

आपका मुख्य जावास्क्रिप्ट पुस्तकालय में, Pageload है, साथ ही एक सहायक समारोह को परिभाषित:

mylibrarynamespace.registerStartupScript(
    function (sender, args){ 
     /* do my AJAX always enabled startup code logic here*/ 
    } 
); 
: अपने ग्राहक के पक्ष कोड में कहीं भी इसका इस्तेमाल करने के

if (!pageLoad) { var pageLoad = function (sender, args) {}; }; 
if (!mylibrarynamespace) {var mylibrarynamespace = {};}; 
if (!mylibrarynamespace.registerStartupScript) mylibrarynamespace.registerStartupScript = function (fn) { 
    /* create local pointer for added function */ 
    var f = fn; 

    /* create pointer to existing pageLoad function */ 
    var pLoad = pageLoad; 

    /* add new function pointer to pageLoad by creating new anonymous function (search Google for "javascript enclosures" for why pl and f will persist with this newly defined anonymous function) */ 
    pageLoad = function (sender, args) { 
    pLoad(sender,args); 
    f(sender, args); 
    } 
} 

फिर, बस निम्न कार्य करें

कार्यक्षमता अधिक आसान बदलते बनाने के लिए, मेरा सुझाव है कि गुमनाम समारोह में पारित करने के लिए इतना है कि आप केवल अपनी लाइब्रेरी के समारोह घोषणा को बदलने के लिए (फ़ाइल में या गतिशील रनटाइम पर) की जरूरत है कि पेज या अपने पुस्तकालय के नियंत्रण के सबसेट के भीतर एक समारोह फोन पग कैसे बदलें आपकी साइट के उस विशेष भाग के लिए ईलोड करें।

+0

जावास्क्रिप्ट में यह आपकी पहली कुछ पंक्तियां लिखने के लिए अधिक मूर्ख है: var pageload = pageload || कार्य (प्रेषक, तर्क) {}; – Goyuix

0

ग्राहक स्क्रिप्ट ब्लॉक रजिस्टर, लेकिन प्रत्येक अतिरिक्त समारोह कॉल खासकर अगर यह अगर आप एक ही समारोह लेकिन विभिन्न पैरामीटर मान के साथ प्रयोग कर रहे हैं अद्वितीय पैरामीटर के लिए एक अद्वितीय शीर्षक देने के लिए ScriptManager का उपयोग करें। यदि आप add_load तकनीक का उपयोग करते हैं तो इसका उपयोग केवल तभी किया जाना चाहिए जब पृष्ठ लोड एक पोस्ट बैक न हो यानी केवल पृष्ठ रीफ्रेश या पोस्ट लोड के बिना पेज लोड के बाद बुलाया जाता है।

इसके बजाय इसे आजमाएं: ScriptManager.RegisterClientScriptBlock (यह, GetType(), "अद्वितीय शीर्षक", "अलर्ट ('त्वरित परीक्षण');", सत्य);

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