美文网首页
cordova.js 导入

cordova.js 导入

作者: 三亿 | 来源:发表于2023-02-28 09:39 被阅读0次

    执行 cordova.js 的入口就以下2行代码:
    Js 代码

    // 导入cordova
    window.cordova = require('cordova');
    // 启动处理
    require('cordova/init');
    

    src/cordova.js 事件的处理和回调,外部访问 cordova.js 的入口
    其中第一步是加载整个模块系统和外部访问 cordova.js 的入口,基于事件通道提供了整体的事件拦截控制及回调。代码不是很复杂。
    源码:
    Js 代码
    /file: src/cordova.js

    define("cordova", function(require, exports, module) { 
    
    // 调用通道和平台模块 
    var channel = require('cordova/channel'); 
    var platform = require('cordova/platform'); 
    
    // 备份document和window的事件监听器 
    var m_document_addEventListener = document.addEventListener; 
    var m_document_removeEventListener = document.removeEventListener; 
    var m_window_addEventListener = window.addEventListener; 
    var m_window_removeEventListener = window.removeEventListener; 
    
    // 保存自定义的document和window的事件监听器 
    var documentEventHandlers = {}, 
    windowEventHandlers = {}; 
    
    // 拦截document和window的事件监听器(addEventListener/removeEventListener) 
    // 存在自定义的事件监听器的话,使用自定义的;不存在的话调用备份document和window的事件监听器 
    document.addEventListener = function(evt, handler, capture) { 
    var e = evt.toLowerCase(); 
    if (typeof documentEventHandlers[e] != 'undefined') { 
    documentEventHandlers[e].subscribe(handler); 
    } else { 
    m_document_addEventListener.call(document, evt, handler, capture); 
    } 
    }; 
    window.addEventListener = function(evt, handler, capture) { 
    var e = evt.toLowerCase(); 
    if (typeof windowEventHandlers[e] != 'undefined') { 
    windowEventHandlers[e].subscribe(handler); 
    } else { 
    m_window_addEventListener.call(window, evt, handler, capture); 
    } 
     }; 
    document.removeEventListener = function(evt, handler, capture) { 
    var e = evt.toLowerCase(); 
    if (typeof documentEventHandlers[e] != "undefined") { 
    documentEventHandlers[e].unsubscribe(handler); 
    } else { 
    m_document_removeEventListener.call(document, evt, handler, capture); 
     } 
     }; 
    window.removeEventListener = function(evt, handler, capture) { 
    var e = evt.toLowerCase(); 
    if (typeof windowEventHandlers[e] != "undefined") { 
    windowEventHandlers[e].unsubscribe(handler); 
    } else { 
    m_window_removeEventListener.call(window, evt, handler, capture); 
    } 
     }; 
    
    // 创建一个指定type的事件。 
    // 参考:[https://developer.mozilla.org/en-US/docs/Web/API/document.createEvent#Notes](https://developer.mozilla.org/en-US/docs/Web/API/document.createEvent#Notes) 
    function createEvent(type, data) { 
     var event = document.createEvent('Events'); 
    // 指定事件名、不可冒泡、不可取消 
    event.initEvent(type, false, false); 
    // 自定义数据 
    if (data) { 
    for (var i in data) { 
    if (data.hasOwnProperty(i)) { 
    event[i] = data[i]; 
    } 
     } 
    } 
     return event; 
     } 
    
    // 外部访问cordova.js的入口 
    var cordova = { 
    // 模块系统 
    define:define, 
    require:require, 
    // 版本号和平台名 
    version:CORDOVA_JS_BUILD_LABEL, 
     platformId:platform.id, 
    
    // 为了拦截document和window的事件监听器,添加或删除自定义的事件监听器 
    addWindowEventHandler:function(event) { 
     return (windowEventHandlers[event] = channel.create(event)); 
     }, 
    // sticky 是指一旦被调用那么它以后都保持被调用的状态,所定义的监听器会被立即执行。 
    // 比如: deviceready事件只触发一次,以后的所有监听都是立即执行的。 
    addStickyDocumentEventHandler:function(event) { 
     return (documentEventHandlers[event] = channel.createSticky(event)); 
    }, 
    addDocumentEventHandler:function(event) { 
    return (documentEventHandlers[event] = channel.create(event)); 
     }, 
    removeWindowEventHandler:function(event) { 
     delete windowEventHandlers[event]; 
    }, 
     removeDocumentEventHandler:function(event) { 
     delete documentEventHandlers[event]; 
    }, 
    
     // 获取拦截前的document和window的事件监听器 |
    getOriginalHandlers: function() { 
    return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, 
     'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; 
    }, 
    
     // 调用document的事件 
    fireDocumentEvent: function(type, data, bNoDetach) { 
     var evt = createEvent(type, data); 
    if (typeof documentEventHandlers[type] != 'undefined') { 
    // 判断是否需要抛出事件异常 |
    if( bNoDetach ) { 
    // 通过Channel的fire方法来调用事件(apply) 
    documentEventHandlers[type].fire(evt); 
    } else { 
     // setTimeout(callback, 0) 的意思是DOM构成完毕、事件监听器执行完后立即执行 
    setTimeout(function() { 
     // 调用加载cordova.js之前定义的那些deviceready事件 
    if (type == 'deviceready') { 
     document.dispatchEvent(evt); 
     } 
     // 通过Channel的fire方法来调用事件(apply) 
    documentEventHandlers[type].fire(evt); 
     }, 0); 
     } 
    } else { 
     // 直接调用事件 
    document.dispatchEvent(evt); 
    } 
    }, 
    
    // 调用window的事件 
    fireWindowEvent: function(type, data) { 
    var evt = createEvent(type,data); 
     if (typeof windowEventHandlers[type] != 'undefined') { 
    setTimeout(function() { 
     windowEventHandlers[type].fire(evt); 
    }, 0); 
    } else { 
     window.dispatchEvent(evt); 
     } 
     }, 
    
     // 插件回调相关------------------------------------- 
    
    // 回调ID中间的一个随机数(真正的ID:插件名+随机数) 
    callbackId: Math.floor(Math.random() * 2000000000), 
    // 回调函数对象,比如success,fail 
     callbacks: {}, 
    // 回调状态 
    callbackStatus: { 
    NO_RESULT: 0, 
     OK: 1, 
     CLASS_NOT_FOUND_EXCEPTION: 2, 
     ILLEGAL_ACCESS_EXCEPTION: 3, 
     INSTANTIATION_EXCEPTION: 4, 
     MALFORMED_URL_EXCEPTION: 5, 
     IO_EXCEPTION: 6, 
     INVALID_ACTION: 7, 
     JSON_EXCEPTION: 8, 
     ERROR: 9 
     }, 
    
    // 以后使用callbackFromNative代替callbackSuccess和callbackError 
     callbackSuccess: function(callbackId, args) { 
    try { 
     cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); 
    } catch (e) { 
     console.log("Error in error callback: " + callbackId + " = "+e); 
     } 
    }, 
    callbackError: function(callbackId, args) { 
    try { 
     cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); 
    } catch (e) { 
    console.log("Error in error callback: " + callbackId + " = "+e); 
     } 
    }, 
    
    // 调用回调函数 
    callbackFromNative: function(callbackId, success, status, args, keepCallback) { 
    var callback = cordova.callbacks[callbackId]; 
     // 判断是否定义了回调函数 
     if (callback) { 
     if (success && status == cordova.callbackStatus.OK) { 
     // 调用success函数 
     callback.success && callback.success.apply(null, args); 
     } else if (!success) { 
    // 调用fail函数 
    callback.fail && callback.fail.apply(null, args); 
    } 
    // 如果设置成不再保持回调,删除回调函数对象 
     if (!keepCallback) { 
    delete cordova.callbacks[callbackId]; 
     } 
     } 
    }, 
    
     // 没有地方用到! 
    // 目的是把你自己的函数在注入到Cordova的生命周期中。 
    addConstructor: function(func) { 
     channel.onCordovaReady.subscribe(function() { 
    try { 
     func(); 
     } catch(e) { 
    console.log("Failed to run constructor: " + e); 
    } 
    }); 
     } 
    }; 
    
     module.exports = cordova; 
    }); 
    

    相关文章

      网友评论

          本文标题:cordova.js 导入

          本文链接:https://www.haomeiwen.com/subject/kqxgkdtx.html