/*
说明:调用qwebchannel.js 的应用js
qwebchanneltest.js
*/
$.extend({
testexentd:function()
{
new QWebChannel(qt.webChannelTransport,function(channel)
{
//<!--aa js调用QT Demo -->
var jsqtBridge =channel.objects.jsqtbridgeobj;
window.foo=jsqtBridge;
jsqtBridge.jscallqt();
}});
},
loadXXX01Data:function()
{
new QWebChannel(qt.webChannelTransport,function(channel)
{
jsqtBridge =channel.objects.jsqtbridgeobj;
jsqtBridge.bdXXX01Data(function(content){
console.log(content);
alert(content);
});
},
loadXXX02Data:function()
{
new QWebChannel(qt.webChannelTransport,function(channel)
{
jsqtBridge =channel.objects.jsqtbridgeobj;
jsqtBridge..bdXXX02Data(function(content){
console.log(content);
alert(content);
});
}
,
loadXXX03Data:function()
{
new QWebChannel(qt.webChannelTransport,function(channel)
{
jsqtBridge =channel.objects.jsqtbridgeobj;
jsqtBridge.bdXXX03Data(function(content){
console.log(content);
alert(content);
});
}
......
}
在QT与js+html+ qwebchannel 进行开发时,尤其大量方法同时使用,总会莫名其妙发生如下错误,但是调用单个方法偶尔又是好的,
js: Uncaught TypeError: channel.execCallbacks[message.id] is not a function
js: Uncaught TypeError: channel.execCallbacks[message.id] is not a function
js: Uncaught TypeError: channel.execCallbacks[message.id] is not a function
js: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
js: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
经过分析,个人以为主要是qwebchannel 应当是不支持太多个实例化对象,尤其在有回调场景,
如果存在多个方法同时声明实例,很有可能将之前正在等待异步返回的句柄给干掉,导致,出现
“js: Uncaught TypeError: channel.execCallbacks[message.id] is not a function”,那么我们怎么办呢,借鉴数据库访问中的链接打开模式,全局变量,全局初始化 大概思路如下:
1.全局声明 桥和通道全局
var __jsqtBridge=null;//全局变量 jsqtBridge
var __QWebChannel=null;//全局变量 QWebChannel
2.页面加载时 默认初始化
$(document).ready(function(){
//<!---//.......-->
//初始化__jsqtBridge的方法
$.init__jsqtBridge();
});
3.实际方法使用前进行一次判断,如空,则调用初始化方法
if(__jsqtBridge==null||__jsqtBridge==undefined||__jsqtBridge=="")
{
$.init__jsqtBridge();
return false;
}
4.测试时可以预留一个测试方法
testInitjsBride:function()
{
alert("开始测试js与QT桥:__jsqtBridge");
if(__jsqtBridge!=""&&__jsqtBridge!=null&&__jsqtBridge!=undefined)
{
alert("__jsqtBridge早已初始成功");
alert("window.foo.jscallqt()开始调用");
window.foo.jscallqt();
}
else
{
alert("js与QT桥未初始化");
__QWebChannel= new QWebChannel(qt.webChannelTransport,function(channel)
{
//<!--aa js调用QT 真实数据 -->
__jsqtBridge =channel.objects.jsqtbridgeobj;
window.foo=__jsqtBridge;
alert("js与QT桥初始化成功");
alert("__jsqtBridge.jscallqt()开始调用");
__jsqtBridge.jscallqt();
});
}
},
5.完整的原理代码如下:
/*
说明:调用qwebchannel.js 的应用js
qwebchanneltest.js
*/
var __jsqtBridge=null;//全局变量 jsqtBridge
var __QWebChannel=null;//全局变量 QWebChannel
// new QWebChannel(qt.webChannelTransport,function(channel)
// {
// //<!--aa js调用QT Demo -->
// var jsqtBridge =channel.objects.jsqtbridgeobj;
// window.foo=jsqtBridge;
// jsqtBridge.jscallqt();
// });
$.extend({
//初始化 __jsqtBridge的方法
init__jsqtBridge()
{
try{
__QWebChannel= new QWebChannel(qt.webChannelTransport,function(channel)
{
//<!--aa js调用QT 真实数据 -->
__jsqtBridge =channel.objects.jsqtbridgeobj;
window.foo=__jsqtBridge;
// alert("初始化成功");
// __jsqtBridge.jscallqt(); //js调用QT Demo
});
}
catch(e)
{
console.log("初始化失败");
}
},
testInitjsBride:function()
{
alert("开始测试js与QT桥:__jsqtBridge");
if(__jsqtBridge!=""&&__jsqtBridge!=null&&__jsqtBridge!=undefined)
{
alert("__jsqtBridge早已初始成功");
alert("window.foo.jscallqt()开始调用");
window.foo.jscallqt();
}
else
{
alert("js与QT桥未初始化");
__QWebChannel= new QWebChannel(qt.webChannelTransport,function(channel)
{
//<!--aa js调用QT 真实数据 -->
__jsqtBridge =channel.objects.jsqtbridgeobj;
window.foo=__jsqtBridge;
alert("js与QT桥初始化成功");
alert("__jsqtBridge.jscallqt()开始调用");
__jsqtBridge.jscallqt();
});
}
},
loadXXX01Data:function()
{
if(__jsqtBridge==null||__jsqtBridge==undefined||__jsqtBridge=="")
{
$.init__jsqtBridge();
return false;
}
__jsqtBridge.bdXXXXData(function(content){
console.log(content);
alert(content);
});
},
loadXXX02Data:function()
{
if(__jsqtBridge==null||__jsqtBridge==undefined||__jsqtBridge=="")
{
$.init__jsqtBridge();
return false;
}
__jsqtBridge.bdXXX02Data(function(content){
console.log(content);
alert(content);
});
}
,
loadXXX03Data:function()
{
if(__jsqtBridge==null||__jsqtBridge==undefined||__jsqtBridge=="")
{
$.init__jsqtBridge();
return false;
}
__jsqtBridge.bdXXX03Data(function(content){
console.log(content);
alert(content);
});
}
......
});
$(document).ready(function(){
//<!---//.......-->
//初始化__jsqtBridge的方法
$.init__jsqtBridge();
});
希望能够帮到大家,如有理解错误或不对的地方请大家评论反馈,以便及时改进提高,谢谢!