स्क्रिप्ट टैग में पैरामीटर कैसे पारित करें?


96

मैंने ट्यूटोरियल DIY विजेट्स को पढ़ा - डॉ निक द्वारा एक्सएसएस विजेट के लिए किसी अन्य साइट पर अपनी साइट को कैसे एम्बेड किया जाए।

मैं स्क्रिप्ट टैग में मापदंडों को पारित करने के लिए एक रास्ता ढूंढ रहा हूं। उदाहरण के लिए, निम्नलिखित कार्य करने के लिए:

<script src="http://path/to/widget.js?param_a=1&amp;param_b=3"></script>

क्या इसे करने का कोई तरीका है?


दो दिलचस्प लिंक:


इन्हें भी देखें: stackoverflow.com/q/1017424/247696
Flim

जवाबों:


124

मैं एक सुपर पुराने सवाल का जवाब देने के लिए माफी मांगता हूं लेकिन उपरोक्त समाधानों के साथ एक घंटे की कुश्ती बिताने के बाद मैंने सरल सामान के लिए चुना।

<script src=".." one="1" two="2"></script>

स्क्रिप्ट के ऊपर:

document.currentScript.getAttribute('one'); //1
document.currentScript.getAttribute('two'); //2

Jquery या url पार्सिंग की तुलना में बहुत आसान है।

आपको IE के लिए @Yared Rodriguez के उत्तर से doucment.currentScript के लिए पॉलीफ़िल की आवश्यकता हो सकती है:

document.currentScript = document.currentScript || (function() {
  var scripts = document.getElementsByTagName('script');
  return scripts[scripts.length - 1];
})();

6
ध्यान दें कि IE में currentScript काम नहीं करता है। विवरण
देहली

मैं जवाब में IE के लिए एक polyfill जोड़ दिया। क्या पॉलीफिल काम नहीं करता है?
रिचर्ड फॉक्स

2
पॉलीफ़िल अब काम नहीं करता है, document.currentScript केवल पढ़ा जाता है और इसे पहले से मौजूद होने पर असाइन नहीं किया जा सकता है। शायद एक अलग जाँच की तरह अगर (? document.currentScript) {***
पॉलीफ़िल

3
मेरी क्षमा याचना डेविड, मैं हमेशा अपने उत्तरों को सामान्य बनाता हूं ताकि अन्य मुद्दों को जोड़ते हुए प्रारंभिक कार्यान्वयन विवरण के बिना समाधान का उपयोग कर सकें। ऊपर मेरे उदाहरण में आप देख सकते हैं src="..."यह किसी भी src, को इंगित करने के लिए है, कोई फर्क नहीं पड़ता :)
रिचर्ड फॉक्स

1
@RichardFox उत्तर के लिए धन्यवाद, लेकिन बस टिप्पणी करना था कि "मूल प्रश्न का उत्तर नहीं देता है: पथ / का उपयोग नहीं करता है / विजेट। जेएस" शायद सबसे मजेदार चीज है जिसे मैंने पूरे सप्ताह पढ़ा है! विश्वास नहीं कर सकता कि आपने जैसा किया है, वैसा ही आपने उत्तर दिया है।
स्किनटेस्ट

65

HTML5 5 डेटा विशेषताओं में सुविधा का उपयोग करना बेहतर है

<script src="http://path.to/widget.js" data-width="200" data-height="200">
</script>

स्क्रिप्ट फ़ाइल http://path.to/widget.js के अंदर आप उस तरह से paremeters प्राप्त कर सकते हैं:

<script>
function getSyncScriptParams() {
         var scripts = document.getElementsByTagName('script');
         var lastScript = scripts[scripts.length-1];
         var scriptName = lastScript;
         return {
             width : scriptName.getAttribute('data-width'),
             height : scriptName.getAttribute('data-height')
         };
 }
</script>

क्या होगा अगर आईडी = "myAwesomeWigretNo1" ऐसा नहीं है myAwesomeWigretNo2, लेकिन myAwesomeWigretNo681??? एक वास्तविक चर को स्वीकार करने के लिए मैं इसे कैसे ठीक कर सकता हूं?
पाथ्रोस

9
इसके लायक क्या है, इसके बजाय स्क्रिप्ट को संदर्भित करने के अन्य तरीके हैं, जैसे document.currentScript(केवल स्क्रिप्ट के लिए काम करता है अपनी फ़ाइल में नहीं) और टैग idपर डाल रहा है <script>और फिर इसके द्वारा खोज रहा है।
थंडरफोर्ज

और क्या होगा अगर आपकी टीम में कुछ अन्य प्रोग्रामर द्वारा आईडी बदल दी गई थी जिसमें कोई सुराग नहीं था कि आप इस आईडी का उपयोग करते हैं?
ओबेंडर

