2012-03-06 9 views
35

मैं सोच रहा था कि केवल विशिष्ट पृष्ठों पर जावा-स्क्रिप्ट कोड निष्पादित करने का सबसे अच्छा तरीका क्या होगा।केवल विशिष्ट पृष्ठ पर जेएस निष्पादित करने का सबसे अच्छा तरीका

की कल्पना हम एक टेम्पलेट आधारित वेब साइट करते हैं, सामग्री IST सेट के लिए नियम, jQuery उपलब्ध पुनर्लेखन और यह मूल रूप से इस तरह दिखता है:

<!DOCTYPE html> 
    <html> 
    <head> 
    <script src="script.js"></script> 
    </head> 
    <body> 
    ... 
    include $content; 
    .. 
    </body> 
</html> 

सामग्री 'जानकारी' एक बटन होता है, हम चाहते हैं क्लिक पर होने वाली कुछ चीज़, सामग्री 'अलर्ट' को एक संदेश के रूप में देना चाहिए, जब आप टेक्स्ट फ़ील्ड होवर करते हैं।

त्रुटि में भाग दिए बिना, इन क्रियाओं को ट्रिगर करने का सबसे अच्छा तरीका क्या है, क्योंकि ऑब्जेक्ट नहीं मिला है?

विकल्प एक: का उपयोग कर window.location.pathname

