2012-06-10 7 views
14

मैं अब इस अधिकार है:जावास्क्रिप्ट OnPaste

<input type="text" placeholder="Paste text" onPaste="alert(this.value);">

यह वास्तव में काम करता है, को छोड़कर, यह एक खाली अलर्ट विंडो देता है। मुझे कोई मूल्य नहीं मिलता है। मदद?

उत्तर

36

onpaste घटना input के value से पहले आग लग जाती है।

<input type="text" placeholder="Paste text" onPaste="var e=this; setTimeout(function(){alert(e.value);}, 4);">​ 

मैं this के रूप में एक वैश्विक वर अंदर this के लिए एक संदर्भ के संचय कर रहा हूँ समय समाप्त समारोह जो विंडो ऑब्जेक्ट से जुड़ा हुआ है के दायरे के अंदर सुलभ नहीं है: आप एक setTimeout के रूप में कुछ इस तरह की जरूरत है।

मैं टाइमआउट के रूप में 4 मिलीसेकंड का उपयोग कर रहा हूं क्योंकि यह HTML5 विनिर्देश में न्यूनतम मान्य अंतराल/टाइमआउट है। संपादित करें: टिप्पणियों में उल्लेख के अनुसार, आप 0 मिलीसेकंड का उपयोग समय के रूप में भी कर सकते हैं, जिसे स्वचालित रूप से 4 पर पुन: गणना किया जाता है। jsPerf tests

Fiddle

साथ ही आप अपने onpaste घटना this एक पैरामीटर अपने HTML बहुत ज्यादा जे एस के साथ मिश्रण को रोकने के लिए के रूप में पारित करने के अंदर एक समारोह कॉल कर सकते हैं। :)

और यहाँ एक समारोह एकाधिक आदानों में पढ़ने में आसान और जो आप उपयोग कर सकते है:

function pasted(element) { 
    setTimeout(function(){ 
     alert(element.value); 
    }, 0); //or 4 
}​ 

कौन सा बस onPaste="pasted(this)" किसी भी इनपुट के लिए के साथ कहा जा सकता है।

Fiddle

+2

टाइमआउट को शून्य पर सेट किया जा सकता है – scriptin

+3

@DmitryScriptin हां यह कर सकता है, लेकिन एचटीएमएल 5 विनिर्देश में इसे 4 के रूप में व्याख्या किया जाएगा, भले ही आप इसे 0 पर सेट करें (जेएसपीएफ में कुछ परीक्षण मामले साबित करने के लिए), इसलिए मैंने उपयोग किया पुनः गणना को रोकने के लिए एक वैध संख्या। :) –

+2

मैं "कतारबद्ध घटना" के लिए "0" पसंद करता हूं, तब मुझे यह अनुमान लगाने की ज़रूरत नहीं है कि * इरादा * क्या है (वह और यह लगातार कोड के लिए बनाता है) हालांकि केवल * छोड़कर * मान भी पर्याप्त होना चाहिए। "पुन: गणना" के लिए ** कोई ** प्रदर्शन प्रभाव नहीं होगा। –

9

इसका कारण यह है onpaste घटना आग से पहले सामग्री तत्व (link) में चिपकाया जाता है तो यह समय आप इसे संभाल पर अभी तक वहाँ नहीं है।

आधुनिक ब्राउज़र ईवेंट हैंडलर के अंदर क्लिपबोर्ड डेटा प्राप्त करने के तरीकों का समर्थन करते हैं। क्रॉस-ब्राउज़र समाधान प्रयासों के लिए JavaScript get clipboard data on paste event (Cross browser) का संदर्भ लें।

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

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