移动端 new CustomEvent('input') 兼容问题

最近在 安卓自带浏览器 上发现  new CustomEvent('input') 不兼容

解决办法

(function () {
  if(!!window.CustomEvent) return;
  function CustomEvent ( event, params ) {
    params = params || { bubbles: false, cancelable: false, detail: undefined };
    var evt = document.createEvent( 'CustomEvent' );
    evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
    return evt;
   };

  CustomEvent.prototype = window.Event.prototype;

  window.CustomEvent = CustomEvent;
})();

  

http://stackoverflow.com/questions/23920708/get-short-javascript-customevent-polyfill-to-compile-in-typescript

 

自定义事件例子1

<button id="myButton">点击我</button>
<p id="output"></p>
 
<script>
    const button = document.getElementById('myButton');
    const output = document.getElementById('output');
 
    // 监听自定义事件
    button.addEventListener('myEvent', (e) => {
        output.textContent = `收到消息: ${e.detail.message}`;
    });
 
    // 点击按钮时触发自定义事件
    button.addEventListener('click', () => {
        const event = new CustomEvent('myEvent', {
            detail: { message: '你好,世界!' }
        });
        button.dispatchEvent(event);
    });
</script>

自定义事件例子2

let form = document.getElementById('myForm');
let input = document.getElementById('myInput');

/ /表单监听验证事件
form.addEventListener('fieldValidated', function(event) {
    if (!event.detail.valid) {
        console.log('验证失败:', event.detail.message);
    } else {
        console.log('验证成功');
    }
});

// 模拟验证过程
input.addEventListener('blur', function() {
    if (input.value === '') {
// 创建自定义事件
let validationEvent = new CustomEvent('fieldValidated', {
    detail: {
        field: 'myInput',
        valid: false,
        message: '输入不合法'
    }
});
        input.dispatchEvent(validationEvent);
    }
});
                   

 

自定义事件例子3

 //自定义事件
<form id="myForm">
    <input type="text" id="username" placeholder="Username">
    <input type="password" id="password" placeholder="Password">
    <button type="button" id="submitButton">Submit</button>
</form>


// 创建自定义事件
const customFormSubmit = new Event('customFormSubmit');
 
// 监听自定义事件
document.getElementById('myForm').addEventListener('customFormSubmit', function(event) {
    console.log('Custom form submit event triggered!');
    // 在这里编写你的逻辑,比如表单验证等
    const username = document.getElementById('username').value;
    const password = document.getElementById('password').value;
    if (username && password) {
        console.log('Form is valid!');
        // 可以继续进行提交或其他操作
    } else {
        console.log('Form is invalid!');
    }
});
 
// 触发自定义事件(在按钮点击时)
document.getElementById('submitButton').addEventListener('click', function() {
    const form = document.getElementById('myForm');
    form.dispatchEvent(customFormSubmit);
});

  

自定义事件封装

function EventTarget(){
                this.handlers = {};
            }
            EventTarget.prototype = {
                constructor:EventTarget,
                addHandler:function(type,handler){
                    if(typeof this.handlers[type] == 'undefined'){
                        this.handlers[type] = [];
                    }
                    this.handlers[type].push(handler);
                },
                removeHandler:function(type,handler){
                    if(this.handlers[type] instanceof Array){
                        var arr = this.handlers[type];
                        for(var i = 0,len = arr.length;i < len;i++){
                            if(arr[i] == handler){
                                arr.splice(i,1);
                            }
                        }
                    }
                },
                dispatchEvent:function(event){
                    if(!event.target){
                        event.target = this;
                    }
                    if(this.handlers[event.type] instanceof Array){
                        var arr = this.handlers[event.type];
                        for(var i = 0,len = arr.length;i < len;i++){
                            arr[i](event);
                        }
                    }
                }
            }
            
            var mdiv = document.getElementById("mydiv");
            var eventName = "MY_EVENT";
            var myEvent = new EventTarget();
            myEvent.addHandler(eventName,function(evt){
                console.log(evt.message);
            });
            myEvent.dispatchEvent({type:eventName,message:"触发成功"});

 

 

 

 

其他的

function triggerEvent(element,eventType){
    var e;
    if(element.dispatchEvent){//正常情况
        e = new Event(eventType);
        element.dispatchEvent(e);
    }else if(element.fireEvent){//IE
        e = document.createEventObject();
        e.button = 1;
        element.fireEvent('on'+eventType,e);
    }else if(element['on'+eventType]){
        element['on'+eventType].call();
    }
}

 

 

 trigger: function (eventName, eventData) {
        for (var i = 0; i < this.length; i++) {
          var evt;
          try {
            evt = new window.CustomEvent(eventName, {detail: eventData, bubbles: true, cancelable: true});
          }
          catch (e) {
            evt = document.createEvent('Event');
            evt.initEvent(eventName, true, true);
            evt.detail = eventData;
          }
          this[i].dispatchEvent(evt);
        }
        return this;
      },

  --

 

try {
        evt = new window.CustomEvent(events[i], {
          detail: eventData,
          bubbles: true,
          cancelable: true,
        });
      } catch (e) {
        evt = document.createEvent('Event');
        evt.initEvent(events[i], true, true);
        evt.detail = eventData;
      }

 //create custom event
        if (typeof document.CustomEvent === 'function') {
            this.event = new document.CustomEvent('shake', {
                bubbles: true,
                cancelable: true
            });
        } else if (typeof document.createEvent === 'function') {
            this.event = document.createEvent('Event');
            this.event.initEvent('shake', true, true);
        } else {
            return false;
        }

 

    window.dispatchEvent(this.event);
//创建事件, Event是无法传递参数的
var event = new Event('suface');
//创建事件, CustomEvent是可以传递参数的
var event = new CustomEvent('suface', { detail: elem.dataset.time });

// 监听事件Listen for the event.
elem.addEventListener('suface', function (e) { //... }, false);

// 分发/触发事件Dispatch the event.
elem.dispatchEvent(event);

 

 


 

HTMLElement.prototype.trigger = function(type, data) {
    var event = document.createEvent('HTMLEvents');
    event.initEvent(type, true, true);
    event.data = data || {};
    event.eventName = type;
    event.target = this;
    this.dispatchEvent(event);
    return this;
}

  

posted @ 2016-11-08 17:15  surfaces  阅读(1698)  评论(0)    收藏  举报