1
यदि आप स्क्रिप्ट को अतुल्यकालिक रूप से लोड करते हैं तो एक आईडी का उपयोग करना एकमात्र विश्वसनीय विकल्प है जिसकी मैं सिफारिश करूंगा। धन्यवाद @Thunderforge ... इसके अलावा, किसी भी प्रोग्रामर को किसी उचित स्प्रिंट योजना के बिना एक कोड को फिर से भरने से बचना चाहिए, जो किसी व्यक्ति के पास क्या चल रहा है, इसका सुराग है;)
लुका बोर्रोन

यकीन है कि आप डेवलपर्स से एक मजबूत नैतिकता की मांग कर सकते हैं, लेकिन यह लंबे समय तक काम नहीं करेगा ... लोग सामान भूल जाते हैं .... एक अच्छे सॉफ़्टवेयर डिज़ाइन में प्रत्येक ब्लॉक शोड को अलग किया जा सकता है, भयानक- pixels.tumblr.com/post/101930002170 /… En.wikipedia.org/wiki/SOLID_(object-oriented_design) इसलिए मेरा तर्क है कि यह एक अच्छा बनाम बुरा समाधान है आईडी को बनाए रखने के लिए इसे और अधिक जटिल बनाने के लिए नहीं बनाए रखने के लिए :-) क्या आप इसकी योजना नहीं बनाते हैं? स्क्रिप्ट लोड करें Async मुझे आईडी का उपयोग करने का कोई कारण नहीं
दिखता है

17

समझ गया। एक हैक की तरह, लेकिन यह बहुत अच्छा काम करता है:

var params = document.body.getElementsByTagName('script');
query = params[0].classList;
var param_a = query[0];
var param_b = query[1];
var param_c = query[2];

मैं स्क्रिप्ट टैग में कक्षाओं के रूप में पास करता हूं:

<script src="http://path.to/widget.js" class="2 5 4"></script>

इस लेख से बहुत मदद मिली।


1
लेख बहुत बढ़िया है!
बार्टेक स्कवीरा

14
मापदंडों को पारित नहीं करने के लिए स्टाइलिंग तत्व के लिए कक्षाओं का उपयोग किया जाना चाहिए।
kspacja

5
@kspacja हाँ और HTML में केवल स्टाइल के बिना सामग्री होनी चाहिए, सिवाय इसके कि हमें फ्लोट और कॉलम लेआउट के लिए अपने DIV टैग को ठीक से ऑर्डर करना होगा क्योंकि CSS वास्तव में काम नहीं कर सकता है, और हम किसी भी तरह से ठीक हैं। हैक कर लो, मैं कहता हूं। लेकिन अगर आप संघर्ष से बचना चाहते हैं तो आप "डेटा-" विशेषताओं का उपयोग कर सकते हैं या आप इस पर नींद खोने का प्रकार हैं।
जेसन सी

14

दूसरा तरीका मेटा टैग का उपयोग करना है। जो भी डेटा आपके जावास्क्रिप्ट को पास करना चाहिए, उसे इस तरह सौंपा जा सकता है:

<meta name="yourdata" content="whatever" />
<meta name="moredata" content="more of this" />

डेटा को इस तरह मेटा टैग से खींचा जा सकता है (सबसे अच्छा एक DOMContentLoaded ईवेंट हैंडलर में किया जाता है):

var data1 = document.getElementsByName('yourdata')[0].content;
var data2 = document.getElementsByName('moredata')[0].content;

JQuery या लाइक, कोई हैक्स और वर्कअराउंड के साथ बिल्कुल कोई परेशानी नहीं है, और किसी भी HTML संस्करण के साथ काम करता है जो Haa का समर्थन करता है ...


मुझे लगा कि यह तरीका अब तक का सबसे आसान तरीका है। यह एक आकर्षण की तरह काम करता है और मुझे वही देता है जिसकी मुझे आवश्यकता है। शानदार सवाल और शानदार समाधान!
एरियस

10

JQuery के पास HTML से जावास्क्रिप्ट में पैरामीटर पारित करने का एक तरीका है:

इसे myhtml.htmlफ़ाइल में रखें :

<!-- Import javascript -->
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
<!-- Invoke a different javascript file called subscript.js -->
<script id="myscript" src="subscript.js" video_filename="foobar.mp4">/script>

उसी निर्देशिका में एक subscript.jsफ़ाइल बनाएं और इसे वहां डालें:

//Use jquery to look up the tag with the id of 'myscript' above.  Get 
//the attribute called video_filename, stuff it into variable filename.
var filename = $('#myscript').attr("video_filename");

//print filename out to screen.
document.write(filename);

परिणाम का विश्लेषण करें:

