javascript - 是否可以从 jquery 监听自定义原型(prototype)事件?

标签 javascript jquery prototypejs

如果我在prototype.js中触发自定义事件,我可以在jquery中监听该事件吗?

我试过了,但没用

$.noConflict();

$('target').observe('custom:event', function(){
  console.log("prototype method");
});

jQuery("#target").on("custom:event",function(){
  console.log("jquery method");
});

$('target').fire('custom:event');
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.0.0/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="target"></div>

最佳答案

可以,但不能使用自定义事件的名称。您可以为 dataavailable 事件设置一个事件监听器,因为 Prototype 设置任何自定义事件都要经过该监听器。

https://github.com/sstephenson/prototype/blob/560bb59414fc9343ce85429b91b1e1b82fdc6812/src/prototype/dom/event.js#L635

if (isCustomEvent(eventName))
  observeCustomEvent(element, eventName, responder);
else
  observeStandardEvent(element, eventName, responder);

https://github.com/sstephenson/prototype/blob/560bb59414fc9343ce85429b91b1e1b82fdc6812/src/prototype/dom/event.js#L654

 function observeCustomEvent(element, eventName, responder) {
    if (element.addEventListener) {
      element.addEventListener('dataavailable', responder, false);
    } else {
      // We observe two IE-proprietarty events: one for custom events that
      // bubble and one for custom events that do not bubble.
      element.attachEvent('ondataavailable', responder);
      element.attachEvent('onlosecapture',   responder);
    }
  }

因此,要监听 Prototype 事件,请执行以下操作:

jQuery("#target").on("dataavailable",function(e){
  if(e.originalEvent.eventName == "custom:event"){
    doWhatever();
  }
  //Or even do a trigger through jQuery by passing the 
  //event target and event name
  //this will allow you to just set events like you were
  //with jQuery and not need a bunch of if statements
  jQuery(e.target).trigger(e.originalEvent.eventName);
});

演示

jQuery.noConflict();
var protoTarget = $('target');
var jQueryTarget = jQuery('#target');

protoTarget.observe('custom:event', function(e){
  protoTarget.append('Prototype callback');
});

jQuery(document).on("dataavailable",function(e){
  jQuery(e.target).trigger(e.originalEvent.eventName);
});

jQueryTarget.on("custom:event",function(){
  jQueryTarget.append("<br>jQuery callback");
});

$('target').fire('custom:event');
<script src="https://cdnjs.cloudflare.com/ajax/libs/prototype/1.7.0.0/prototype.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div id="target"></div>

关于javascript - 是否可以从 jquery 监听自定义原型(prototype)事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50653569/

相关文章:

javascript - 用Qt制作一个简单的LED指示灯

javascript - 基于所选项目数据属性的 addClass/removeClass

javascript - 如何使用 jQuery 检查月份是否等于 12 月

javascript - 粘性导航栏技巧(jquery 已修复)

javascript - 从 'initialize' 中的函数引用 Prototype.js 函数

php - 如何使用原型(prototype)js更改href属性?

javascript - 寻找原型(prototype) slider /轮播

javascript - 正则表达式 JavaScript 问题

javascript - 在没有输入必填字段的情况下提交联系表 7 后如何防止重定向到某个 URL

javascript - 通过 cypress.get() 选择 HTML 中的元素