2012-06-15 17 views
5

मैं एक संपादन योग्य div अनुकरण करने के लिए एक jQuery प्लगइन लिख रहा हूं।हैंडल इनपुट टेक्स्ट चेंज इवेंट

(function($){ 
    $.fn.editable = function(){ 
     return this.each(function(){ 
      var $this = $(this).hide(); 
      var div = $('<div>'+$this.val()+'</div>').show().insertAfter($this).data('input',$this); 

      $this.data('div',div); 

      div.dblclick(function(){ 
       $(this).hide(); 
       $(this).data('input').val($(this).text()).show(); 
      }); 
      $this.blur(function(){ 
       $(this).hide(); 
       $(this).data('div').html($(this).val()).show();     
      }); 

      $this.change(function(){ 
       $(this).data('div').html($(this).val());  
      }); 
     }); 
    }; 

})(jQuery); 

अब तक, this works बहुत अच्छी तरह से ..

अब, मुझे क्या करना चाहते हैं, और कोई सुराग नहीं कैसे है, div पाठ परिवर्तन करने के लिए करता है, तो छिपा हुआ है:
यहाँ मेरी कोड है इनपुट मूल्य परिवर्तन।
मतलब, मैं परिवर्तन घटना मैन्युअल को गति प्रदान करता है, तो मैं $('#editable').val('new text') div बदलना चाहिए ..

नहीं कर सकते, क्योंकि इनपुट परिवर्तन अन्य प्लग इन मैं नियंत्रण नहीं के भीतर हो जाएगा ..

+0

आप आप कैसे उम्मीद कर सकते हैं पर विस्तार '$ ('# संपादन योग्य')। वैल()' काम करने के लिए? 'Html()' के विपरीत 'val()' क्यों? और आईडी किस संपादन योग्य है? –

+0

@palintropos ने मेरे जेएसफ़िल्ड – skafandri

+1

को एक तरफ अपडेट किया है, क्या आपने 'contenteEditable' में देखा है? मेरा मानना ​​है कि यह बहुत अच्छी तरह से समर्थित है –

उत्तर

3

इस पर एक नज़र डालें, अपनी प्लगइन में आप इस तरह के वैल फ़ंक्शन का विस्तार कर सकते हैं ताकि वैल फ़ंक्शन का उपयोग करके मूल्य बदल दिया गया हो।

How to extend the val method so that the change event is triggered when val is called?

+0

इसके बजाय यह प्लगइन के लिए डबल '.change()' ईवेंट ट्रिगर करेगा जो '.val()' के बाद सही ढंग से '.change()' को कॉल करता है। तकनीक इनपुट की सूची के साथ मिल सकती है, ताकि (इस मामले में) केवल '$ (" # संपादन योग्य ")। वैल (" नया मान ") 'एक बदलाव को ट्रिगर करता है। ("सही ढंग से" प्लगइन के उद्देश्य के आधार पर है, मुझे लगता है।) –

+0

क्या आप कृपया अधिक व्याख्या कर सकते हैं या मुझे कुछ नमूना दे सकते हैं? –

+0

यहां एक उदाहरण है http://jsfiddle.net/joelpurra/Emyk2/ –

-2

मेरा सुझाव

