精华内容
下载资源
问答
  • 在今天的帖子中,我们将揭露一些非常有趣的(我认为)架构风格: 事件源和命令查询责任分离 ( CQRS )。 本质上,这两个事件都是系统设计的核心,反映了正在发生的任何状态变化。 它与传统的CRUD架构有很大的不同...

    divided

    在今天的帖子中,我们将揭露一些非常有趣的(我认为)架构风格: 事件源命令查询责任分离CQRS )。 本质上,这两个事件都是系统设计的核心,反映了正在发生的任何状态变化。 它与传统的CRUD架构有很大的不同,传统的CRUD架构通常只保留最后的已知状态,而实际上没有任何历史背景。

    CQRS带来的另一个吸引人的选择是写模型(由命令启动并导致事件的状态修改)和读模型(在大多数情况下,查询最后一个已知状态)的自然分离。 它使您可以自由选择合适的数据存储(或多个存储)来满足不同的应用程序用例和需求。 但是,一如既往,没有免费的午餐:要付出的代价是系统日益复杂。

    为了使文章简短,整个讨论分为两部分: 命令和事件 (本部分)和查询 (即将进行)。 用户实体的非常简单的模型为例,我们将设计使用CQRS体系结构的应用程序。 JVM平台上可用的库很少,但是我们要使用的库是Akka ,更确切地说是它最近添加的两个组件Akka PersistenceAkka HTTP 如果Akka对您来说不是什么新鲜事物,请不要担心,这些示例将非常基础,并且(希望)易于理解。 因此,让我们开始吧!

    如前所述,系统的更改是命令的结果,可能导致零个或多个事件。 让我们通过定义两个特征来建模:

    trait Event
    trait Command

    反过来,这些事件可能会触发应用程序实体内的状态更改,因此让我们也使用通用特征对其进行建模:

    trait State[T] {
      def updateState(event: Event): State[T]
    }

    到目前为止非常简单。 现在,当我们为用户建模时, UserAggregate将构成我们的模型,并负责将更新应用到特定的User (可通过其id识别)。 同样,每个用户都将具有一个电子邮件属性,该属性可以在收到UserEmailUpdate命令后更改,并可能导致创建UserEmailUpdated事件作为结果。 以下代码段根据UserAggregate伴随对象内的状态命令事件定义了所有内容。

    object UserAggregate {
      case class User(id: String, email: String = "") extends State[User] {
        override def updateState(event: Event): State[User] = event match {
          case UserEmailUpdated(id, email) => copy(email = email)
        }
      }
    
      case class UserEmailUpdate(email: String) extends Command
      case class UserEmailUpdated(id: String, email: String) extends Event
    }

    对于熟悉CQRS事件源的读者而言 ,此示例可能看起来很幼稚,但我认为它足以掌握基础知识。

    定义好基本块之后,该是时候研究最有趣的部分了:接受命令,将命令转换为持久事件并应用状态更改,这些都是UserAggregate的职责 CQRS事件源的上下文中,持续事件是系统的关键功能。 事件是真理的唯一来源,可以通过重播与事件相关的所有事件,将任何单个实体的状态重构到任何时间点。 这是Akka Persistence加入舞台的时刻。

    退一步, Akka是一个出色的库(甚至是工具包),可基于actor模型构建分布式系统。 最重要的是, Akka Persistence使参与者具有持久性功能,使他们能够将其消息(或事件)存储在持久日志中。 可能有人会说日记本会变得非常非常大,并且重放所有事件以重建状态可能会花费很多时间。 这是有道理的,因此Akka Persistence还添加了将持久性快照存储在持久性存储中的功能。 由于只应重播自上次快照以来发生的事件,因此可以大大加快操作速度。 默认情况下, LevelDBAkka Persistence使用的持久存储引擎,但它是可插入功能,具有许多可用的替代方法。

    这样,让我们​​看一下将负责管理User实体的UserAggregate actor。

    class UserAggregate(id: String) extends PersistentActor with ActorLogging {
      import UserAggregate._
    
      override def persistenceId = id
      var state: State[User] = User(id)
    
      def updateState(event: Event): Unit = {
        state = state.updateState(event)
      }
      
      val receiveCommand: Receive = {
        case UserEmailUpdate(email) => {
          persist(UserEmailUpdated(id, email)) { event =>
            updateState(event)
            sender ! Acknowledged(id)
          }
        }
      }
    
      override def receiveRecover: Receive = {
        case event: Event => updateState(event)
        case SnapshotOffer(_, snapshot: User) => state = snapshot
      }
    }

    到目前为止,这是最复杂的部分,因此让我们剖析关键部分。 首先, UserAggregate扩展了PersistentActor ,这为其添加了持久功能。 其次,每个持久性参与者都必须具有唯一的persistenceId :它用作事件日志和快照存储中的标识符。 最后,与常规Akka actor相比,持久性actor确实有两个入口点: receiveCommand处理命令, receiveRecover重放事件。

    回到我们的示例,一旦UserAggregate接收到UserEmailUpdate命令,首先它将使用persist(...)调用将UserEmailUpdated事件保留在日记中,然后使用updateState(...)调用更新聚合的状态,并以确认的方式答复发送者。 为了查看完整的示例,让我们使用来自Akka家族的另一个出色项目Akka HTTP (一个很棒的Spray框架出现)创建一个简单的REST端点。

    现在,我们将定义一个简单的路由来处理/ api / v1 / users / {id}位置的PUT请求,其中{id}本质上是用户标识符的占位符。 它将接受单个表单编码的参数电子邮件以更新用户的电子邮件地址。

    object UserRoute {
      import scala.concurrent.ExecutionContext.Implicits.global
      import scala.language.postfixOps
      
      implicit val system = ActorSystem()
      implicit val materializer = ActorMaterializer()
      implicit val timeout: Timeout = 5 seconds
    
      val route = {
        logRequestResult("eventsourcing-example") {
          pathPrefix("api" / "v1" / "users") {
            path(LongNumber) { id =>
              (put & formFields('email.as[String])) { email =>
                complete {
                  system
                    .actorSelection(s"user/user-$id")
                    .resolveOne
                    .recover {
                      case _: ActorNotFound => 
                        system.actorOf(Props(new UserAggregate(id.toString)), s"user-$id")
                    }
                    .map {                 
                      _ ? UserEmailUpdate(email) map {
                        case Acknowledged(_) => 
                          HttpResponse(status = OK, entity = "Email updated: " + email)
                        case Error(_, message) => 
                          HttpResponse(status = Conflict, entity = message)
                      }
                    }
                }
              }
            }
          }
        }
      }
    }

    唯一遗漏的部分是可运行类,用于为该REST端点插入处理程序,因此让我们定义一个,由于Akka HTTP,它很简单:

    object Boot extends App with DefaultJsonProtocol {
      Http().bindAndHandle(route, "localhost", 38080)
    }

    除了使用ScalaTest框架(由Akka HTTP TestKit补充)构建的简单易读的测试用例之外,没有什么可以保证这些事情确实有效。

    class UserRouteSpec extends FlatSpec 
          with ScalatestRouteTest 
          with Matchers 
          with BeforeAndAfterAll {
      import com.example.domain.user.UserRoute
      
      implicit def executionContext = scala.concurrent.ExecutionContext.Implicits.global
    
      "UserRoute" should "return success on email update" in {
        Put("http://localhost:38080/api/v1/users/123", FormData("email" ->  "a@b.com")) ~> UserRoute.route ~> check {
          response.status shouldBe StatusCodes.OK
          responseAs[String] shouldBe "Email updated: a@b.com"
        }
      }
    }

    最后,让我们运行完整的示例,并从命令行使用curl来对REST端点执行真正的调用,从而迫使应用程序的所有部分协同工作。

    $ curl -X PUT http://localhost:38080/api/v1/users/123 -d email=a@b.com
    Email updated: a@b.com

    真好! 结果符合我们的期望。 在完成本部分之前,还有一件事:请注意,重新启动应用程序时,将为已经存在聚合的用户恢复状态。 另一种使用Akka Persistence细节进行表述的方式,如果事件日志中有与参与者的persistenceId相关联的事件/快照(这就是为什么它应该唯一且永久)的原因,则恢复过程将通过应用更新的快照(如果有)并重播事件来进行。

    在这篇文章中,我们回顾了事件源CQRS的幕后 ,仅涵盖了体系结构的写入(或命令)部分。 有许多工作要做,例如电子邮件唯一性验证,用户最新状态检索等,它们代表应用程序的读取(或查询)流程,并将在随后的博客文章中进行讨论。 就目前而言,我希望事件源CQRS有点神秘,并且可以成为您将来或现有应用程序的一部分。

    最终免责声明: Akka HTTP目前被标记为实验性组件(尽管主要目标仍然不变,API可能会略有变化),而Akka Persistence在最近的Akka 2.4.0-RC1版本中刚刚脱离实验性状态。 请注意。

    完整的项目可在GitHub找到 非常感谢两位出色的开发人员Regis LerayEsfandiar Amirrahimi在本系列博客文章中提供了很多帮助。

    翻译自: https://www.javacodegeeks.com/2015/08/divided-we-win-an-event-sourcing-cqrs-prospective-on-write-and-read-models-separation-commands-and-events.html

    divided

    展开全文
  • 在今天的帖子中,我们将揭露一些非常有趣的(在我看来)体系结构样式: 事件源和命令查询责任分离 ( CQRS )。 本质上,这两个事件都是系统设计的核心,反映了正在发生的任何状态变化。 它与传统的CRUD架构有很大的...

    在今天的帖子中,我们将揭露一些非常有趣的(在我看来)体系结构样式: 事件源命令查询责任分离CQRS )。 本质上,这两个事件都是系统设计的核心,反映了正在发生的任何状态变化。 它与传统的CRUD架构有很大的不同,传统的CRUD架构通常只保留最近的已知状态,而实际上没有任何历史背景。

    CQRS带来的另一个吸引人的选择是写模型(由命令启动并导致事件的状态修改)和读模型(在大多数情况下,查询最后一个已知状态)的自然分离。 它使您可以自由选择合适的数据存储(一个或多个)来满足不同的应用程序用例和需求。 但是,一如既往,没有免费的午餐:要付出的代价是系统日益复杂。

    为了使文章简短,整个讨论分为两部分: 命令和事件 (本部分)和查询 (即将进行)。 以非常简单的用户实体模型为例,我们将设计使用CQRS体系结构的应用程序。 JVM平台上几乎没有可用的库,但是我们将要使用的库是Akka ,更确切地说是它最近添加的两个组件Akka PersistenceAkka HTTP 如果Akka对您来说不是什么新鲜事物,请不要担心,这些示例将非常基础,并且(希望)易于理解。 因此,让我们开始吧!

    如前所述,系统中的更改是命令的结果,可能导致零个或多个事件。 让我们通过定义两个特征来建模:

    trait Event
    trait Command

    反过来,这些事件可能会触发应用程序实体内的状态更改,因此让我们也使用通用特征对其进行建模:

    trait State[T] {
      def updateState(event: Event): State[T]
    }

    到目前为止非常简单。 现在,当我们为用户建模时, UserAggregate将构成我们的模型,并负责将更新应用到特定的User (可通过其id识别)。 此外,每个用户都将具有一个电子邮件属性,该属性可以在收到UserEmailUpdate命令后更改,并可能导致创建UserEmailUpdated事件作为结果。 以下代码段根据UserAggregate伴随对象内的状态命令事件定义了所有内容。

    object UserAggregate {
      case class User(id: String, email: String = "") extends State[User] {
        override def updateState(event: Event): State[User] = event match {
          case UserEmailUpdated(id, email) => copy(email = email)
        }
      }
    
      case class UserEmailUpdate(email: String) extends Command
      case class UserEmailUpdated(id: String, email: String) extends Event
    }

    对于熟悉CQRS事件源的读者而言 ,此示例可能看起来很幼稚,但我认为它足以掌握基础知识。

    定义好基础块之后,该是时候研究最有趣的部分了:接受命令,将它们转换为持久事件并应用状态更改,这些都是UserAggregate的职责 CQRS事件源的上下文中,持续事件是系统的关键功能。 事件是真理的唯一来源,任何单个实体的状态都可以通过重放与事件相关的所有事件而重建到任何时间点。 这是Akka Persistence加入舞台的时刻。

    退一步, Akka是一个出色的库(甚至是工具包),可基于actor模型构建分布式系统。 最重要的是, Akka Persistence使参与者具有持久性功能,使他们能够将其消息(或事件)存储在持久日志中。 可能有人会说日记本会变得非常非常大,并且重放所有事件以重建状态可能会花费很多时间。 这是有道理的,因此Akka Persistence还添加了将持久性快照存储在持久性存储中的功能。 由于仅重播自上次快照以来发生的事件,因此可以大大加快操作速度。 默认情况下, LevelDBAkka Persistence使用的持久存储引擎,但它是可插拔功能,具有许多可用的替代方法。

    这样,让我们​​看一下将负责管理User实体的UserAggregate actor。

    class UserAggregate(id: String) extends PersistentActor with ActorLogging {
      import UserAggregate._
    
      override def persistenceId = id
      var state: State[User] = User(id)
    
      def updateState(event: Event): Unit = {
        state = state.updateState(event)
      }
      
      val receiveCommand: Receive = {
        case UserEmailUpdate(email) => {
          persist(UserEmailUpdated(id, email)) { event =>
            updateState(event)
            sender ! Acknowledged(id)
          }
        }
      }
    
      override def receiveRecover: Receive = {
        case event: Event => updateState(event)
        case SnapshotOffer(_, snapshot: User) => state = snapshot
      }
    }

    到目前为止,这是最复杂的部分,因此让我们剖析关键部分。 首先, UserAggregate扩展了PersistentActor ,这为其添加了持久功能。 其次,每个持久性参与者都必须具有唯一的persistenceId :它用作事件日志和快照存储中的标识符。 最后,与常规的Akka actor相比,持久性actor确实有两个入口点: receiveCommand处理命令,而receiveRecover重放事件。

    回到我们的示例,一旦UserAggregate收到UserEmailUpdate命令,首先它将使用persist(...)调用将UserEmailUpdated事件保留在日志中,然后使用updateState(...)调用更新聚合的状态,并以确认的方式答复发送者。 为了查看完整的示例,让我们使用来自Akka家族的另一个很棒的项目Akka HTTP (一个很棒的Spray框架出现)创建一个简单的REST端点。

    现在,我们将定义一个简单的路由来处理/ api / v1 / users / {id}位置的PUT请求,其中{id}本质上是用户标识符的占位符。 它将接受单个表单编码的参数电子邮件以更新用户的电子邮件地址。

    object UserRoute {
      import scala.concurrent.ExecutionContext.Implicits.global
      import scala.language.postfixOps
      
      implicit val system = ActorSystem()
      implicit val materializer = ActorMaterializer()
      implicit val timeout: Timeout = 5 seconds
    
      val route = {
        logRequestResult("eventsourcing-example") {
          pathPrefix("api" / "v1" / "users") {
            path(LongNumber) { id =>
              (put & formFields('email.as[String])) { email =>
                complete {
                  system
                    .actorSelection(s"user/user-$id")
                    .resolveOne
                    .recover {
                      case _: ActorNotFound => 
                        system.actorOf(Props(new UserAggregate(id.toString)), s"user-$id")
                    }
                    .map {                 
                      _ ? UserEmailUpdate(email) map {
                        case Acknowledged(_) => 
                          HttpResponse(status = OK, entity = "Email updated: " + email)
                        case Error(_, message) => 
                          HttpResponse(status = Conflict, entity = message)
                      }
                    }
                }
              }
            }
          }
        }
      }
    }

    唯一遗漏的部分是可运行类,用于为该REST端点插入处理程序,因此让我们定义一个,由于Akka HTTP,它很简单:

    object Boot extends App with DefaultJsonProtocol {
      Http().bindAndHandle(route, "localhost", 38080)
    }

    除了使用ScalaTest框架(由Akka HTTP TestKit补充)构建的简单易读的测试用例之外,没有任何东西可以保证一切都在正常运行

    class UserRouteSpec extends FlatSpec 
          with ScalatestRouteTest 
          with Matchers 
          with BeforeAndAfterAll {
      import com.example.domain.user.UserRoute
      
      implicit def executionContext = scala.concurrent.ExecutionContext.Implicits.global
    
      "UserRoute" should "return success on email update" in {
        Put("http://localhost:38080/api/v1/users/123", FormData("email" ->  "a@b.com")) ~> UserRoute.route ~> check {
          response.status shouldBe StatusCodes.OK
          responseAs[String] shouldBe "Email updated: a@b.com"
        }
      }
    }

    最后,让我们运行完整的示例,并从命令行使用curl来对REST端点执行真正的调用,从而迫使应用程序的所有部分协同工作。

    $ curl -X PUT http://localhost:38080/api/v1/users/123 -d email=a@b.com
    Email updated: a@b.com

    真好! 结果符合我们的期望。 在完成本部分之前,还有一件事:请注意,重新启动应用程序时,将为已经存在聚合的用户恢复状态。 另一种使用Akka Persistence细节进行表述的方式,如果事件日志中有与参与者的persistenceId相关联的事件/快照(这就是为什么它应该唯一且永久)的原因,则恢复过程将通过应用更新的快照(如果有)并重放事件来进行。

    在这篇文章中,我们探究事件源CQRS的幕后 ,仅涵盖了体系结构的写入(或命令)部分。 有许多工作要做,例如电子邮件唯一性验证,用户最新状态检索等,它们表示应用程序的读取(或查询)流程,并将在随后的博客文章中进行讨论。 就目前而言,我希望事件源CQRS有点神秘,并且可以成为您将来或现有应用程序的一部分。

    最终免责声明: Akka HTTP目前被标记为实验性组件(尽管主要目标仍然停留,API可能会略有变化),而Akka Persistence在最近的Akka 2.4.0-RC1版本中刚刚脱离实验性状态。 请注意。

    完整项目可在GitHub找到 非常感谢两位出色的开发人员Regis LerayEsfandiar Amirrahimi在本系列博客文章中提供了很多帮助。

    翻译自: https://www.javacodegeeks.com/2015/08/divided-we-win-an-event-sourcing-cqrs-prospective-on-write-and-read-models-separation-commands-and-events.html

    展开全文
  • 进一步了解JavaScript事件 When looking at mouse events we have the ability to interact with 在查看鼠标事件时,我们可以与之交互 mousedown the mouse button was pressed mousedown鼠标按钮 mouse...

    鼠标事件问题

    See more on JavaScript events

    进一步了解JavaScript事件

    When looking at mouse events we have the ability to interact with

    在查看鼠标事件时,我们可以与之交互

    • mousedown the mouse button was pressed

      mousedown鼠标按钮

    • mouseup the mouse button was released

      mouseup释放了鼠标按钮

    • click a click event

      click点击事件

    • dblclick a double click event

      dblclick双击事件

    • mousemove when the mouse is moved over the element

      将鼠标移到元素上时mousemove

    • mouseover when the mouse is moved over an element or one of its child elements

      将鼠标移到一个元素或其子元素之一上时的mouseover

    • mouseenter when the mouse is moved over an element. Similar to mouseover but does not bubble (more on this soon!)

      将鼠标移到元素上时的mouseenter 。 与mouseover类似,但不会冒泡(稍后会更多!)

    • mouseout when the mouse is moved out of an element, and when the mouse enters a child elements

      将鼠标移出元素时,以及进入子元素时的mouseout

    • mouseleave when the mouse is moved out of an element. Similar to mouseout but does not bubble (more on this soon!)

      将鼠标移出元素时的mouseleave 。 与mouseout类似,但不会冒泡(稍后会更多!)

    • contextmenu when the context menu is opened, e.g. on a right mouse button click

      contextmenu时上下文菜单打开时,如在点击鼠标右键

    Events overlap. When you track a click event, it’s like tracking a mousedown followed by a mouseup event. In the case of dblclick, click is also fired two times.

    事件重叠。 跟踪click事件时,就像跟踪mousedown事件和mouseup事件一样。 在dblclick的情况下, click也被触发两次。

    mousedown, mousemove and mouseup can be used in combination to track drag-and-drop events.

    mousedownmousemovemouseup可以组合使用来跟踪拖放事件。

    Be careful with mousemove, as it fires many times during the mouse movement. We need to apply throttling, which is something we’ll talk more when we’ll analyze scrolling.

    小心mousemove ,因为它在鼠标移动期间会触发多次。 我们需要应用节流 ,这是我们在分析滚动时将要讨论的更多内容。

    When inside an eventh handler we have access to lots of properties.

    在一个偶数处理程序中,我们可以访问许多属性。

    For example on a mouse event we can check which mouse button was pressed by checking the button property of the event object:

    例如,在鼠标事件中,我们可以通过检查事件对象的button属性来检查按下了哪个鼠标按钮:

    const link = document.getElementById('my-link')
    link.addEventListener('mousedown', event => {
      // mouse button pressed
      console.log(event.button) //0=left, 2=right
    })

    Here are all the properties we can use:

    这是我们可以使用的所有属性:

    • altKey true if alt key was pressed when the event was fired

      altKey如果触发事件时按下alt键, altKey true

    • button if any, the number of the button that was pressed when the mouse event was fired (usually 0 = main button, 1 = middle button, 2 = right button). Works on events caused by clicking the button (e.g. clicks)

      如果有button则为触发鼠标事件时按下的按钮编号(通常为0 =主按钮,1 =中间按钮,2 =右键)。 对通过单击按钮引起的事件起作用(例如,单击)

    • buttons if any, a number indicating the button(s) pressed on any mouse event.

      buttons如果有),数字表示在任何鼠标事件中按下的按钮。

    • clientX / clientY the x and y coordinates of the mouse pointer relative to the browser window, regardless of scrolling

      clientX / clientY鼠标指针相对于浏览器窗口的x和y坐标,与滚动无关

    • ctrlKey true if ctrl key was pressed when the event was fired

      ctrlKey如果触发事件时按下ctrl键,则为true

    • metaKey true if meta key was pressed when the event was fired

      metaKey如果触发事件时按下了meta键, metaKey true

    • movementX / movementY the x and y coordinates of the mouse pointer relative to the position of the last mousemove event. Used to track the mouse velocity while moving it around

      movementX / movementY x和相对于最后mousemove事件的位置的鼠标指针的y坐标。 用于在移动鼠标时跟踪鼠标速度

    • region used in the Canvas API

      Canvas API中使用的region

    • relatedTarget the secondary target for the event, for example when moving

      relatedTarget事件的次要目标,例如在移动时

    • screenX / screenY the x and y coordinates of the mouse pointer in the screen coordinates

      screenX / screenY屏幕坐标中鼠标指针的x和y坐标

    • shiftKey true if shift key was pressed when the event was fired

      shiftKey如果触发事件时按下Shift键,则为true

    翻译自: https://flaviocopes.com/mouse-events/

    鼠标事件问题

    展开全文
  • we移动端

    2019-05-15 20:54:20
    1)touch事件: touch,触摸, 是移动端的触摸事件,是一组事件 1. touchstart: 当手指触摸到屏幕的时候触发的-------只会触发一次 2. touchmove: 当手指在屏幕中滑动时触发 ---------一直触发 3. touchend: 当...
    1)touch事件: touch,触摸,  是移动端的触摸事件,是一组事件
      1. touchstart: 当手指触摸到屏幕的时候触发的-------只会触发一次
      2. touchmove: 当手指在屏幕中滑动时触发 ---------一直触发
      3. touchend:  当手指离开屏幕时触发--------只会触发一次
      4. touchcancel:  被迫中止滑动时触发-----当来电  弹出消息
    
    2)移动端添加事件的方式: addeventlistener(事件类型,function(){},false)
    3) 事件参数对象e:  名字: touchList(触摸点集合,一个手指就是一个触摸点,和屏幕接触的点的个数)
          1. changedTouches: 改变后的触摸点的集合
          2. targetTouches: 当前元素的触发点集合
          3. touches: 页面中所有的触发点的集合
    4) 每一个事件都可以记录触摸点,特例:touchend事件:targetTouches和touches不会被记录
    
    5) clientX,clientY: 基于浏览器窗口(视口)
       pageX,pageY: 基于页面(视口)
       screenX,screenY: 基于屏幕
       ------滑动,滑动实现的原理: 让触摸的元素随着手指的滑动做位置的改变
    
    1. 移动端的点击事件: click事件,一般不用,因为移动端为了滑动还是点击,click事件会延迟300ms,
         这样会影响用户体验,响应太慢了。
     2. 解决方案:
       1) 使用tap事件,  tap:轻击
           1.1 说明:tap事件不是移动端的原生事件,而是通过touch事件衍生过来的
           1.2 zepto.js:轻量级的jquery库,里面封装了tap事件
           1.2 tap事件的条件:  1. 响应速度要比click快   响应速度小于150ms----在谷歌浏览器中模拟看不到300ms的效果(只能看到执行顺序), 在真机上才能看到延时效果
                          2. 不能滑动(不能触发touchmove事件)
    
       2)   使用fastclick.js  提高了移动端click响应速度
             fastclick.js : 一个插件, 先下载,
    展开全文
  • 安卓模拟器 模拟滑动事件 模拟网络事件 (Simulating Web Events) 有时我们想生成假事件来测试我们... (Sometimes we want to generate fake events to test our pipelines and dashboards. Random events don’t d...
  • click事件修改css For the last few years, we’ve been witnessing the wonderful expansion of front-end languages especially ...
  • vue 自定义事件We know that Vue can listen to events on your elements and trigger specific functions to run when such events occur. Vue.js also allows you to listen for custom events, an ability which ...
  • vue事件处理有哪些方法Often when we are developing user interfaces for the web we would like to customize the behavior of DOM events to provide a richer user experience. Form submissions, button clicks...
  • 页面的生命周期基本事件Every component in Svelte fires several lifecycle events that we can hook into that help us implement the functionality we have in mind. Svelte中的每个组件都会触发多个生命周期...
  • JS 事件

    千次阅读 2007-03-06 12:57:00
    Events are actions that can be detected by JavaScript.JS可以察觉到事件有动作 Events事件By using JavaScript, we have the ability to create dynamic web pages. Events are actions that can be detected by ...
  • 什么是回调? 回调是异步编程最基本的方法。对node.js来说,按顺序执行异步逻辑的时候。一般采用后续传递的方式。... Callback.jsfunction learn(something){console.log(something)}function we(callback,...
  • 冲突分析:SwipeRefreshLayout是Android在Support.v4包中为我们提供的用户刷新UI的一个组件,大部分场景下我们会使用它包裹RecyclerView,在列表上下拖动到顶部时继续向下滑动视图触发刷新事件,我们可以通过给...
  • kotlin 按钮事件The event is a very important part of any application which makes it user intractable. It may be generated when we click on any view in Android. To trigger click events on any view, we ...
  • Extended event sessions can use multiple targets to store captured information. We should use different targets depending on the type of data we are capturing and the structure of the data outcome...
  • Many of the code we write involves reacting to events. I/O events like mouse clicks or keyboard events. Network events, when you listen to an HTTP call. 我们编写的许多代码都涉及对事件的React。 I / O...
  • 1. webDriverWait自定义WebElement类事件 public WebElement waitForElementVisible(WebDriver driver,final By locator, long timeOutInSeconds, String errorMessage) { Function<WebDriver, We...
  • 基础 - 函数 事件

    2016-07-25 18:49:00
     由事件驱动时执行的 直接被调用时执行的 可以重复使用的代码块 函数的声明与调用 var weSay = new Function("window.console.log('递进的情绪请省略');"); weSay();  var weSay = function ...
  •  在JSF的事件模型中会有所谓实时事件,导因于Web应用程序的先天特性不同于GUI程序,所以JSF的事件模式与GUI程序的事件模式仍有相当程度的不同,一个最基本的问题正因为HTTP无状态的特性,使得We
  • In tcode SWO1 we can find for example business object BUS1178 has defined several events. When you create a new product and save it from WebClient UI, this BOR type will be raised in the following ...
  • 大家好,这里是电竞大事件!在S9世界赛进行得如火如荼,IG和PFX发挥出色,其中IG的上单TheShy发挥尤为出色,甚至被称为世界第一上单也不会有人反对。很多人都知道TheShy是IG用辅助Ben从WE换过来的,那当初WE为什么会...
  • jquery滚动条滚动事件How to handle scrolling with jQuery. Today we continue jQuery reviews, and our article will about event handling of scrollbar. Possible you saw such feature as ajaxy loading of new...
  • jQuery - 处理事件

    2019-01-21 11:00:44
    jQuery 通过 .on() 方法,... tag is clicked, we expect to see '&lt;p&gt; was clicked' in the console. $( "p" ).on( "click", function() { console.log( "&lt;p&g...
  • 我有和NodeJS用Express编写的应用程序,我试图使用EventEmitter创建一种插件架构,插件通过监听发出的事件挂钩到主代码中.我的问题来自插件函数发出异步请求(在这种情况下从mongo获取数据)这导致插件代码完成并将控制...
  • 自定义事件的头文件 #ifndef _WE_EVENT_H_ #define _WE_EVENT_H_ #include <wx/event.h> class WeEvent; wxDECLARE_EVENT(wxEVT_WE, WeEvent); typedef void (wxEvtHandler::*WeEventFunction)...
  • 实操UI自动化的同学们应该知道键盘事件实战也是系统功能模块UI自动化测试中的一部分,平时我们了解到的八大元素定位方法我们可以很方便的捕捉到页面的各种元素的标签,以及selenium的强大能够很方便的...from selenium.we
  • 小程序 事件的使用

    2018-11-28 22:47:26
    在组件中绑定一个事件处理函数。 如bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。 在wxml文件的zhong &lt;view data-hi="...(就是在jswe文件中写入) ...
  • 事件和信号

    2018-04-07 20:18:00
    信号和槽 示例效果如下: 示例代码: 1 #!/usr/bin/python3 2 # -*- coding: utf-8 -*- 3 4 """ ... 7 In this example, we connect a signal 8 of a QSlider to a slot of a QLCDN...
  • Windows 事件转发(WEF)在你的组织中的设备上读取任何运行或管理事件日志,并将你选择的事件转发到 Windows 事件收集器(WEC)服务器。 若要实现此目的,请向客户端设备发布两个不同的订阅:基准套餐和可疑订阅。 ...
  • Monkey 基础上便可以构建一个测试框架,不过功能却有所欠缺,不但没有事件回放,而且根据我们的经验,还不太稳定的说。 After we came up with RemoteJS, we started thinking about how we coul

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 654
精华内容 261
关键字:

we事件