2012-06-02 1 views
0

click 이벤트 또는 직접 호출 할 수있는 함수가 있습니다. 직접 호출 할 때는 데이터 매개 변수를 전달해야하므로 매개 변수를 사용하여 직접 호출을 설명하는 매개 변수를 허용하도록 함수를 정의했습니다. 함수 내 매개 변수가 클릭 이벤트인지 결정하는 방법

function myFunc(param){ 

} 

, 나는 내가 PARAM가 설정되어있는 경우 단순히 확인 수 있다고 생각 그래서, 함수가 직접 또는 클릭 이벤트에서 호출되었는지 여부를 차별화 할 필요가있다. 설정된 경우 함수가 직접 호출됩니다. 설정되어 있지 않으면 click 이벤트에서 호출됩니다.

문제는 클릭 이벤트가 기본적으로 이벤트 객체를 전달한다는 것입니다. 따라서 함수가 click 이벤트에 의해 호출 되더라도 param은 null이 아닙니다.

전달 된 매개 변수가 click 이벤트인지 확인하는 방법이 있습니까?

+0

는 왜 이러는거야? 클릭 이벤트에 전달되는 별도의 함수를 정의 할 수 있습니까? – Blender

+0

아니요,이 코드는 사용자가 클릭 할 때 또는 코드 자체에서 직접 트리거 될 수 있습니다. 왜 두 개의 다른 기능에서 코드를 두 번 반복할까요? – sameold

+2

함수가 호출 된 방식에 상관하지 않는 것이 이상적입니다. 그것은 수행하는 방법을 알고 있으며, 그 일을 할 것입니다 ... 최악의 경우, window.event 속성을 호출하여 호출 된 이벤트 유형을 찾거나 두 번째 매개 변수 (byEvent = true/false)를 추가하십시오. 그것을 확인하십시오. – JMC

답변

0

click 이벤트에 전달되는 .clientX 속성을 확인하십시오.

function(param){ 

    if(param.clientX){//this is a click event} 
    else 
    {//this is a call event}; 

}; 

이 항목을 사용하는 것이 좋습니다.

function(param){ 

     if(param.target){//this is a click event} 
     else 
     {//this is a call event}; 

    }; 
+0

나는 이것을 upvoted지만, 누군가 다른 사람이 그것을 downvoted 것, 나는 그들이 왜 설명 할 수 있기를 바랍니다. 그러나 나는 질문이있다. 클릭 이벤트가 모든 브라우저에서 항상 clientX 속성을 항상 갖고 있는지 확인 하는가? – sameold

+0

clientX 대신에 param.target을 사용할 수 있습니다. 그러나, 나는 지금 막 크롬, FF 및 IE9를 시험하고 clientX는 이것에서 작동한다. –

2

코드를 복제 할 필요가 없습니다. 이를 수행하는 올바른 방법은 이벤트 핸들러로 click 이벤트를 처리하고 다른 함수에서 수행 할 작업을 처리하는 것입니다. 예를 들면 :

이미에 언급 한대로, 당신이 그 정보를 알 필요가 있다는 사실이 일을 할 수있는 간단한 방법이있을 수 있음을 일반적으로 경고 기호입니다,하지만
// define main action 
var doSomethingUseful = function(is_clicked) { 
    // write some code here 
} 

// define click handler 
var myBtnClicked = function(e) { 
    doSomethingUseful(true); 
} 

// bind click event 
$('#my_button').click(myBtnClicked); 

. 예를 들어

편집 :

// define main action 
var doSomethingUseful = function() { 
    // write some code here that doesn't care "why" it's being called 
} 

// define click handler 
var myBtnClicked = function(e) { 
    // do the click-only stuff 

    // call the generic function 
    doSomethingUseful(); 
} 

// bind click event 
$('#my_button').click(myBtnClicked); 
+0

그는 하나의 기능 만 사용하려고합니다. 위와 같은 경우 그의 질문을 할 이유가 없습니다. –

+0

그는 한 가지 기능을 잘못된 이유로 사용하려고합니다. 그 자신의 말로 "왜 두 가지 다른 기능으로 코드를 두 번 반복 할 것입니까?" –

1

IE의 IT가 IE를 클릭에서 호출되는 경우 매개 변수가 정의되지 수 있도록 항상 이벤트 인수를 전달하지 않는 버전 9 전.

function myFunc(param){ 
if(!param) || param.clientX)// not called with a data param 
} 

이벤트보다 데이터를 확인하는 것이 좋습니다.

+0

고마워요 ... 알아두면 좋을 것 같습니다. –

0
jQuery(document).ready(function(){ 
    $('#someID').click(function(){ 
     myFunc(true); 
    }); 
    myFunc(); 
}); 

function myFunc(param){ 
    param ? alert("click"):alert("not click"); 
} 
0
function myFunc(param) { 

    // which (aka keyCode) is a property set to params 
    // by jQuery for any event 


    // Check for object make you free to pass parameter 
    // as object also with string, array and so on 

    if (Object.prototype.toString(param) == '[object Object]' && param.which) { 
     // called by clck 
     console.log(param.which); 
    } else { 
     // called by function 
     console.log(param); 
    } 
} 

$('#clickable').click(myFunc) 

// passing parameter as object 
myFunc({ 
    a: 'abc', 
    b: 'def' 
});​ 

// passing parameter as string 
myFunc('Hello'); 

// passing parameter as array 
myFunc([1, 2, 2]); 

등등.

DEMO

관련 문제