2011-09-10 10 views
7

मेरी बुकमार्कलेट में 'लॉन्चर' स्क्रिप्ट को कॉल किया गया है जो body में डाला गया है। जैसे ही यह चलता है, यह उसी तरह से अधिक स्क्रिप्ट (jQuery, वास्तविक अनुप्रयोग), और एक सीएसएस में प्रवेश करता है।केवल एक बार चलाने के लिए बुकमार्कलेट को कैसे लागू करें?

बुकमार्कलेट

javascript:(function(){ 
    var l = document.createElement('script'); 
    l.setAttribute('type','text/javascript'); 
    l.setAttribute('src','launcher.js'); 
    document.body.appendChild(l); 
})(); 

Launcher.js

var s = document.createElement('script'); 
s.setAttribute('type','text/javascript'); 
s.setAttribute('src','my actual script'); 
document.body.appendChild(s); 

// I repeat a block like this once per script/css. 

समस्या यह है कि अगर बुकमार्कलेट दो बार क्लिक किया जाता है, सभी स्क्रिप्ट फिर से सम्मिलित किया जाएगा है। मैं इस व्यवहार को कैसे रोक सकता हूं?

उत्तर

4

आप window ऑब्जेक्ट पर एक संपत्ति सेट कर सकते हैं जिसे अजीब नाम दिया गया है, इसलिए नामस्थान टकराव का कारण बनने की संभावना नहीं है, केवल पहले रन पर । बाद में रन पर, कोड निष्पादित नहीं होगा यदि संपत्ति मौजूद है:

javascript:(function(){ 
     // Test for existence of your weird property 
     if (!window.hasOwnProperty('yourWeirdPropertyX774x9ZZYy4')) { 

      // Run all your existing code 
      var l = document.createElement('script'); 
      l.setAttribute('type','text/javascript'); 
      l.setAttribute('src','launcher.js'); 
      document.body.appendChild(l); 

     // Set the flag so this won't run again 
     window.yourWeirdPropertyX774x9ZZYy4 = true; 
     } 
    })(); 
+0

ओह - जीते सिंटैक्स को ठीक करने के लिए संपादित किया गया है और इसके आसपास बकवास के बजाय एनन func के बाद से ब्लॉक को स्थानांतरित करें। –

+0

परफेक्ट - मेरे पिछले प्रयास निश्चित रूप से इन पंक्तियों के साथ थे, लेकिन मैं विंडो प्रोप के बजाय चर का उपयोग कर रहा था, जिसे मैं पूरी तरह से नहीं जानता था। धन्यवाद! – vemv

+1

@vemv एक चर के अंदर एक 'varVar = 1234;' के रूप में घोषित एक चर के रूप में इसके विपरीत 'var' कीवर्ड के बिना वास्तव में वैश्विक' विंडो 'ऑब्जेक्ट की संपत्ति बन जाती है, लेकिन यह विधि अधिक स्पष्ट और जानबूझकर है। –

0

Simplest/Cleanest way to implement singleton in JavaScript?

जे एस में Singletons लागू करने के लिए एक अच्छा तरीका है पर एक उदाहरण। मैं उसका जवाब कॉपी/पेस्ट नहीं करूंगा, लेकिन इसे एक अच्छा पढ़ाऊंगा :)

+0

शायद 'सिंगलटन' शब्द का उपयोग करना मेरी गलती थी - मुझे नहीं लगता कि ऐप को एक ऑब्जेक्ट में जोड़ना शाब्दिक होगा। – vemv

3

मैं मुझे यह करने के लिए के लिए साफ रास्ता मिल गया समारोह है कि बाहरी जे एस फ़ाइल लोड करता है, एक समारोह के रूप में एक ही नाम के नाम पर था जब भी उपयोगकर्ता बुकमार्कलेट पर क्लिक करता है तो बाहरी फ़ाइल के अंदर मैं दौड़ना चाहता हूं। इस तरह जब बुकमार्कलेट पहली बार क्लिक किया जाता है, तो यह बाहरी फ़ाइल लोड करता है और उपरोक्त क्लिक पर बाहरी फ़ाइल में एक फ़ंक्शन चलाया जाता है।

यह बुकमार्कलेट लिंक के यूआरएल में कोड

if(! bookmarklet){ 
    var bookmarklet = { 
    click: function(){ 
     js = document.createElement('SCRIPT'); 
     js.type = 'text/javascript'; 
     js.src = 'http://external.js?' + (Math.random()); 
     document.getElementsByTagName('head')[0].appendChild(js); 
    } 
    }; 
} 
bookmarklet.click(); // this will be called everytime the bookmarklet is clicked 

external.js फ़ाइल इस तरह एक ही नाम के साथ एक फ़ंक्शन होगा:

यहाँ कुछ sudo कोड है

var bookmarklet = { 
    click:function(){ 
     // insert logic you want to run every time the bookmarklet is clicked 
    } 
}; 
bookmarket.click(); // run once after file is loaded 

इस तरह जब बाहरी फ़ाइल आपके फ़ंक्शन को लोड कर लेती है (उदाहरण फ़ंक्शन bookmarklet.click) अब बाहरी लोड की गई फ़ाइल के अंदर फ़ंक्शन चलाता है और नहीं बाहरी जेएस फ़ाइल दूसरी बार विज्ञापन करें।

+0

मुझे इसे समझने में थोड़ी देर लग गई ('क्लिक' नाम मुझे गुमराह करता है) लेकिन अब मैं करता हूं। अच्छा दृष्टिकोण, चीयर्स! – vemv

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