2010-11-04 16 views
10

मैंने एकाधिक फ़ाइलों में $ (दस्तावेज़) में कई फ़ंक्शन संलग्न किए हैं। पहले से ही एक ही फ़ंक्शन को उनके सामने होने के लिए संलग्न करना चाहते हैं $ (दस्तावेज़)। पहले से ही $ (दस्तावेज़) से पहले स्वतंत्र रूप से हैंडल या स्वतंत्र रूप से ट्रिगर करने के लिए। पहले से हैंडलर।

jQuery के आंतरिक रूप से jQuery.fn.ready के हिस्से के रूप में आंतरिक रूप से ट्रिगर करने वाले कार्यों के क्रम को संभालने का कोई तरीका है या jQuery.fn.ready से पहले कॉल करने वाले फ़ंक्शन में हुक करने का कोई तरीका है।

एक 3 पार्टी करना सुरक्षित लिपि में संपादित कर रहा है jQuery.fn.ready या यह अन्य 3 पार्टी प्लग-इन में प्रभाव

[(अलग करने वाले प्लग इन संपादित jQuery.fn.ready स्वयं से) पर भयानक दस्तक कारण होगा संपादित करें]:

एक उदाहरण

$(document).ready(function b() {}); 
.... 
$(document).ready(function a() {/* optional setup*/}); 
.... 
$(document).ready(function c() {}); 

समारोह एक आदेश के पहले अप्रासंगिक है, लेकिन केवल कुछ पन्नों पर बुलाया जाता हो की आवश्यकता है। मैं बी या सी के आदेश की गारंटी नहीं दे सकता इसलिए मैं बी या सी की शुरुआत में कस्टम ईवेंट को ट्रिगर नहीं कर सकता।

तो मुझे एक सामान्य समाधान चाहिए जो मैं jQuery की आंतरिक तैयार सूची की शुरुआत में मजबूती से उपयोग करने के लिए उपयोग कर सकता हूं या jQuery के तैयार फ़ंक्शन में हुक कर सकता हूं और इसे सुरक्षित रूप से संपादित कर सकता हूं ताकि यह तैयार सूची में किसी भी अन्य कार्य से पहले कॉल कर सके।

[आगे संपादित करें]

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

$.beforeReady(function a() {}); 
+0

जब आप beforeReady समारोह से पहले कोड है कि चलाता जोड़ने की जरूरत है तो आप क्या करेंगे? क्या आप पहले से पहले जोड़ देंगे? कभी-कभी आपको बुलेट को काटने की ज़रूरत होती है और क्या करने की आवश्यकता होती है और कोड को ठीक करने की आवश्यकता होती है, इसलिए यह समझ में आता है। –

+0

@ जनी आपके पास एक वैध बिंदु हो सकता है। फिर भी मैं पहले से तैयार करना चाहता हूं, फिर सभी घटनाओं को प्रतिस्थापित करता है। पहले से ही .bind ("loaded") के साथ और पहले से बदलकर .bind ("setup") – Raynos

+0

यह समस्या jQuery के अगले संस्करण में तय की जानी चाहिए: https: // github.com/jquery/jquery/pull/80 – Mottie

उत्तर

15

एक भी समारोह लिखते हैं होगा bind, आपके पास केवल एक ready हैंडलर होगा, जो सामान करेगा, फिर कस्टम ईवेंट ट्रिगर करेगा।

अपने कोड में

तो, कहीं और, $(document).ready उपयोग करने के बजाय, आप

$(window).bind('setup', function() { 
    //code here... 
}); 

और/या

$(window).bind('loaded', function() { 
    //some other code here... 
}); 

और अपने एक और केवल ready हैंडलर में प्रयोग करेंगे, तो आप ऐसा चाहते हैं इस तरह कुछ:

$(document).ready(function() { 
    $(window).trigger('setup'); 
    $(window).trigger('loaded'): 
}); 
+0

"// do setup stuff" वैकल्पिक है और केवल कुछ पृष्ठों से किया गया है। "// code here" प्रत्येक पृष्ठ पर किया जाता है। तो इसे ऐसा करना जो पीछे की तरफ महसूस करता है। मैं प्रत्येक पृष्ठ – Raynos

+0

@ रेयनोस पर $ (विंडो) .trigger ("someCustomEvent") शामिल नहीं करना चाहता, तो आप सेटअप सामग्री को करने के लिए एक और कस्टम ईवेंट ट्रिगर कर सकते हैं। –

+0

यदि मेरे पास दस्तावेज़ तैयार करने पर कई फ़ंक्शन हैं I आदेश गारंटी नहीं दे सकता है और न ही सेटअप को ट्रिगर करने के लिए एक फ़ंक्शन चुन सकता है क्योंकि मैं गारंटी नहीं दे सकता कि किसी भी तैयार फ़ंक्शन को jQuery – Raynos

0

$(document).ready() या बस $(function(){}) सिर्फ .addEventListener कार्यान्वयन (ठीक नहीं है, लेकिन बंद है), जिसका अर्थ है कि आप पहले और बाद में श्रोताओं को जोड़ सकते हैं।

$(document).ready(listener); // goes off first. 
$(document).ready(otherListener); // goes off 2nd. 

और इसी तरह, सैंडविच कार्यों के लिए मुश्किल नहीं है। .ready() आईएमओ हैक करने की कोई आवश्यकता नहीं है।

+0

मुझे अपने कोड के बारे में सटीक क्रम के बारे में चिंता करने की ज़रूरत नहीं है जिसमें हर जगह शामिल है लेकिन कोड में ऑर्डर सेट करें। – Raynos

+0

हम्म, शायद आपको जगह पर पहले से ही पेस्ट करना बंद कर देना चाहिए। मैं आमतौर पर केवल एक एकल .ready() का उपयोग करता हूं जहां मैं अपने सभी प्लगइन को अंदर रखता हूं और इसे एक फ़ाइल में रखता हूं जिसमें इसके अलावा कुछ भी नहीं है (पन इरादा)। ;) – BGerrissen

+2

यदि मेरे पास पूरे विरासत परियोजना को संपादित करने का समय था, तो मैं ऐसा करूंगा। समय के लिए मैं धीरे-धीरे सुधार के साथ अटक गया हूँ। – Raynos

0

मुझे बस एक ही समस्या थी। मैंने गिटहब पर एक छोटी सी लिपि डाली जो $ .beforeReady() फ़ंक्शन जोड़ती है।अजीब बात है :)

https://github.com/aim12340/jQuery-Before-Ready

बस इस उदाहरण की तरह सही jQuery के बाद स्क्रिप्ट लोड:

<html> 
    <head> 
     <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 
     <script src="jquery-before-ready.js"></script> 
    </head> 
    <body> 
     <script> 
      $(document).ready({ 
       alert("This function is declared first!") 
      }) 
     </script> 
     <script> 
      $.beforeReady(function(){ 
       alert("This function is declared second but executes first!") 
      }) 
     </script>   
    </body> 
</html> 
संबंधित मुद्दे