लोड हो रहा है myhtml.html पेज में स्क्रीन के लिए 'foobar.mp4' प्रिंट है। Video_filename नामक चर html से जावास्क्रिप्ट में पारित किया गया था। जावास्क्रिप्ट ने इसे स्क्रीन पर मुद्रित किया, और यह माता-पिता में HTML में एम्बेडेड के रूप में दिखाई दिया।

jsfiddle सबूत है कि ऊपर काम करता है:

http://jsfiddle.net/xqr77dLt/


7

यदि आप jquery का उपयोग कर रहे हैं तो आप उनकी डेटा विधि पर विचार करना चाह सकते हैं

मैंने आपकी प्रतिक्रिया में जो आप कोशिश कर रहे हैं, उसके समान कुछ का उपयोग किया है:

<script src="http://path.to/widget.js" param_a = "2" param_b = "5" param_c = "4">
</script>

आप एक ऐसा फंक्शन भी बना सकते हैं, जो आपको सीधे GET के पैरामेट्स हड़पने की अनुमति देता है (यह वही है जो मैं अक्सर उपयोग करता हूं):

function $_GET(q,s) {
    s = s || window.location.search;
    var re = new RegExp('&'+q+'=([^&]*)','i');
    return (s=s.replace(/^\?/,'&').match(re)) ? s=s[1] : s='';
}

// Grab the GET param
var param_a = $_GET('param_a');

4

JQuery के लिए धन्यवाद, एक साधारण HTML5 अनुरूप समाधान डेटा को संग्रहीत करने के लिए div की तरह एक अतिरिक्त HTML टैग बनाना है।

HTML :

<div id='dataDiv' data-arg1='content1' data-arg2='content2'>
  <button id='clickButton'>Click me</button>
</div>

जावास्क्रिप्ट :

$(document).ready(function() {
    var fetchData = $("#dataDiv").data('arg1') + 
                    $("#dataDiv").data('arg2') ;

    $('#clickButton').click(function() {
      console.log(fetchData);
    })
});

ऊपर दिए गए कोड के साथ लाइव डेमो: http://codepen.io/anon/pen/KzzNmQ?editors=1011#0

लाइव डेमो पर, कोई HTML5 डेटा से डेटा देख सकता है- * विशेषताओं को संक्षिप्त और लॉग में मुद्रित किया जा सकता है।

स्रोत: https://api.jquery.com/data/


1
कुछ अन्य समाधानों के माध्यम से चला गया, लेकिन यह वह था जिसने सबसे अच्छा काम किया और इसे लागू करने के लिए बहुत सरल है। धन्यवाद!
एरिक कालकोकेन

यह स्वीकृत समाधान होना चाहिए, क्योंकि यह आपको आईडी द्वारा स्क्रिप्ट को संदर्भित करने की अनुमति देता है और मान्य HTML5 है।
टिम एस।

4

यह एक बहुत पुराना धागा है, मुझे पता है, लेकिन अगर कोई व्यक्ति समाधान खोजने के लिए यहां पहुंचता है तो यह भी मदद कर सकता है।

मूल रूप से मैंने उस तत्व को प्राप्त करने के लिए document.currentScript का उपयोग किया जहां से मेरा कोड चल रहा है और मैं उस चर के नाम का उपयोग करके फ़िल्टर करता हूं जिसे मैं खोज रहा हूं। मैंने इसे "प्राप्त" नामक एक विधि के साथ वर्तमानस्क्रिप्ट को विस्तारित किया, इसलिए हम उस स्क्रिप्ट के अंदर का मान प्राप्त करने में सक्षम होंगे:

document.currentScript.get('get_variable_name');

इस तरह हम विशेष विशेषताओं को जोड़े बिना चर को पुनः प्राप्त करने के लिए मानक यूआरआई का उपयोग कर सकते हैं।

यह अंतिम कोड है

document.currentScript.get = function(variable) {
    if(variable=(new RegExp('[?&]'+encodeURIComponent(variable)+'=([^&]*)')).exec(this.src))
    return decodeURIComponent(variable[1]);
};

मैं IE के बारे में भूल रहा था :) यह उतना आसान नहीं हो सकता ... वैसे मैंने यह उल्लेख नहीं किया है कि document.currentScript एक HTML5 प्रॉपर्टी है। इसे IE के विभिन्न संस्करणों के लिए शामिल नहीं किया गया है (मैंने IE11 तक परीक्षण किया, और यह अभी तक वहां नहीं था)। IE संगतता के लिए, मैंने इस भाग को कोड में जोड़ा:

document.currentScript = document.currentScript || (function() {
  var scripts = document.getElementsByTagName('script');
  return scripts[scripts.length - 1];
})();

