2010-04-15 14 views
16

निम्नलिखित समारोह एक ड्रॉपडाउन मेनू में लक्ष्य तत्व हो जाता है:पहुँच event.target unobstrusive जावास्क्रिप्ट

function getTarget(evt){ 

var targetElement = null; 

//if it is a standard browser 
if (typeof evt.target != 'undefined'){ 
    targetElement = evt.target; 
} 
//otherwise it is IE then adapt syntax 
else{ 
    targetElement = evt.srcElement; 
} 

//return id of <li> element when hovering over <li> or <a> 
if (targetElement.nodeName.toLowerCase() == 'li'){ 
    return targetElement; 
} 
else if (targetElement.parentNode.nodeName.toLowerCase() == 'li'){ 

    return targetElement.parentNode; 
} 
else{ 
    return targetElement; 
} 

कहने के लिए है, यह फ़ायरफ़ॉक्स, क्रोम, सफारी और ओपेरा में काम करता है, लेकिन यह IE8 में नहीं है जरूरत (और मुझे लगता है कि पिछले संस्करणों में भी)। जब मैं IE8 के साथ इसे डिबग करने की कोशिश मैं त्रुटि "सदस्य नहीं मिला" लाइन पर मिलती है:

targetElement = evt.srcElement; 
अन्य बाद में त्रुटियों के साथ

, लेकिन मुझे लगता है कि इस कुंजी रेखा है। किसी भी मदद की सराहना की जाएगी।


क्षमा करें, किसी कारण से स्वरूपण सही नहीं है।

यहाँ समारोह है फिर

function getTarget(evt){ 

var targetElement = null; 

//if it is a standard browser get target 
if (typeof evt.target != 'undefined'){ 
    targetElement = evt.target; 
} 
//otherwise it is IE then adapt syntax and get target 
else{ 
    targetElement = evt.srcElement; 
} 

//return id of <li> element when hovering over <li> or <a> 
if (targetElement.nodeName.toLowerCase() == 'li'){ 
    return targetElement; 
} 
else if (targetElement.parentNode.nodeName.toLowerCase() == 'li'){ 

      return targetElement.parentNode; 
} 
else{ 
    return targetElement; 
} 

} // अंत getTarget

+4

आप jQuery का उपयोग करना चाहिए

मैं नीचे के रूप में तय की। – SLaks

+1

हाँ, यह आसान तरीका होगा;) – Mirko

उत्तर

2

मेरे अनुभव में, समस्या आपके द्वारा बताई गई जहां घटना (खिड़की या हैंडलर पैरामीटर) प्राप्त किया जाता है से संबंधित नहीं है बल्कि की वजह से चाहे घटना "ठीक से" उठाई गई हो या नहीं। उदाहरण के लिए, यदि आपके पास टेक्स्ट इनपुट तत्व है और आप ईवेंट ऑब्जेक्ट में गुजरने के बिना अपनी एक्सचेंज विधि को कॉल करते हैं, तो event.srcElement प्रॉपर्टी शून्य होगी।

fireEvent(element,'change'); 
32

समस्या यह है कि IE में, घटना वस्तु हैंडलर के एक तर्क के रूप में नहीं भेजा जाता है, यह सिर्फ एक वैश्विक है संपत्ति (window.event):

function getTarget(evt){ 
evt = evt || window.event; // get window.event if argument is falsy (in IE) 

// get srcElement if target is falsy (IE) 
var targetElement = evt.target || evt.srcElement; 

//return id of <li> element when hovering over <li> or <a> 
if (targetElement.nodeName.toLowerCase() == 'li'){ 
    return targetElement; 
} 
else if (targetElement.parentNode.nodeName.toLowerCase() == 'li'){ 

    return targetElement.parentNode; 
} 
else{ 
    return targetElement; 
} 
+0

मैं वास्तव में evt = evt || window.event; फ़ंक्शन कॉलिन्ग से पहले और फिर मैं getTarget फ़ंक्शन में evt पार्स ... – Mirko

0

मैं भी इस समस्या से मुलाकात की:

निम्नलिखित कोड Jehiah से उपयोगी

function fireEvent(element,event){ 
    if (document.createEventObject){ 
     // dispatch for IE 
     var evt = document.createEventObject(); 
     return element.fireEvent('on'+event,evt) 
    } 
    else{ 
     // dispatch for firefox + others 
     var evt = document.createEvent("HTMLEvents"); 
     evt.initEvent(event, true, true); // event type,bubbling,cancelable 
     return !element.dispatchEvent(evt); 
    } 
} 

उदाहरण कॉल है। और समस्या यह है: IE8 में, ईवेंट window.event होना चाहिए, न कि पैराम में घोषित घटना।

function onclick(event){ 
     if (is_ie8()){ 
     clicked_element = window.event.srcElement 
     } else { 
     clicked_element = event.target 
     } 
    } 
1

सबसे छोटा संस्करण कभी देखा:

function getTarget(e) { 
var evn = e || window.event; 
return evn.srcElement || e.target; 
} 
संबंधित मुद्दे