- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在使用 CrossRider 开发 Internet Explorer 的扩展。我们的扩展有代码向后台发送消息,后台发送回复并调用回调函数。这在我的装有 Internet Explorer 11 的计算机上有效,但在我 friend Tom 的计算机(也有 Internet Explorer 11)中不起作用 - 在他的计算机中未调用回调。问题是什么?我们如何修复它以使其在任何计算机上工作?相关代码如下:
_base.js:
alert("[ContentBase::getData] >>>>>"); // This happens in any computer.
var request = {command: 'get', webmail: thisObj.mContentType, param: param, type: type, contentType: contentType};
thisObj.sendRequest(request, function(response) {
alert("[ContentBase::getData] received data >>>>>"); // This doesn't happen in Tom's computer.
if (typeof(callback) === 'function') {
callback(response);
}
});
utils.js:
this.sendRequest = function(request, callback) {
if (typeof(callback) !== 'function') {
callback = function(response) {};
}
switch (Sys.platform) {
case 'crossrider':
var message = {request: request, message_id: Math.floor((Math.random() * 900000000000000) + 100000000000000)};
if (typeof thisObj.mCallbackMap === 'undefined') {
thisObj.mCallbackMap = {};
appAPI.message.addListener({channel: "message_from_background"}, function(message) {
if (typeof thisObj.mCallbackMap[message.message_id] === 'function') {
thisObj.mCallbackMap[message.message_id](message.response);
delete thisObj.mCallbackMap[message.message_id];
}
});
}
(function(callback_inner) {
thisObj.mCallbackMap[message.message_id] = function(response) {
if (typeof(callback_inner) === 'function') {
callback_inner(response);
}
};
})(callback);
appAPI.message.toBackground(message, {channel: "message_to_background"});
break;
}
};
background.js:
appAPI.message.addListener({channel: "message_to_background"}, function(params) {
MsgHandler.handle(params.request, undefined, function(responseParams) {
appAPI.message.toActiveTab({'message_id': params.message_id, 'response': responseParams}, {channel: "message_from_background"});
});
});
msgHandler.js:
this.handle = function(request, sender, callback_out) {
function callback(response) {
if (typeof(callback_out) === 'function') {
callback_out(response);
}
}
switch (request.command) {
case "get":
switch (request.type) {
case "all":
var data = Controller.getData();
alert("[MsgHandler::handle] get / all, data.length = " + JSON.stringify(data).length + ", data = " + JSON.stringify(data)); // This happens in any computer.
callback({data: data});
break;
}
break;
}
return true; //this return is needed for chrome in order to execute callbacks
};
Sys.platform
始终等于“crossrider”。
更新:当 JSON.stringify(data).length
为 5981 字节时,消息已被接收,但当为 10157 字节时,主动方未收到消息选项卡(使用 appAPI.message.toActiveTab
)。从后台发送的对象大小有什么限制?我们如何将大对象发送到选项卡(最多 100KB)?
我们的扩展 ID 是 43889。我使用的是 Internet Explorer 11,但此扩展应该适用于所有版本的 Internet Explorer。
顺便说一句,来自后台的其他调用可以工作,只有这个特定的调用不起作用。我们在汤姆的计算机上尝试了几次,但始终无法正常工作。
编辑:我创建了一个简单的扩展,也有同样的问题,扩展ID是67708。这是简单扩展的代码:
extension.js:
appAPI.ready(function($) {
alert("appAPI.platform = " + appAPI.platform);
if (appAPI.platform === 'IE') {
appAPI.message.addListener({channel: "message_from_background"}, function(message) {
alert("message_from_background received, message_id = " + message.message_id + ", message.length = " + JSON.stringify(message).length + ", message = " + JSON.stringify(message));
});
appAPI.message.toBackground({}, {channel: "init_background"});
}
});
background.js:
appAPI.ready(function($) {
alert("appAPI.platform = " + appAPI.platform);
if (appAPI.platform === 'IE') {
var ready = false;
appAPI.message.addListener({channel: "init_background"}, function(params) {
if (ready === false) {
alert('init_background, ready = ' + ready);
ready = true;
var message_id = 9999;
var responseParams = {'a': 1, 'b': 2, 'c': 3};
alert('sending message to active tab, message_id = ' + message_id + ', responseParams.length = ' + JSON.stringify(responseParams).length);
appAPI.message.toActiveTab({'message_id': message_id, 'response': responseParams}, {channel: "message_from_background"});
var message_id = 9998;
var responseParams = {
// a big object
};
alert('sending message to active tab, message_id = ' + message_id + ', responseParams.length = ' + JSON.stringify(responseParams).length);
appAPI.message.toActiveTab({'message_id': message_id, 'response': responseParams}, {channel: "message_from_background"});
alert(appAPI.platform);
}
});
}
});
当JSON.stringify(responseParams).length
为19字节时,事件选项卡会收到消息,但当它为10576字节时,不会收到消息。
最佳答案
@Uri 感谢您更新问题。
根据新信息,我提请您注意文档 ( appAP.message ) 中有关 Internet Explorer 限制的注释:
Messages are converted to JSON strings before they are sent. Due to a limitation in Internet Explorer, the maximum length of the JSON string is 8000 bytes (8Kb).
您可以通过将数据保存在本地数据库并向事件选项卡发送短消息以触发其读取数据来解决此问题。以下是流程的简化示例:
background.js:
appAPI.ready(function($) {
appAPI.db.async.set(
'my-data',
myData,
appAPI.time.minutesFromNow(1),
function() {
appAPI.message.toActiveTab({type: 'get-data'});
}
);
});
extension.js:
appAPI.ready(function($) {
appAPI.message.addListener(function(msg) {
if (msg.type === 'get-data') {
appAPI.db.async.get('my-data', function(data) {
// do something with data
});
}
});
});
[披露:我是 Crossrider 员工]
关于javascript - 我们如何将大对象从后台发送到 CrossRider 中的事件选项卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27508158/
我必须在 crossrider 浏览器扩展的扩展 .js 代码中使用浏览器的 localStorage 变量 如何访问 crossrider 扩展代码中的 localStorage 变量就像我想使用
如何在 Crossrider 扩展中编写弹出 HTML? 什么触发它以及如何添加图像,例如,如果您想在弹出窗口中显示带有一些文本的 Logo ,是否保留 extension.js 因为您将编写弹出 H
我已经开始使用 Crossrider 编写扩展程序,并且非常喜欢它。但我读过一些关于他们是浏览器劫持者的负面信息 - 特别是 search.crossrider.com 我不确定 search.cro
我是 Crossrider 的新手,我希望能够根据用户与页面的交互触发事件。 例如,当用户将鼠标悬停在 html 输入元素上时播放声音: extension.js appAPI.ready(funct
我正在使用 Crossrider 创建一个扩展程序,允许用户为他们正在查看的页面添加书签。 为此,我创建了一个按钮弹出窗口,单击该按钮将打开用于管理书签列表的 UI。当用户单击扩展程序的按钮时,我想将
我们正在使用 CrossRider 开发 Internet Explorer 的扩展。我们有一个从 http://jsons.[part_of_link_suppressed].com.s3.amaz
这里是crossrider toolbar extension demo的链接 click here 这是工具栏的演示,显示了整个网站。 那么解决方案是什么? 我试着改变它的CSS $('#xr-cr
我已经开发了 crossrider 扩展程序,但是当我尝试在 Internet Explorer(版本 8)中安装该扩展程序时,它会发出病毒警报并且防病毒软件不允许安装它。我还尝试在 crossrid
crossrider 侧面板只是一个 iframe(您可以使用 js 注入(inject)的 html,但我有兴趣使用 iframe 来减少对页面其余部分的干扰)。我在浏览器扩展程序和 iframe
我在 Crossrider 中有一个弹出窗口,其中有一个复选框。它看起来像这样: popup.html Enable Something 现在
我正在使用 CrossRider api 来获取打开的选项卡,使用那里的 API 我可以获取书签中链接的标题,但是使用那里的 api 我无法使用如何获取打开的选项卡中的网址标题,我只能获取 URL。
我们正在使用 CrossRider 开发 Internet Explorer 的扩展。我在 Debug模式下测试了我们的扩展,我更改了本地文件路径的基本 URL - 但保存新的基本 URL 后文件没有
我们正在使用 CrossRider 开发 Internet Explorer 的扩展。我在暂存模式下测试了我们的扩展,并且在后台和 extension.js 的函数 appAPI.ready 中出现了
我正在尝试使用 Crossrider 构建一些浏览器扩展。在页面加载之前,在呈现任何 DOM 元素之前,我需要一些代码来执行。这在 Crossrider 上可行吗? 我试过使用 appAPI.dom.
我使用 Crossrider 构建了我的扩展程序目前我所有的代码都在 extension.js 文件中。但是,在这个单一文件中维护它变得相当长并且变得更加困难。有没有办法将我的代码拆分成单独的文件并在
我的 Crossrider 插件使用 setPopup() 函数在单击 browserAction 图标时弹出窗口。 问题是,当我点击图标时,弹出窗口又长又细,无法使用。 这是它的屏幕截图......
我们正在使用 CrossRider 开发 Internet Explorer 的扩展。我们的扩展有代码向后台发送消息,后台发送回复并调用回调函数。这在我的装有 Internet Explorer 11
我需要使用扩展程序中的时间来计算浏览器。如果我可以检查浏览器是否处于事件状态,那么很容易计算时间。这在crossrider中怎么可能? var focused = true; window.onfoc
我真的尝试过搜索,所以如果这已经存在但我只是无法找到它,我事先表示歉意。 我正在尝试使用 crossrider 在弹出窗口中创建一个表单,并通过单击按钮来评估响应,然后将值返回给用户。我可以通过在 C
我正在使用 crossrider 为我的网站制作跨浏览器扩展。 这是我的页面代码(extension.js): appAPI.ready(function($) { //alert("Hello W
我是一名优秀的程序员,十分优秀!