2011-02-04 12 views
7

मैं सोच रहा था कि कोई जावास्क्रिप्ट के eval(), और एक अन्य दृष्टिकोण का उपयोग करने के बीच अंतर को समझा सकता है, जैसे कि स्क्रिप्ट टैग बनाने के लिए JQuery का उपयोग करना और फिर उस तत्व को पृष्ठ पर जोड़ना:eval() और स्क्रिप्ट टैग को जोड़ने के बीच जावास्क्रिप्ट अंतर

eval(somecode); 

बनाम

$("<script type='text/javascript'>"+somecode+"</script>").appendTo("head"); 

सुनिश्चित नहीं हैं कि अगर यह प्रासंगिक है, लेकिन यहां संदर्भ है: मैं जिसका मूल उद्देश्य आसानी से पॉपअप में नियमित रूप से लिंक करने के लिए बारी है Drupal पॉपअप मॉड्यूल का एक संस्करण के साथ काम कर रहा हूँ AJAX'ing द्वारा एक संपूर्ण पृष्ठ अनुरोध और इसे जोड़ने के द्वारा एक मॉडल खिड़की में पृष्ठ। इसमें अक्सर बाहरी सीएसएस और जावास्क्रिप्ट फ़ाइलें शामिल होती हैं। इस AJAX लोडिंग के प्रदर्शन को बेहतर बनाने के प्रयास में मैंने AJAX क्यूइंग का उपयोग करने के लिए स्विच किया, और मैंने बाहरी स्क्रिप्ट के एक eval() को वैकल्पिक रूप से सूचीबद्ध किया। हालांकि, इसने विभिन्न अन्य पृष्ठों पर स्पोराडिक जावास्क्रिप्ट बग का कारण बना दिया।

+1

मुझे नहीं लगता कि आप jquery के साथ जो भी कर रहे हैं, वह करने के लिए आप eval का उपयोग कैसे कर सकते हैं। इवल का उपयोग जेसन प्रतिक्रिया स्ट्रिंग्स जैसे चीजों को एरे और उस तरह की चीजों में बदलने के लिए किया जाता था। –

+0

@MattPhillips eval कोड का मूल्यांकन करता है। – Raynos

+0

@ मैट - jQuery में कुछ आंतरिक फ़ंक्शंस हैं जो स्क्रिप्ट टैग में दस्तावेज़ में इसे जोड़कर "eval" कोड डालते हैं।आईआईआरसी, 'ग्लोबलइवल' का उपयोग jQuery के AJAX फ़ंक्शंस द्वारा बड़े पैमाने पर किया जाता है, जिसमें समान-डोमेन स्क्रिप्ट और JSONP शामिल हैं। –

उत्तर

2

अच्छी तरह से एक (जहां तक ​​मतभेद जाते हैं) eval एक अभिव्यक्ति का परिणाम वापस कर देगा।

var result = eval('3+4'); // result = 7 

जब तक आपके जावास्क्रिप्ट स्ट्रिंग एक स्क्रिप्ट ब्लॉक की संरचना में है, मैं/एक स्क्रिप्ट टैग के अंतर्गत यह इंजेक्शन लगाने

+6

अधिक सटीक। 'eval()' अंतिम अभिव्यक्ति का परिणाम देता है जबकि एक स्क्रिप्ट टैग कुछ भी वापस नहीं कर सकता है। –

+0

@alexandre - सच है, यह अधिक सटीक शब्द है। मैं अपडेट करूंगा। –

+0

eval भी विफल रहता है यदि आप JSLint के माध्यम से अपना कोड चलाते हैं। – Raynos

1

मैं दृढ़ता से JSON-P उपयोग करने का सुझाव सुझाव है।

फ्लाई पर एक स्क्रिप्ट नोड बनाकर आउटगोइंग AJAX अनुरोध पर कॉलबैक फ़ंक्शन नाम जोड़ें (src = [url] के साथ), और कॉलबैक फ़ंक्शन को जेसन डेटा के साथ कॉल करने दें। आप अपने पृष्ठ में कॉलबैक फ़ंक्शन को परिभाषित करते हैं (ठीक से नामित) और इसके अंदर अपना अपडेट तर्क डाल दें।

गतिशील स्क्रिप्ट नोड कॉलबैक का लाभ यह है कि एक्सएचआर में समान डोमेन प्रतिबंध नहीं है।

उदाहरण के लिए, आपकी साइट www.foobar.com है और कुछ वेबसाइसेस www.foobarapi.com पर होस्ट किए जाते हैं। आप src साथ क्रम में एक स्क्रिप्ट नोड बनाने = "http://www.foobarapi.com/baz?a=foo1 & ख = foo2 & कॉलबैक = foo.bar.baz"

अपने पेज में इस बीच

, आपके पास :

foo.bar.baz = function(data) { 
    // use the data 
} 

और अपने बैकएंड सेवा, एक php कहते हैं, की तरह लग सकता है:

$a=$GET['a']; 
$b=$GET['b']; 
$callback = $GET['callback']; 
$c = someCalc($a, $b); 
echo $callback . "({ \"c\" : $c });"; 
+0

आपको अपना आने वाला डेटा JSONP दोस्ताना बनाना होगा। यह तृतीय पक्ष बाहरी फ़ाइलों के लिए उपयोगी नहीं है। – Raynos

+0

@ रेनॉस: सहमत हैं। –

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन यह केवल मेरे प्रश्न से संबंधित है। मैं 2 दृष्टिकोणों के बीच अंतर से संबंधित जानकारी की तलाश कर रहा था, क्योंकि एक और विधि का उपयोग करने के सुझाव के विपरीत, जो कुछ भी मैं लागू कर सकता हूं, संदर्भ के अनुसार। – Oliver

1

स्क्रिप्ट टैग जोड़ने तुल्यकालिक स्क्रिप्ट लोड होगा, एक्सएचआर के माध्यम से जब आप eval पाठ लोड हो रहा है जबकि, कि अतुल्यकालिक रूप से लोड किया गया था । एसिंक की वजह से, स्क्रिप्ट शायद ऑर्डर से बाहर हो गई थीं।

ध्यान दें कि इसके लिए एक बिलियन मामले हैं, लेकिन मुझे लगता है कि यह आपके परिदृश्य के आधार पर मामला है।

अब, आप एक्सएचआर को समकालिक रूप से लोड कर सकते हैं, लेकिन फिर चीजें बहुत धीमी हो जाएंगी। ब्राउज़र एक बार में छह (आईएसएच) स्क्रिप्ट लोड कर सकते हैं लेकिन क्रम में उन्हें निष्पादित कर सकते हैं। एक्सएचआर एक समय में एक लोड करेगा।

+0

मैं इस धारणा के तहत था कि सामान्य रूप से ब्राउज़र केवल एक ही बार में 2 अनुरोधों को संभाल सकता था, और वास्तव में यह सुनिश्चित करने के लिए कि प्रत्येक क्रम में लोड हो रहा है और पॉपअप पृष्ठ सही ढंग से चालू हो रहा है, इसलिए मैं प्रत्येक फाइल को सिंक्रनाइज़ कर रहा हूं, यही कारण है कि मैं परेशान था समस्या। मुझे एसिंक्रोनस लोडिंग करना अच्छा लगेगा, लेकिन जब आप AJAX के माध्यम से बाहरी जेएस और सीएसएस लोड कर रहे हों तो ऐसा अधिक समझ में आता है। – Oliver

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