当使用Javascript,Jquery和事件处理程序时,如何知道'事件是事件'?

时间:2018-02-12 05:25:24

标签: javascript jquery events

以下代码运作良好。每当我点击一个项目时,它就会打开或关闭。但event有价值的新手有一些奇怪的行为。

enter image description here

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>event.target demo</title>
  <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>

<ul>
  <li>item 1
    <ul>
      <li>sub item 1-a</li>
      <li>sub item 1-b</li>
    </ul>
  </li>
  <li>item 2
    <ul>
      <li>sub item 2-a</li>
      <li>sub item 2-b</li>
    </ul>
  </li>
</ul>

<script>
function handler( event ) {
  var target = $( event.target );
  if ( target.is( "li" ) ) {
    target.children().toggle();
  }
}
$( "ul" ).click( handler ).find( "ul" ).hide();
</script>

第一次,我认为事件是一个变量,来自&#34; https://code.jquery.com/jquery-10.2.js&#34;

所以我更改了&#39;事件&#39;到&#39; xxx&#39;,并经过测试。

function handler( xxx) {
  var target = $( xxx.target );
  if ( target.is( "li" ) ) {
    target.children().toggle();
  }
}
$( "ul" ).click( handler ).find( "ul" ).hide();

但它也运作良好,没有错误。

最后,我改变了这样的代码。

function handler( xxx ) {
  var target = $( xxx.target );
  var target2 = $( ppp.target );

  if ( target.is( "li" ) ) {
    target.children().toggle();
  }
}
$( "ul" ).click( handler ).find( "ul" ).hide();

但它会Uncaught ReferenceError: ppp is not defined。 因此,我想知道eventxxx变量的来源和位置。 而且我也想知道javascript解释器如何翻译&#39; xxx&#39;作为具有target属性的函数。

1 个答案:

答案 0 :(得分:1)

handler是一个函数,您将其作为回调函数传递给其他函数。

handler函数的参数为​​eventxxx定义它。然后handler函数在稍后用一些参数调用。

// this function will accept another function as argument
// this callback will then be called after 1 second, that function is called
// using an object as first argument
function callInOneSecond(callback) {
  setTimeout(function() {
    callback({
      traget: 'something'
    })
  }, 1000);
}


// it does not matter how the first parameter is called, it will always 
// hold the first argument that is passed to it when "handler" is called.
function handler(xxx) {
  console.log('was called');
  console.dir(xxx);
}

callInOneSecond(handler);