Javascript 如何确定参数是否为单击事件

Javascript 如何确定参数是否为单击事件,javascript,jquery,Javascript,Jquery,我有一个函数,可以通过单击事件调用,也可以直接调用。当我直接调用它时,我需要向它传递一个数据参数,因此我定义了一个函数来接受一个参数,以说明使用该参数进行的直接调用 function myFunc(param){ } 在函数中,我需要区分函数是直接调用的还是通过单击事件调用的,因此我可以简单地检查是否设置了param。如果设置了,则直接调用该函数。如果未设置,则从单击事件调用它 问题在于,默认情况下,单击事件会传递事件对象。因此,即使单击事件调用该函数,param也不会为null 那么,有没

我有一个函数,可以通过单击事件调用,也可以直接调用。当我直接调用它时,我需要向它传递一个数据参数,因此我定义了一个函数来接受一个参数,以说明使用该参数进行的直接调用

function myFunc(param){

}
在函数中,我需要区分函数是直接调用的还是通过单击事件调用的,因此我可以简单地检查是否设置了param。如果设置了,则直接调用该函数。如果未设置,则从单击事件调用它

问题在于,默认情况下,单击事件会传递事件对象。因此,即使单击事件调用该函数,param也不会为null


那么,有没有办法检查传递的参数是否是click事件?

检查传递给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};

    };

检查传递给单击事件的.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};

    };

您不需要复制任何代码。正确的方法是使用事件处理程序处理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);
虽然,正如前面提到的,您需要知道这些信息这一事实通常是一个警告信号,表明可能有更简单的方法来做事情

编辑例如:

// 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);

您不需要复制任何代码。正确的方法是使用事件处理程序处理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);
虽然,正如前面提到的,您需要知道这些信息这一事实通常是一个警告信号,表明可能有更简单的方法来做事情

编辑例如:

// 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);

IE版本9之前的版本并不总是传递事件参数,因此如果通过IE单击调用该参数,则该参数将是未定义的

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

您最好检查数据而不是事件。

版本9之前的IE并不总是传递事件参数,因此如果通过IE单击调用该参数,则该参数将是未定义的

function myFunc(param){
if(!param) || param.clientX)// not called with a data param
}
jQuery(document).ready(function(){
    $('#someID').click(function(){ 
        myFunc(true);
    });
    myFunc();
});

function myFunc(param){
    param ? alert("click"):alert("not click");
}
您最好检查数据而不是事件

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

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

等等



你为什么要这样做?您不能定义一个单独的传递到单击事件中的函数吗?不,此代码可以在用户单击时触发,也可以直接从代码本身触发。为什么我要在两个不同的函数中重复代码两次?理想情况下,您的函数不会关心如何调用它。它会做它知道怎么做的工作,只是。。。最糟糕的情况是,查看window.event属性以查找调用的事件类型,或者添加第二个参数(byEvent=true/false),并进行检查。为什么您的函数需要知道调用它的方式?@Kristian antosen,如果没有传递数据,函数需要获取参数或设置默认参数。因此,我检查
data==null
,但是在单击期间(当我不传递参数时),数据仍然不是null(因为默认情况下它通过了click事件)。这就是为什么我需要知道这些数据的确切来源(我传递的数据或事件数据)。你为什么要这样做?您不能定义一个单独的传递到单击事件中的函数吗?不,此代码可以在用户单击时触发,也可以直接从代码本身触发。为什么我要在两个不同的函数中重复代码两次?理想情况下,您的函数不会关心如何调用它。它会做它知道怎么做的工作,只是。。。最糟糕的情况是,查看window.event属性以查找调用的事件类型,或者添加第二个参数(byEvent=true/false),并进行检查。为什么您的函数需要知道调用它的方式?@Kristian antosen,如果没有传递数据,函数需要获取参数或设置默认参数。因此,我检查
data==null
,但是在单击期间(当我不传递参数时),数据仍然不是null(因为默认情况下它通过了click事件)。这就是为什么我需要知道这些数据的确切来源(我传递的数据或事件数据)。我对此投了赞成票,但似乎其他人投了反对票,我希望他们能解释原因。但是我有一个问题:你确定一个点击事件在所有浏览器中总是有clientX属性吗?你可能想用param.target代替clientX;然而,我刚刚测试了Chrome、FF和IE9,clientX也在其中工作。我对此投了赞成票,但似乎有人投了反对票,我希望他们能解释原因。但是我有一个问题:你确定一个点击事件在所有浏览器中总是有clientX属性吗?你可能想用param.target代替clientX;然而,我刚刚测试了Chrome、FF和IE9,clientX也在其中工作。他要求只使用一个功能。如果是上述情况,就没有理由问他的问题。他要求使用一个函数的理由是错误的。用他自己的话说:“为什么我要在两个不同的函数中重复代码两次?”他要求只使用一个函数。如果是上述情况,就没有理由问他的问题。他要求使用一个函数的理由是错误的。用他自己的话说:“为什么我要在两个不同的函数中重复代码两次?”