2016-08-08 2 views
0

이전에 이런 질문이 있었지만 답변을 찾지 못한 행운이 없었습니다. 아마도 내가 모르는 용어 일 겁니다.이벤트 처리기에서 반환 값을 재정의 하시겠습니까?

jQuery 이벤트 핸들러는 트리거 된 요소 이외의 요소를 리턴 할 수 있습니까?

일반적으로 요소에 대해 jQuery 이벤트를 트리거하면 해당 요소는 이벤트 처리기에서 반환됩니다. 대신 다른 요소를 반환하는 방법이 있습니까? (등 다른 것보다 event.target, event.currentTarget)

여기

내 HTML이다 :

<div id="content"> 
    <div id="wrapper"> 
     <div class="instance"> 
     </div> 
    </div> 
</div> 

내가 #wrapper에 대한 사용자 정의 jQuery를 이벤트를 만들 경우에, 나는 할 수의 이벤트 핸들러는 .instance을 반환?

$('#content').on('new.instance', '#wrapper', function(event) { 
    var wrapper = $(event.currentTarget); 
    var instance = wrapper.find('div.instance').first(); 

    var newInstance = instance.clone(true, true); 
    newInstance.appendTo(wrapper); 

    return newInstance; 
}); 

var returnValue = $('#wrapper').trigger('new.instance'); 
console.log('returnValue.html():', returnValue.html()); // #wrapper, not .instance 

내가 new.instance 이벤트 핸들러는 .instance 요소를 반환 할 수 있습니다 :

여기 내 자바 스크립트입니까? 그렇다면 코드에서 무엇을 놓치고 있습니까?

+2

이 설정이 작동하지 않습니다, 이벤트 핸들러. (...)에 값 (적어도 이런 식으로)와'$ (...)를'입니다 반환하지 않습니다 콜백의 리턴 값이 아니라 jQuery 콜렉션을 리턴 할 것이다. 이벤트 처리기에서 필요한 작업을 수행 할 수 없습니까? –

+0

예.'.instance'가'bubblingPhase'에있을 때 같은 경로에 있다는 event.chain에 있기 때문에. '. 인스턴스 '에서 정확히 무엇을 기대 하시겠습니까? '.instance'를 e.target으로 가져올 수 있습니다. – zer00ne

+0

기본적으로 생성자로 jQuery 이벤트를 사용할 수 있는지 확인하려고했습니다. 함수에서 새로운'.instance'를 끌어 올렸지 만 반환 값에서 가져올 수 있다면 훨씬 더 깨끗합니다. – GreenRaccoon23

답변

2

.trigger()

... 저희 CSTE 연구진() 메소드를 사용하여 사용자 정의 이벤트 유형을 정의, 두번째 인자 .trigger()가 유용하게 사용될 수 있습니다.

당신은 단순히 두 번째 매개 변수로 .trigger 방법에 개체를 추가 할 수 있고 거기에 인스턴스를 수집합니다.

var instances = {data:[]}; 
 

 
$('#content').on('new.instance', '#wrapper', function(event, instances) { 
 
    var wrapper = $(event.currentTarget); 
 
    var instance = wrapper.find('div.instance').first(); 
 
    var newInstance = instance.clone(true, true); 
 
    instances.data.push(newInstance); 
 
    newInstance.appendTo(wrapper); 
 
}); 
 

 
$('#wrapper').trigger('new.instance', instances); 
 

 
console.log(instances.data[0].get(0)); 
 

 
// somewhere else at a latter time trigger new.instance again 
 
setTimeout(function() { 
 
    $('#wrapper').trigger('new.instance', instances); 
 
    $.each(instances.data, function(index, item) { 
 
    var counter = index + 1 
 
    item.text('cloned instance ' + counter); 
 
    console.log(item.get(0)) 
 
    }) 
 
}, 2000)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="content"> 
 
    <div id="wrapper"> 
 
    <div class="instance"></div> 
 
    </div> 
 
</div>

+0

아! 좋은 생각이야! – GreenRaccoon23

1

.instanceevent.chain이므로 bubbling phase 중 콜백으로 액세스 할 수 있습니다. 각 요소를 클릭하여 스 니펫을 검토하십시오.

니핏

var wrp = document.getElementById('wrapper'); 
 

 
wrp.addEventListener('click', function(e) { 
 
    if (e.target != e.currentTarget) { 
 
    var trueTarget = e.target.className; 
 
    alert(trueTarget + ' has been clicked!'); 
 
    } 
 
    e.stopPropagation(); 
 
}, false);
#content { 
 
    border: 2px dashed grey; 
 
    width: 50vw; 
 
    height: 50vh; 
 
    background: rgba(0, 0, 0, .3); 
 
    text-align: right; 
 
    color: white; 
 
} 
 
#wrapper { 
 
    border: 3px dotted orange; 
 
    background: rgba(0, 0, 0, .5); 
 
    width: 50%; 
 
    height: 50%; 
 
    text-align: right; 
 
    font-size: small; 
 
    color: orange; 
 
} 
 
.instance { 
 
    border: 1px solid yellow; 
 
    width: 50%; 
 
    height: 50%; 
 
    background: rgba(0, 0, 0, .7); 
 
    text-align: center; 
 
    font-size: smaller; 
 
    color: yellow; 
 
    
 
}
<div id="content"> 
 
    CONTENT 
 
    <div id="wrapper"> 
 
    WRAPPER 
 
    <div class="instance"> 
 
     INSTANCE 
 
    </div> 
 
    </div> 
 
</div>

관련 문제