2010-02-25 20 views
15

का उपयोग अन्य के लिए एक तत्व से घटनाओं मैं डोम है इस तरह है:कॉपी jQuery

<a href='javascript:void(0)' id='link1'>Element with events bound initially</a> 
<a href='javascript:void(0)' id='link2'>Element to which events are bound in future</a> 

और यह जावास्क्रिप्ट:

$(function(){ 
    $('#link1').bind('click',function(){alert('do something to make me happy');}) 
}); 

अब भविष्य में कुछ समय मैं सभी घटनाओं पर बाध्य प्रतिलिपि बनाना चाहते हैं लिंक 1 से लिंक 2। मैं इसे नीचे लिखे अनुसार कर रहा हूं कृपया यदि संभव हो तो उपलब्ध कुछ बेहतर तरीका सुझाएं।

var _elmEvents = $(#link1).data('events'); 

if (_elmEvents) { 
    $.each(_elmEvents, function (event, handlers) { 
     $.each(handlers, function (j, handler) { 
      $('#link2').bind(event, handler); 
     }); 
    }); 
} 
+0

यह महत्वपूर्ण है कि आप ध्यान दें jQuery अब बदल गया है और आदेश एक तत्व आप $ का उपयोग करना चाहिए पर घटनाओं प्राप्त करने के लिए किया गया है नीचे पूछा टिप्पणियों में से किसी के लिए ._data ($ ("# foo") [0], "ईवेंट")। (JQuery v2.1.4 के रूप में काम करता है) अन्यथा आप नीचे दी गई किसी भी विधि से अपरिभाषित होंगे। संदर्भ के लिए देखें: http://stackoverflow.com/questions/2008592/can-i-find-events-bound-on-an-element-with-jquery – Zanderi

उत्तर

13

यदि आप क्लोनिंग के बिना किसी ऑब्जेक्ट से दूसरे ऑब्जेक्ट्स को प्रतिलिपि बनाना चाहते हैं, तो आप ईवेंट ईवेंट को सीधे एक्सेस करके ऐसा कर सकते हैं।

उदाहरण के लिए, यदि आप ने क्या किया:

$("#the_link").click(function(e){ 
    // do some stuff 
    return false; 
}.mouseover(function(e){ 
    // do some other stuff 
}); 

आप तत्व की 'घटनाओं' डेटा में उन घटना सहयोगियों का उपयोग कर सकते

var events = $("#the_link").data('events'); 

यह एक वस्तु जिसका कुंजी घटना का प्रतिनिधित्व किया जाएगा टाइप करें, प्रत्येक में ईवेंट एसोसिएशन की एक सरणी है। भले ही, यहां एक सरल उदाहरण है, नामस्थानों के लिए लेखांकन नहीं। के रूप में मैं नामस्थान और अन्य घटनाओं (जैसे कि "पेस्ट" के रूप में) है कि jQuery में एक विधि का उपयोग नहीं कर रहे हैं

var events = $("#the_link").data('events'); 
var $other_link = $("#other_link"); 
if (events) { 
    for (var eventType in events) { 
     for (var idx in events[eventType]) { 
      // this will essentially do $other_link.click(fn) for each bound event 
      $other_link[ eventType ](events[eventType][idx].handler); 
     } 
    } 
} 
+0

यह समाधान मेरे लिए काम नहीं करता है, और खाता नामस्थानों को ध्यान में रखता नहीं है। मैंने एक नया जवाब जोड़ा जो उन्हें संभालता है (और मेरे मामले में काम करता है)। –

1

this resource देखें।

+0

हम्म, जानना अच्छा है। सॉर्टा की इच्छा है कि मैं इस टिप्पणी को अनिवार्य रूप से इस प्लगइन में लिखने से पहले इस टिप्पणी को देखूंगा।:) – BBonifield

+0

ध्यान दें कि 'क्लोन' एक तर्क लेता है जो घटनाओं की प्रतिलिपि बनाता है, 2007 से इस समाधान को कुछ हद तक अनिवार्य रूप से प्रस्तुत करता है। –

1

आप clone कर सकते हैं एक तत्व और नए तत्व को मनचाहे में हेरफेर, हालांकि jQuery दूसरे करने के लिए एक तत्व से ईवेंट हैंडलर्स कॉपी करने के लिए एक आसान तरीका प्रदान नहीं करता है। हालांकि, कोड है कि यह करना होगा होगा:

var events = jQuery.data(originalElement, "events"); 

for (var type in events) { 
    for (var handler in events[ type ]) { 
     jQuery.event.add(targetElement, type, events[ type ][ handler ], events[ type ][ handler ].data); 
    } 
} 

लेकिन यह jQuery internals पर कुछ हद तक निर्भर करता है के बाद से, मैं एक समाधान क्लोन का उपयोग कर बनाने के लिए कोशिश करेंगे।

3

स्वीकृत जवाब मेरे लिए काम नहीं किया।

यह मेरे लिए काम किया:

function copyEvents(source, destination) { 
    // Get source events 
    var events = source.data('events'); 

    // Iterate through all event types 
    $.each(events, function(eventType, eventArray) { 
     // Iterate through every bound handler 
     $.each(eventArray, function(index, event) { 
      // Take event namespaces into account 
      var eventToBind = event.namespace.length > 0 
       ? (event.type + '.' + event.namespace) 
       : (event.type); 

      // Bind event 
      destination.bind(eventToBind, event.data, event.handler); 
     }); 
    }); 
} 
0

यह Brandons काम पर आधारित है, लेकिन सभी jQuery-संस्करणों के साथ काम करने के लिए अद्यतन। 1.6.4 पर 2.0.x पर परीक्षण किया गया।

/** 
* Logic for copying events from one jQuery object to another. 
* 
* @private 
* @name jQuery.event.copy 
* @param jQuery|String|DOM Element jQuery object to copy events from. Only uses the first matched element. 
* @param jQuery|String|DOM Element jQuery object to copy events to. Copies to all matched elements. 
* @type undefined 
* @cat Plugins/copyEvents 
* @author Brandon Aaron (brandon[email protected] || http://brandonaaron.net) 
* @author Yannick Albert ([email protected] || http://yckart.com) 
*/ 
jQuery.event.copy = function (from, to) { 
    from = from.jquery ? from : jQuery(from); 
    to = to.jquery ? to : jQuery(to); 

    var events = from[0].events || jQuery.data(from[0], "events") || jQuery._data(from[0], "events"); 
    if (!from.length || !to.length || !events) return; 

    return to.each(function() { 
     for (var type in events) 
     for (var handler in events[type]) 
     jQuery.event.add(this, type, events[type][handler], events[type][handler].data); 
    }); 
}; 
1

यह मेरी लिपि में बहुत अच्छा काम करता है।

$.each($('#original').data('events'), function() { 
    // iterate registered handler of original 
    $.each(this, function() { 
    $('#target').bind(this.type, this.handler); 
    }); 
}); 

मैं इसे यहाँ (स्रोत) पाया: http://snipplr.com/view/64750/

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