2012-03-11 39 views
13

पर जावास्क्रिप्ट स्क्रिप्ट मौजूद है या नहीं, मेरे पास एक बुकमार्कलेट है जो मैंने बनाया है और यह मेरे सर्वर से उपयोगकर्ताओं के वर्तमान पृष्ठ पर एक स्क्रिप्ट लोड करता है। हालांकि मेरे पास मेरी स्क्रिप्ट में एक जांच है कि यदि कोई शर्त पूरी नहीं हुई है तो कोई कार्रवाई नहीं की जाती है। हालांकि यदि उपयोगकर्ता उस स्थिति को पूरा करता है तो कोड चलाया जाता है, लेकिन उसके पृष्ठ में डाली गई स्क्रिप्ट के दो सेट होने का कारण बनता है। क्या मैं इसे रोक सकता हूं?जांचें कि पृष्ठ

<a href="javascript: (function() { 
    var jsCode = document.createElement('script'); 
    jsCode.setAttribute('src', 'http://xxx.co.uk/xxx/script.js'); 
    document.body.appendChild(jsCode); 
}());">Bookmarklet</a> 

उत्तर

20

आप देख सकते हैं अपनी स्क्रिप्ट इस तरह के लोड होने पर:

<a href="javascript: 
    if (!jsCode) { 
     var jsCode = document.createElement('script'); 
     jsCode.setAttribute('src', 'http://xxx.co.uk/xxx/script.js'); 
     document.body.appendChild(jsCode); 
    } 
">Bookmarklet</a> 
:

function isMyScriptLoaded(url) { 
    if (!url) url = "http://xxx.co.uk/xxx/script.js"; 
    var scripts = document.getElementsByTagName('script'); 
    for (var i = scripts.length; i--;) { 
     if (scripts[i].src == url) return true; 
    } 
    return false; 
} 

वैकल्पिक रूप से, आप कुछ इस तरह कर सकता है

यह jsCode परिवर्तनीय के साथ वैश्विक नामस्थान "प्रदूषित" है, लेकिन यह एक आवश्यक बुराई हो सकता है। आप उस चीज़ का नाम बदल सकते हैं जो दस्तावेज़ में दिखाई देने की संभावना नहीं है जहां बुकमार्कलेट चलाया जाता है।


कृपया ध्यान दें कि javascript URI योजना इस मामले में के रूप में बुकमार्कलेट के लिए ठीक है, यह सामान्य उपयोग के लिए एक अच्छा अभ्यास नहीं माना जाता है।

+0

ओह ठीक है, आजकल बुकमार्लेट बनाने का आधुनिक तरीका क्या है? – benhowdle89

+0

यह ठीक है, मैं इस तथ्य को याद कर रहा था कि यह पहले एक बुकमार्कलेट था ... मुझे इसे फिर से जोड़ने दो जिससे समझ में आता है –

0

आप वैश्विक क्षेत्र (window.yourVariable) में एक चर बना सकते हैं और जाँच है कि अगर पहले से मौजूद है तो आप आप अपने jsCode स्निपेट कोड या चलाने के जो भी आप script.js में चल रहे हैं जोड़ना चाहते हैं तो यह तय कर सकें

8

बस चयनकर्ता लंबाई की जांच करें। यहाँ jQuery का उपयोग कर एक उदाहरण है:

if ($('script[src="http://xxx.co.uk/xxx/script.js"]').length > 0) { 
    //script exists 
} 
4

आप अपने script टैग पर id विशेषताओं जगह है और document.getElementById('your-id') का उपयोग जोड़ने से पहले पहचान करने के लिए पृष्ठ पर स्क्रिप्ट है कि क्या कर सकते हैं।

if (!document.getElementById('your-id')) { 
    // append your script to the document here, ensure it has its id attribute set to 'your-id' 
} 
0

स्थानीय के साथ काम करने और वैकल्पिक रूप से रहने के मामले में।

सटीक यूआरएल बदल सकता है। मुझे लगता है कि आईडी विधि बेहतर है।

यह दो स्टैक ओवरफ़्लो उत्तरों का संयोजन है। ES6, कोई jQuery के साथ

if (!document.getElementById('your-id')) { 
     addScript("your_script_src"); //adding script dynamically 
    } 

    function addScript(path) { 
     var head = document.getElementsByTagName("head")[0]; 
     var s = document.createElement("script"); 
     s.type = "text/javascript"; 
     s.src = path; 
     s.id = "your-id"; 
     head.appendChild(s); 
    } 

function addCSSFile(path) { 
    var head = document.getElementsByTagName("head")[0]; 
    var s = document.createElement("style"); 
    s.type = "text/css"; 
    s.src = path; 
    head.appendChild(s); 
} 
0

समाधान:

const url = 'http://xxx.co.uk/xxx/script.js'; 

function scriptExists(url) { 
    return document.querySelectorAll(`script[src="${url}"]`).length > 0; 
} 

if(scriptExists(url){ 
    ... 
} 

यह HTML में जे एस इनलाइन करने के लिए सिफारिश नहीं है। इसके बजाय ईवेंट श्रोताओं को जोड़ें:

function bookmark() { 
    if(scriptExists(url){ 
    ... 
    } 
} 

document.querySelectorAll('a.bookmark').addEventListener('click', 
bookmark, false); 
संबंधित मुद्दे