onew.setAttribute ("टाइप", "बटन");
HTML दस्तावेज़ों पर setAttribute का कभी भी उपयोग न करें। आईई यह बुरी तरह से कई मामलों में गलत हो जाता है, और डोम-एचटीएमएल गुण अपेक्षाकृत कम होता है, तेज और आसान को पढ़ने के लिए:
onew.type= 'button';
onew.onclick = function() {fnDisplay_Computers (" '" + alines [i ] + "'"); }; // यानी
'alines' क्या है? क्यों आप इसे एक स्ट्रिंग को बदलने और एकल उद्धरण के साथ इसके आसपास रहे हैं? ऐसा लगता है कि आप कुछ जघन्य एक स्ट्रिंग में कोड का मूल्यांकन (जो कि तुम क्या 'onew.setAttribute के संस्करण में नीचे कर रहे है) को शामिल करने के लिए कोशिश कर रहे हैं। तारों में जावास्क्रिप्ट कोड का मूल्यांकन करना लगभग हमेशा गलत बात है; प्लेग की तरह इसे टालें। उपरोक्त मामले में, IE और Firefox के रूप में एक ही करना चाहिए: यह काम नहीं करना चाहिए।
यदि 'alines [i]' एक स्ट्रिंग है, तो मुझे लगता है कि आप जो करने का प्रयास कर रहे हैं, उसे याद है कि कोड स्ट्रिंग का निर्माण करके स्ट्रिंग को याद किया जाएगा जो जावास्क्रिप्ट में मूल स्ट्रिंग में मूल्यांकन करेगा। लेकिन:
"'" + alines[i] + "'"
अपर्याप्त है। क्या होगा यदि 'alines [i]' में एपोस्ट्रोफ़ी, या एक बैकस्लैश है?
'O'Reilly'
आपके पास एक वाक्यविन्यास त्रुटि और संभावित सुरक्षा छेद है।अब, आप कुछ श्रमसाध्य और कष्टप्रद की तरह कर सकता है:
"'" + alines[i].split('\\').join('\\\\').split("'").join("\\'") + "'"
स्ट्रिंग भागने की कोशिश करने के लिए है, लेकिन यह बदसूरत है और अन्य डेटाटाइप्स के लिए काम नहीं करेगा। तुम भी आप के लिए यह करने के लिए जावास्क्रिप्ट पूछ सकते:
uneval(alines[i])
लेकिन सभी वस्तुओं भी जावास्क्रिप्ट स्रोत तार evaluatable लिए परिवर्तित किया जा सकता है; मूल रूप से संपूर्ण दृष्टिकोण विफलता के लिए बर्बाद हो गया है।
सामान्य बात करता है, तो आप सिर्फ onclick कॉलबैक एक पैरामीटर के साथ एक समारोह कॉल करना चाहते करने के लिए सरल तरीके से कोड लिखने के लिए:
onew.onclick= function() {
fnDisplay_Computers(alines[i]);
};
आम तौर पर यह काम करते हैं और आप क्या चाहते है । हालांकि, यहां एक मामूली झुर्रियां है जो आपने यहां मारा हो सकता है, जो आपको तारों के साथ निराशाजनक दृष्टिकोण पर विचार करने में भ्रमित कर सकता है।
अर्थात्, यदि इस मामले में 'मैं' लूप के लिए एक संलग्न 'चर का चर है, तो' alines [i] 'का संदर्भ ऐसा नहीं करेगा जो आपको लगता है। जब क्लिक होता है तो 'i' को कॉलबैक फ़ंक्शन द्वारा एक्सेस किया जाएगा - के बाद लूप समाप्त हो गया है। इस बिंदु पर 'i' वैरिएबल को लूप के अंत में जो भी मूल्य था, उसके साथ छोड़ा जाएगा, इसलिए 'alines' i 'हमेशा' alines 'का अंतिम तत्व होगा, भले ही' ओन्यू 'पर क्लिक किया गया हो।
(जैसे देखें। How to fix closure problem in ActionScript 3 (AS3) इस में से कुछ चर्चा के लिए। यह दोनों जावास्क्रिप्ट और अजगर में बंद के साथ भ्रम की सबसे बड़ा कारण है, और वास्तव में कुछ दिन एक भाषा के स्तर पर किया जाना चाहिए।)
आप कर सकते हैं अपनी ही समारोह में बंद encapsulating, इस तरह से पाश समस्या को हल मिलता है:
function callbackWithArgs(f, args) {
return function() { f.apply(window, args); }
}
// ...
onew.onclick= callbackWithArgs(fnDisplay_Computers, [alines[i]]);
और जावास्क्रिप्ट के बाद के संस्करण में, आप बस कहने के लिए सक्षम हो जाएगा:
onew.onclick= fnDisplay_Computers.bind(window, alines[i]);
आप ब्राउज़रों में आज Function.bind() 'उपयोग करने में सक्षम होना चाहते हैं, तो आप Prototype ढांचे से एक क्रियान्वयन प्राप्त कर सकते हैं, या बस का उपयोग करें:
if (!('bind' in Function.prototype)) {
Function.prototype.bind= function(owner) {
var that= this;
var args= Array.prototype.slice.call(arguments, 1);
return function() {
return that.apply(owner,
args.length===0? arguments : arguments.length===0? args :
args.concat(Array.prototype.slice.call(arguments, 0))
);
};
};
}
यह पूरी तरह से काम करता है, तुम क्यों यह एक "नया कार्य" (के रूप में सेट अप करने की व्याख्या कर सकते हैं भले ही समारोह fnDisplay_Computers() " पहले से ही परिभाषित किया गया है, समस्या हल करता है? –
मुझे लगता है कि यह शामिल डेटा प्रकार की समस्या है और नई ऑनक्लिक विधि से जुड़े "नए फ़ंक्शन" का संदर्भ है ... लेकिन मुझे वास्तव में सही जवाब नहीं पता है, क्षमा करें! –
सुंदर! धन्यवाद! आईई 7 के साथ समस्याएं पूरी तरह से हल हुईं। –