2012-08-15 11 views
35

मैं केवल डीओएम कार्यक्रमों को क्लोनिंग या फिर से प्रेषित करने का एक सरल और अमूर्त तरीका ढूंढ रहा हूं। मुझे डोम नोड्स क्लोन करने में दिलचस्पी नहीं है।डीओएम कार्यक्रमों को क्लोन या फिर प्रेषित कैसे करें?

मैं थोड़ा प्रयोग किया गया है, DOM Events specification पढ़ सकते हैं और मैं कोई स्पष्ट उत्तर नहीं मिला।

आदर्श रूप में, मैं कुछ के लिए देख रहा हूँ के रूप में सीधी-सपाट रूप में:

handler = function(e){ 
    document.getElementById("decoy").dispatchEvent(e) 
} 
document.getElementById("source").addEventListener("click", handler) 

इस कोड उदाहरण, ज़ाहिर है, काम नहीं करता। एक डॉम अपवाद है जिसमें कहा गया है कि वर्तमान में घटना भेजी जा रही है - जाहिर है।

मैं मैन्युअल रूप से बचने के लिए, document.createEvent() के साथ नए घटनाओं बनाने के लिए उन्हें आरंभ और उन्हें भेजने चाहते हैं।

वहाँ उपयोग के इस मामले को एक सरल उपाय है?

+0

तुम क्यों घटनाओं redispatch करने की आवश्यकता है (jQuery उपयोगकर्ताओं के लिए आप का उपयोग करने के e.originalEvent.constructore.constructor के बजाय आवश्यकता हो सकती है)? – josh3736

+0

मुझे इसे सीएसएस क्षेत्र के लिए एक समाधान के रूप में चाहिए जो वर्तमान में बाल नोड घटनाओं को प्रेषित नहीं करता है। क्षेत्र केवल बच्चे नोड सामग्री प्रस्तुत करते हैं, वे पेरेंट नोड्स के रूप में कार्य नहीं करते हैं। –

उत्तर

63

मुझे पता है, सवाल पुराना है, और ओ पी बनाने/आरंभ से बचना चाहते थे

+०१२३५१६४१०६:

new_event = new MouseEvent(old_event.type, old_event) 

आप सिर्फ माउस की घटनाओं की तुलना में अधिक चाहते हैं, आप कुछ इस तरह कर सकता है: दृष्टिकोण है, लेकिन वहाँ की घटनाओं नकल के लिए एक अपेक्षाकृत सरल तरीका है

new_event = new old_event.constructor(old_event.type, old_event) 

और मूल संदर्भ में:

handler = function(e) { 
    new_e = new e.constructor(e.type, e); 
    document.getElementById("decoy").dispatchEvent(new_e); 
} 
document.getElementById("source").addEventListener("click", handler); 

:

+1

के साथ अद्यतन जोड़ा है नोट करें कि यह केवल फ़ायरफ़ॉक्स और क्रोम के आधुनिक संस्करणों में काम करता है, और आईई –

+3

@ एलेक्सिस के किसी भी संस्करण में काम नहीं करता है: '' 'अनकॉट टाइप एरर: अवैध कन्स्ट्रक्टर' ' ( – niieani

+0

@NIXin किस ब्राउज़र में? – Alexis

-2

घटना को ट्रिगर करने के बारे में क्या?

आपके मामले में:

$('#decoy').trigger('click') 

या शुद्ध जे एस में आप इसे में How to trigger event in JavaScript?


अद्यतन प्राप्त कर सकते हैं

मैं jQuery के माध्यम से एक रास्ता मिल गया:

  1. जैसा कि यहां लिखा गया है - jQuery find events handlers registered with an object आपको आवश्यक ईवेंट प्राप्त करने की आवश्यकता है। उदाहरण $('#decoy').data('events').click[0].handler; लिए

  2. अब आप इस हैंडलर के लिए लिंक मिल सकता है। - लेकिन आप हैंडलर के स्वतंत्र प्रतिलिपि बनाना चाहते हैं हैंडलर की प्रतिलिपि बनाने के लिए इस कोड का उपयोग:


function clone_obj(obj){ 
    if(obj == null || typeof(obj) != 'object') return obj; 
    var temp = new obj.constructor(); 
    for(var key in obj) temp[key] = clone_obj(obj[key]); 
    return temp; 
} 
+1

हां, मैं एक नया कार्यक्रम ट्रिगर कर सकता हूं, लेकिन इसमें मूल घटना को दर्शाने के लिए अपने राज्य के मैन्युअल सेटअप शामिल हैं। मैं डोम को घटना के क्लोनिंग को संभालने का एक तरीका ढूंढ रहा हूं, जो भी हो: क्लिक, स्पर्श, इत्यादि। –

+0

मैंने उत्तर – Rustam

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