3.dynaload.js 封装


3.1 常规处理

  硕正软件 1.0.107.0 版的 dynaload.js 作了改进, 通过添加 prototype 原型函数、自动生成侦听事件脚本, 使得 ppapi 的书写方法和 IE、npapi 完全一致了。

  如下是 dynaload.js 和 ppapi 有关的二处关键段落.
1.为 object 添加 func( ) 函数:
#56#//让 ppapi 语法兼容 npapi:为 <object> 添加 func( ) 函数
if($B.ppapi) {
  Object.prototype.func = function(funcname, para) {
    return this.postMessageAndAwaitResponse([funcname, para]);
  }
}

2.为 object 添加事件侦听、复用页面上的 OnReady( ) 和 OnEvent( ):
#118#if($B.ppapi) { //为 ppapi 添加事件侦听函数, 在其中直接调用 OnReady、OnEvent, 达到语法和 npapi 兼容的目的
 str += '\n<script>\n' + id + '.addEventListener("message", handleMessage' +id+ ', false);\n'
 str += 'function handleMessage' + id + '(message) {\n if(message.data.name=="OnReady") OnReady("' +id+ '");\n else if(message.data.name=="OnEvent") OnEvent("' +id+ '", message.data.event, message.data.p1, message.data.p2, message.data.p3, message.data.p4); \n }\n';
 str += '</script>';
}

3.2 和 jQuery, easyUI 潜在的冲突

  如果您采用了 jQuery 或 easyUI 框架, 页面有可能会出现如下错误, 导致针对插件的函数无法运行:
    
  因为 jQuery 和 easyUI 都不太建议修改 prototype 原型, 一旦出现这种问题, 建议您做这样的处理:
1.修改 dynaload.js, 把 prototype 处的 js 注释掉, 添加一个 名为 ffunc 的 js 函数:
#57#//if($B.ppapi) {
//  Object.prototype.func = function(funcname, para) {
//      return this.postMessageAndAwaitResponse([funcname, para]);
//  }
//}
function ffunc(af, funcname, para)
{
 if($B.ppapi)
  return af.postMessageAndAwaitResponse([funcname, para]);
 else
  return af.func(funcname, para);
}
  或者, 你把 dynaload.js 文件删除, 把 dynaload-jQuery.js 改名为 dynaload.js 即可, 因为 dynaload-jQuery.js 就是这个修改版.
  再或者, 这 2 文件都不要去动, 修改 html 的 js 引用处为: <script type='text/javascript' src='binary/dynaload-jQuery.js'></script> 即可

2.修改您所有页面的源代码, 把插件的函数调用, 比如:
AF.func("print", "");
统统修改成这种:
ffunc(AF, "print", "");