2013-04-15 9 views
20

पर प्रोग्रामेटिक परिवर्तनों का पता लगाएं क्या कोई स्क्रिप्ट इनपुट इनपुट टेक्स्ट के मान को बदलते समय सूचित करने का कोई तरीका है।इनपुट प्रकार टेक्स्ट

मैं

<input id='test' type='text' /> 

और एक स्क्रिप्ट

document.getElementById('test').value = 'bbb'; 

मैं पाठ के परिवर्तन की सूचना प्राप्त करना चाहते है।

मुझे पता है कि मुझे कीडाउन, कीप, ऑनब्लर इत्यादिरा द्वारा सूचित किया जा सकता है (जो काम करता है अगर मैं उपयोगकर्ता टाइपिंग को ट्रैक करने की कोशिश कर रहा हूं) लेकिन क्या परिवर्तन प्रोग्रामेटिक रूप से किया जाता है?

बहुत धन्यवाद

पेज। कोई JQuery कृपया या अगर jquery करता है तो कोई यह समझा सकता है कि यह इसे कैसे प्राप्त करता है।

+0

स्क्रिप्ट में जहां यह दस्तावेज़.getElementById ('test') कहता है।मूल्य = 'बीबीबी'; y आप एक फ़ंक्शन – 999k

+0

@ 555k पर कॉल नहीं करते हैं, जिसके लिए मुझे पंजीकरण करना है? उदाहरण के लिए यदि मैं दस्तावेज़ टाइप कर रहा था .getElementById ('test')। Onkeyup = function() {...} जो – Zo72

+0

काम नहीं करेगा, एक विचार DOMElement से "उत्तराधिकारी" होगा, एक "मूल्य" परिभाषित करें -प्रोपर्टी गेटर और सेटर (जैसा कि @MaxArt प्रस्तावित किया गया है) और गेटर और सेटर के अंदर डोमेलेमेंट के मूल "मान" -ट्रिब्यूट का उपयोग करें। –

उत्तर

12

आप एक आधुनिक ब्राउज़र साथ काम कर रहे हैं, तो आप कुछ इस तरह से कोशिश कर सकते हैं:

var input = document.getElementById('test'); 
input._value = input.value; 
Object.defineProperty(input, "value", { 
    get: function() {return this._value;}, 
    set: function(v) { 
     // Do your stuff 
     this._value = v; 
    } 
}); 

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

+1

ऐसा लगता है कि जब आप 'मान'-विशेषता को फिर से परिभाषित करते हैं तो इनपुट फ़ील्ड अब 'मान'-विशेषता के लिए "कनेक्ट" नहीं होता है। –

+1

@MaxArt यह वास्तव में चालाक है ... लेकिन क्या कोई दुष्प्रभाव हैं? मैं 'मान' संपत्ति – Zo72

+1

दुष्प्रभाव यह मुख्य रूप से एक है कि Jasd उल्लेख किया है, के साथ साथ समस्या है को पुनर्परिभाषित @ Zo72 के बारे में थोड़ा चिंतित हूँ कि अगर उपयोगकर्ता कोई नया मान नहीं है * कोई रास्ता नहीं * यदि आप पता लगा सकते हैं कि वह क्या आपके द्वारा लिखा गया है, जब तक आप हर एक महत्वपूर्ण घटना को पकड़ने और इसकी व्याख्या करने जा रहे हैं। यह पहले से ही एक गड़बड़ है, लेकिन यदि आप कट/प्रतिलिपि/पेस्ट घटनाओं को जोड़ते हैं, तो यह बहुत बड़ा होगा। – MaxArt

-1

तुरन्त ट्रैक करने के लिए अगर एक परिवर्तन किया गया है हो सकता है एक ही रास्ता:

var value = document.getElementById('test').value; 

function trackChanges(oldVal) { 
    var newVal = document.getElementById('test').value; 

    if (newVal !== oldVal) { 
     alert('Changes occured!'); 
    } 

    var fn = function() { trackChanges(newVal); }; 

    setTimeout(fn(),100); 
} 

setTimeout(trackChanges(value), 100); 

इसका मतलब यह है कि आप एक समारोह जो अगर एक परिवर्तन किया गया है की जाँच करने के अपने आप में हर 100 milisecond कहा जाता है बुला रहे हैं।

हो सकता है कि आप कुछ बेहतर करने के लिए प्रयास करें जब आप केवल कुछ और होने पर परीक्षण करने की कोशिश करते हैं, उदा। एक एक तत्व हो सकता है पर क्लिक करें ...

+3

फरीना धन्यवाद के लिए क्या तय किया था और हाँ, सेटटाइमआउट काम करेगा लेकिन यह करने का यह एक भयानक तरीका है। इसके अलावा हमेशा कुछ विलंबता होगी (उदाहरण के लिए 100 मिलीसेकंड) – Zo72

7

मुझे लगता है सबसे आसान तरीका है वास्तव में मैन्युअल रूप से घटना को गति प्रदान करने के लिए है:

document.getElementById('test').value = 'bbb'; 
var evt = new CustomEvent('change'); 
document.getElementById('test').dispatchEvent(evt); 

बस change घटना को सुन त्रुटि प्रवण जब मूल्य प्रोग्राम के रूप में बदल जाता है। लेकिन चूंकि आप मूल्य बदल रहे हैं, CustomEvent के साथ, दो पंक्तियां जोड़ें और परिवर्तन ईवेंट को आग लगाएं।

तो आप इस change घटना को पकड़ने के लिए सक्षम हो जाएगा, या तो इनलाइन:

<input id="test" onchange="console.log(this)"> 

या एक श्रोता के साथ:

document.getElementById('test').addEventListener('change',function(event) { 
    console.log(event.target); 
}); 

यह लाभ है कि अगर आप एक निवेश है जो कर सकते हैं उपयोगकर्ता द्वारा बदला जा सकता है, आप उन घटनाओं (उपयोगकर्ता या स्क्रिप्ट से) को पकड़ सकते हैं

हालांकि यह इस तथ्य पर निर्भर करता है कि आप स्वयं प्रोग्रामेटिक रूप से हैं इनपुट के मूल्य को बदल रहा है। यदि आप पुस्तकालयों का उपयोग कर रहे हैं (जैसे datepickr) जो आपके इनपुट के मानों को बदलते हैं तो आपको कोड में जाना होगा और उन दो पंक्तियों को सही जगह पर जोड़ना होगा।

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