हम यहां क्या कर रहे हैं IE के लिए कुछ वैकल्पिक कोड को परिभाषित करने के लिए, जो वर्तमान स्क्रिप्ट ऑब्जेक्ट को लौटाता है, जो कि src संपत्ति से मापदंडों को निकालने के लिए समाधान में आवश्यक है। यह IE के लिए सही समाधान नहीं है क्योंकि कुछ सीमाएं हैं; यदि स्क्रिप्ट अतुल्यकालिक रूप से भरी हुई है। नए ब्राउज़रों में "। CurrentScript" प्रॉपर्टी शामिल होनी चाहिए।

मुझे उम्मीद है यह मदद करेगा।


4

एक विशेषता बनाएं जिसमें मापदंडों की सूची हो, जैसे:

<script src="http://path/to/widget.js" data-params="1, 3"></script>

फिर, अपने जावास्क्रिप्ट में, एक सरणी के रूप में पैरामीटर प्राप्त करें:

var script = document.currentScript || 
/*Polyfill*/ Array.prototype.slice.call(document.getElementsByTagName('script')).pop();

var params = (script.getAttribute('data-params') || '').split(/, */);

params[0]; // -> 1
params[1]; // -> 3

इस दृष्टिकोण के नीचे क्या हैं?
त्रोनाथन

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

2

उन मानों को रखें जिनकी आपको कहीं आवश्यकता है, जहां दूसरी स्क्रिप्ट उन्हें छिपा इनपुट की तरह पुनः प्राप्त कर सकती है, और जब आप अपनी नई स्क्रिप्ट को आरंभ करते हैं, तो उन मानों को उनके कंटेनर से खींच सकते हैं। तुम भी एक छिपे हुए क्षेत्र में एक JSON स्ट्रिंग के रूप में अपने सभी params डाल सकता है।


जवाब के लिए धन्यवाद। परमर्स वास्तव में उपयोगकर्ताओं द्वारा इनपुट होते हैं (जो अपने कोड में इस स्क्रिप्ट टैग को एम्बेड करते हैं)। फिर क्या?
तोमर लिक्टाश

केवल एक चीज मैं सोच सकता हूं कि क्या आपके पास क्लाइंट / सर्वर स्क्रिप्ट दोनों पर नियंत्रण नहीं है, उपयोगकर्ताओं को इनपुट लेने के लिए है और इसका उपयोग एक विशिष्ट .js फ़ाइल को उत्पन्न करने के लिए किया गया है, जिसमें उनका इनपुट अंतर्निहित है, और यह मानकर कि आप नियंत्रण में हैं। उनके इनपुट को इकट्ठा करना और संसाधित करना।
21

मूल प्रश्न का उत्तर नहीं देता: जहां छिपे हुए क्षेत्र को रखने के लिए कोई तर्क नहीं दिया जाता है?
डेविड स्पेक्टर

2

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

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

स्थानीय भंडार

/* On the original page, you add an inline JS Script: */
<script>
   localStorage.setItem('data-1', 'I got a lot of data.');
   localStorage.setItem('data-2', 'More of my data.');
   localStorage.setItem('data-3', 'Even more data.');
</script>

/* External target JS Script, where your data is needed: */
var data1 = localStorage.getItem('data-1');
var data2 = localStorage.getItem('data-2');
var data3 = localStorage.getItem('data-3');

लोकलस्टोरेज में पूर्ण आधुनिक ब्राउज़र समर्थन है, और पुराने ब्राउज़रों का आश्चर्यजनक रूप से अच्छा समर्थन भी है, IE 8, फ़ायरफ़ॉक्स 3,5 और सफारी 4 [ग्यारह साल पहले]।

यदि आपके पास बहुत अधिक डेटा नहीं है, लेकिन फिर भी व्यापक ब्राउज़र समर्थन चाहते हैं, तो शायद सबसे अच्छा विकल्प है:

मेटा टैग [रोबिदु द्वारा]

/* HTML: */
<meta name="yourData" content="Your data is here" />

/* JS: */
var data1 = document.getElementsByName('yourData')[0].content;

इसका दोष यह है कि मेटा टैग लगाने का सही स्थान [HTML 4 तक] हेड टैग में है, और हो सकता है कि आप इस डेटा को वहां न चाहें। उससे बचने के लिए या शरीर में मेटा टैग लगाने के लिए, आप एक का उपयोग कर सकते हैं:

छिपा हुआ पैराग्राफ

/* HTML: */
<p hidden id="yourData">Your data is here</p>

/* JS: */
var yourData = document.getElementById('yourData').innerHTML;

अधिक ब्राउज़र समर्थन के लिए, आप छिपी विशेषता के बजाय CSS वर्ग का उपयोग कर सकते हैं:

/* CSS: */
.hidden {
   display: none;
}

/* HTML: */
<p class="hidden" id="yourData">Your data is here</p>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.