$(document).ready(function() { 
     if (window.location.pathname == '/info.php') { 
      $("#button1").click(function(){' 
      //do something 
      }) 
     }else if(window.location.pathname == '/alert.php'){ 
      $("#mytextfield").hover(){ 
      alert('message'); 
      } 
    } 

विकल्प दो: पता चल सके कि तत्वों मौजूद

$(document).ready(function() { 
    if ($("#button1").length > 0) { 
     $("#button1").click(function(){' 
     //do something 
     }) 
    }else if ($("#mytextfield").length > 0){ 
     $("#mytextfield").hover(){ 
     alert('message'); 
     } 
} 

विकल्प तीन: में स्क्रिप्ट शामिल लोड टेम्पलेट

//stands for itself 

क्या उनका बेहतर समाधान है? या मुझे इन समाधानों में से एक के साथ मिलना है?

आपके अनुभव, उपयोग या इस विषय से संबंधित किसी भी लिंक की सराहना की जाती है।

// संपादित करें:

मैं एक बुरा उदाहरण चुना हो सकता है, वास्तविक कोड होगा किसी चीज़ की तरह:

mCanvas = $("#jsonCanvas"); 
    mMyPicture = new myPicture (mCanvas); 

जहां myPicture निर्माता प्राप्त कैनवास तत्व के संदर्भ है, और एक त्रुटि फेंकता है, अगर mCanvas अपरिभाषित है।

+2

एक अच्छा विचार केवल उन पृष्ठों पर जावास्क्रिप्ट शामिल करना होगा जिनके लिए इसकी आवश्यकता होती है और '$ (दस्तावेज़) .ready' को पृष्ठ पर एक से अधिक बार कहा जा सकता है, इसलिए आपको यहां सुरक्षित होना चाहिए। –

+0

यदि आप jQuery: '$ (" someselector ") का उपयोग कर रहे हैं तो ईवेंट ईवेंट को असाइन करने से पहले तत्व मौजूद है या नहीं। क्लिक करें (...) 'क्लिक करें हैंडलर _zero या more_ तत्वों पर लागू होगा मिलान "someselector" - अगर कोई मेल नहीं खाता है तो यह कोई त्रुटि नहीं देता है। – nnnnnn

+0

@IanBishop: यह विकल्प तीन है :) -> टेम्पलेट के साथ लोड जेएस @ nnnnnn: मेरा संपादन देखें, लेकिन आप सही हैं, 'केवल' क्लिक करें क्रियाओं के बारे में –

उत्तर

6

यूआरएल पथ की जांच करने से थोड़ा अलग दृष्टिकोण: आप पृष्ठ के विशिष्ट ईवेंट हैंडलर को एक ही फ़ंक्शन में समूहित कर सकते हैं और फिर प्रत्येक में शामिल हैं, एक डोमरेड है जो इन कार्यों को कॉल करेगा।

उदाहरण: script.js में आपके पास दो कार्य (domready के बाहर) हैं। onPage1Load() और onPage2Load()

आपके page1.php में आपके पास $(document).ready(onPage1Load) और अन्य पृष्ठों के लिए भी है। यह सुनिश्चित करेगा कि अनपेक्षित ईवेंट हैंडलर पंजीकृत नहीं हैं।

+0

मुझे लगता है कि चीजों को लिखने का यह सबसे आसान तरीका है और इसे पढ़ने और डीबग करना आसान है। विकल्प जो मुझे लगता है कि फ्रंट कंट्रोलर की तरह बुरा नहीं है लेकिन परिणामस्वरूप गड़बड़ हो सकती है। साथ ही जब उपनाम भी मुश्किल हो रहे हैं। यह काम कर सकता है अगर किसी भी तरह से स्वचालित करने के लिए कोई ढांचा है ... पेज क्लास के साथ विधि प्रतीत होती है भी अच्छा विचार है। – GorillaApe

+0

मेरे लिए सबसे अच्छा क्या काम करता था एक इनलाइन स्क्रिप्ट जिसमें उस पृष्ठ पर केवल फ़ंक्शन कहा जाता था। – AntonB

10

मैं स्विच स्टेटमेंट और एक चर का उपयोग करता हूं। (मैं jQuery का उपयोग कर रहा हूँ!)

var windowLoc = $(location).attr('pathname'); //jquery format to get window.location.pathname 

switch(windowLoc){  
    case "/info.php": 
    //code here 
    break; 
    case "/alert.php": 
    //code here 
    break; 
} 

//use windowLoc as necessary elsewhere 

इससे आपको उस पृष्ठ पर आधारित "बटन" क्या बदलता है, यह बदलने की अनुमति देगा। अगर मैं आपका प्रश्न सही ढंग से समझ गया; क्या यही मुझे करना होगा। इसके अलावा, अगर मैं बड़ी मात्रा में जावास्क्रिप्ट की सेवा कर रहा था, तो मैं बस एक नई जेएस फ़ाइल पूरी तरह से जोड़ूंगा।

var windowLoc = $(location).attr('pathname'); //jquery format to get window.location.pathname 

switch(windowLoc){  
    case "/info.php": 
    var infoJS = document.createElement('script'); 
    infoJS.type = 'text/javascript'; 
    infoJS.src = 'location/to/my/info_file.js'; 
    $('body').append(infoJs); 
    break; 
    case "/alert.php": 
    var alertJS = document.createElement('script'); 
    alertJS.type = 'text/javascript'; 
    alertJS.src = 'location/to/my/alert_file.js'; 
    $('body').append(alertJs); 
    break; 
} 

आशा इस मदद करता है -

चीयर्स।

+0

चूंकि आप jquery का उपयोग कर रहे हैं। jQuery.getScript() उपयोगी – Bamboo

+0

जेएस फ़ाइलों को फिर से लोड करने के लिए अच्छा दृष्टिकोण। :) –

49

अपने शरीर टैग में class विशेषता सेट करें।

<body class="PageType"> 

और फिर अपनी स्क्रिप्ट में ..

$(function(){ 
    if($('body').is('.PageType')){ 
    //add dynamic script tag using createElement() 
    OR 
    //call specific functions 
    } 
}); 
+1

मुझे लगता है कि प्रत्येक पृष्ठ पर कक्षा के नाम जोड़ना बहुत अच्छा अभ्यास है .. जेएस और सीएसएस – Damon

+0

दोनों के लिए कोई बुरा विचार नहीं है जब तक कि कोई व्यक्ति इस दृष्टिकोण के लिए – Neil

+0

प्लस वन नाम नहीं देता है; [jQuery'is] का उपयोग करके (http://api.jquery.com/is/) – numediaweb

0

आप उपयोग कर सकते हैं js और लोड स्क्रिप्ट अगर वे केवल जरूरत (RequireJS JavaScript फ़ाइल और मॉड्यूल लोडर है) की आवश्यकता होती है। लिंक http://requirejs.org/ है, मुझे पता है कि जेएस की आवश्यकता बहुत आसान नहीं है।

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