(function($){ 

    var methods = { 

    init : function(options) { 
     return this.each(function() { 
     var $this = $(this).hide(); 
     var div = $('<div>'+$this.val()+'</div>').show().insertAfter($this).data('input',$this); 

     $this.data('div',div); 

     div.dblclick(function(){ 
      $(this).hide(); 
      $(this).data('input').val($(this).text()).show(); 
     }); 
     $this.blur(function(){ 
      $(this).hide(); 
      $(this).data('div').html($(this).val()).show();     
     }); 
    }, 

    value : function(str) { 
     return this.each(function(){ 
     $(this).val(str); 
     $(this).data('div').html($(this).val()); 
     }); 
    } 
    }; 

    $.fn.editable = function(method) { 

    // Method calling logic 
    if (methods[method]) { 
     return methods[ method ].apply(this, Array.prototype.slice.call(arguments, 1)); 
    } else if (typeof method === 'object' || ! method) { 
     return methods.init.apply(this, arguments); 
    } else { 
     $.error('Method ' + method + ' does not exist on jQuery.editable'); 
    }  

    }; 

})(jQuery); 
:

तो फिर तुम कुछ इस तरह होगा: यदि आप अपने jQuery प्लगइन समर्थन तरीकों Plugins/Authoring - Namespacing पर वर्णित के रूप में बनाने के लिए

तो फिर तुम इसे इस तरह का उपयोग करेगा:

$('#editable').editable('new value that will sync the related div'); 
// instead of `$('#editable').value('...')` 

मैं दृढ़ता से Plugins/Authoring - Namespacing के jQuery पर लेख पढ़ने के लिए सुझाव देते हैं।


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

मैं दृढ़ता से आपको अपने प्लगइन डिज़ाइन की समीक्षा करने की सलाह देता हूं, क्योंकि यह मेरी व्यक्तिगत राय में उपलब्ध नहीं है।

लेकिन,

+0

मैं '.trigger ('change') जोड़ सकता हूं 'आसान नहीं है? लेकिन अन्य प्लगइन्स द्वारा इनपुट का उपयोग किया जाएगा, इसलिए यह केवल '.val (' नया टेक्स्ट ') ' – skafandri

+0

होगा प्रश्न नहीं था: jQuery प्लगइन्स कैसे लिखें .. – skafandri

+0

नकारात्मक बिंदुओं के लिए, मैं आपके प्रस्तावित उत्तर को जेएसएफडल के साथ आपके वर्णित व्यवहार के साथ प्रकाश देने का प्रयास करेगा। मैंने पहले से ही अपनी jQuery संपादन योग्य प्लगइन लिखी है और मुझे पहले से ही इस _common_ स्थिति का सामना करना पड़ा है, मुझे यकीन है कि ऐसा करने का यह तरीका आप जो करना चाहते हैं वह करेगा। –

2

जब आप दोगुना <div><input> संपादित करने के लिए क्लिक करें, आप अधिलेखित कर रहे हैं के बाद से मैं पूरी परिदृश्य नहीं देख सकते हैं, कोड का निम्न भाग चाल

(function() { 

    // Store the original jQuery.val() 
    var $$val = $.fn.val; 

    // Add a hook. 
    $.fn.val = function(s) { 

     // Call your plugin change event. 
     $(this).editable('change'); 

     // Delegate to the original jQuery.val function. 
     return $$val.apply(this, Array.prototype.slice.call(arguments)); 
    }; 

    // Your plugin stuff... 
}) 

HTH करना होगा इस लाइन के साथ इनपुट के मूल्य:

$(this).data('input').val($(this).text()).show(); 

तो .change() घटना ट्रिगर नहीं किया गया है (जैसा कि आप इंगित करते हैं), इसका मतलब है कि आप बाहरी प्लगइन द्वारा किए गए परिवर्तनों को अपने div की "पुरानी" सामग्री के साथ ओवरराइट कर रहे हैं। उस समस्या से बचने के लिए .val() हटाएं।

$(this).data('input').show(); 

बाहरी प्लगइन .change() ट्रिगर पर भरोसा करने के लिए एक विकल्प के रूप में, आप मतदान द्वारा मूल्य देख सकते हैं। यदि घटनाएं उपलब्ध हैं तो इसकी अनुशंसा नहीं की जाती है, यदि आप मतदान अंतराल को उचित रूप से सेट करते हैं तो इसका कोई बड़ा प्रभाव नहीं पड़ेगा। चूंकि आप किसी रूप में डेटा दर्ज करने वाले मनुष्यों से निपट रहे हैं, इसलिए मुझे लगता है कि आपको हर 250 मिलीसेकंड से अधिक बार मतदान करने की आवश्यकता नहीं है।

$("#editable").changePolling(); एक रैपर के लिए देखें जो वर्तमान मान की जांच करता है और अगर यह बदल गया है तो .change() ट्रिगर करता है। अपने कोड के आधार पर उदाहरण के लिए the forked jsfiddle देखें।

+0

जेएसफ़िल्ड काम नहीं करता .. बटन पर क्लिक करने से कुछ भी नहीं .. – skafandri

+0

@sonia: क्या आप IE में परीक्षण कर रहे हैं? आईई (और संभवतः अन्य ब्राउज़र्स) उन स्क्रिप्ट्स को शामिल करने के बारे में पसंद करते हैं जिन्हें सही सामग्री प्रकार के साथ परोसा जाता है। I'v –

+0

@sonia: सही सामग्री प्रकार ['एप्लिकेशन/जावास्क्रिप्ट 'या' टेक्स्ट/जावास्क्रिप्ट'] होगा (http://en.wikipedia.org/wiki/JavaScript)। मैंने [मेरी जिस्ट से कच्ची लिपि को लिंक किया है] (https://gist.github.com/raw/2944926/d87c96c1529d7f5e8c8c4015c7b9100a5f6a8db8/changepolling.joelpurra.js) जो सही सामग्री प्रकार की सेवा नहीं करता है। परीक्षण उद्देश्यों के लिए आप पूरे '.changePolling()' स्रोत कोड को jsFiddle में कॉपी-पेस्ट कर सकते हैं, और उसके बाद इसे चला सकते हैं। –

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