【问题标题】:Event object is null with FirefoxFirefox 的事件对象为空
【发布时间】:2018-04-30 08:02:13
【问题描述】:

我使用 jsViews 创建一个小表单。

在模板中,我定义了一些绑定到自定义处理程序的按钮。

在处理程序中,我想使用event 对象(特别是,我想阻止默认按钮行为,即提交外部<form>

这在我测试过的所有浏览器上都可以正常工作,除了 Firefox。事件对象是 Firefox 的 undefined。所有其他浏览器都定义了一个MouseEvent 对象。

如何使用 FF 修复它?

这是一个小复制:

(function($) {
  var dataVm = {
    value: 42
  };

  var handlers = {
    changeValue: function(valueToAdd) {
      $.observable(dataVm).setProperty("value", dataVm.value + valueToAdd);
      console.log(event); // Should not be undefined
    }
  };

  $.templates("#mainTemplate").link("#container", dataVm, handlers);
})(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsviews/0.9.90/jsviews.min.js"></script>
<script id="mainTemplate" type="text/x-jsrender">
  <input data-link="value" />
  <button data-link="{on ~changeValue 1}">+1</button>
  <button data-link="{on ~changeValue (-1)}">-1</button>
</script>

<div id="container">

</div>

PS:我使用 jQuery 1.12.4 和 jsViews 0.9.90

【问题讨论】:

  • 事件参数来自哪里?我不知道它是从哪里来的。
  • @Anson:它是包含事件相关属性的标准对象
  • 试试 console.log(arguments) 你会看到 arguments[1] 可能是你正在寻找的事件对象。跨度>
  • @anson:请发布答案,因为它似乎解决了我的问题

标签: jsviews


【解决方案1】:

看看documentation for {on}

这里解释了传递给 {on} 事件处理程序的参数: http://www.jsviews.com/#link-events,在 事件处理函数的签名部分中,它说:

如果{on} 绑定是:

{^{on 'click' myHandler param1 param2 data=myData}}

data-link="{on 'click' myHandler param1 param2 data=myData}"

那么myHandler函数应该有签名:

function myHandler(param1, param2, ev, eventArgs) { ... }

ev 是 jQuery 事件对象,eventArgs 是 JsViews 事件 对象

【讨论】:

    【解决方案2】:

    在回调函数中,您可以检查 arguments 并查看您需要什么。在这种情况下,我们可以在 changeValue 回调中尝试:

    (function($) {
      var dataVm = {
        value: 42
      };
    
      var handlers = {
        changeValue: function(valueToAdd) {
          $.observable(dataVm).setProperty("value", dataVm.value + valueToAdd);
          console.log(arguments); // check what actual arguments are
        }
      };
    
      $.templates("#mainTemplate").link("#container", dataVm, handlers);
    })(jQuery);
    

    而且,您现在可以将 arguments[1] 作为 event 来执行 preventDefault

    (function($) {
      var dataVm = {
        value: 42
      };
    
      var handlers = {
        changeValue: function(valueToAdd) {
          var theEvent = arguments[1];
          $.observable(dataVm).setProperty("value", dataVm.value + valueToAdd);
          console.log(arguments); // check what actual arguments are
          theEvent.preventDefault(); // execute preventDefault from it
        }
      };
    
      $.templates("#mainTemplate").link("#container", dataVm, handlers);
    })(jQuery);
    

    【讨论】:

    • 谢谢!它按预期工作。作为旁注,我发现在函数签名中命名事件参数更具可读性:changeValue: function(valueToAdd, evt) { ... evt.XXX(); ... }
    猜你喜欢
    • 2013-03-29
    • 2021-06-07
    • 2016-09-18
    • 2021-01-09
    • 2019-09-15
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多