5

我想为大型 MATLAB 应用程序创建一些 HTML 文档,主要在 MATLAB 帮助浏览器中查看,从 11b 开始的任何版本的 MATLAB 中。这将有一些自定义 CSS(但没有什么很复杂的)。

但是,我还希望在其他浏览器中可以查看相同的文档。我关心 Chrome 和 IE9 和 10,尽管欢迎支持其他浏览器。我想要文档

  1. 在包括 MATLAB 帮助浏览器在内的所有浏览器中看起来基本相同,但是
  2. 在 MATLAB 帮助浏览器中显示时,在某些方面看起来有所不同 - 特别是,我希望matlab:链接的显示和行为有所不同,因为它们在 MATLAB 帮助浏览器之外不受支持。

问题 1:即使使用 1,我也遇到了困难,因为尽管我的 CSS 很简单,但 MATLAB 帮助浏览器似乎无法预测它支持的 CSS 的哪些部分,而且它似乎在 MATLAB 版本之间有很大差异。我猜它根本没有记录。有没有人有任何关于在 MATLAB 帮助浏览器中使用 CSS 的经验/提示?

问题 2:我希望能够以某种方式自动检测matlab:查看浏览器是否支持该协议,但从浏览其他 StackOverflow 答案看来,这是不可能的。鉴于我需要支持 Chrome,甚至无法尝试跟踪matlab:链接并检测它是否失败,因为显然 Chrome 会默默地失败。嘘。所以我的下一个想法是使用JavaScript来检测浏览器的UserAgent。MATLAB 11b 将自身报告为 Mozilla4.0 ICEbrowser,而 13a 将 Mozilla4.0 报告为Trident6. 我不完全确定这些是什么——我猜它们是第三方基于 Java 的浏览器组件,其行为类似于 Mozilla,而 MathWorks 已在 11b 和 13a 之间更改了组件。

如果我检测到 UserAgent 并假设任何包含字符串ICEBrowserTrident, 是否足以区分大多数用途的 MATLAB 帮助浏览器?显然,我必须及时了解 13a 后版本的 UserAgent 字符串。

感谢您的建议!

4

3 回答 3

3

icebrowser 是一个支持 html/javascript 随机子集的 java html 渲染器。从 2012b 开始获得主要帮助,从 2013a 开始获得“补充软件”帮助,他们已经切换到客户端,这是一个围绕本机浏览器的瘦 jni 包装器,因此您可以在 windows、webkit (=safari ) 在 mac 上和 gecko (=firefox) 在 linux 上。不幸的是,他们没有将用户代理更改为具有明显的matlab. 这意味着从 2013a 起,我们可以使用具有真实浏览器功能的 css/javascript 渲染,但可以解决您在开放网络上遇到的所有跨浏览器问题。而在 2013a 之前,浏览器功能受到更多限制,但您只需要担心一个浏览器。

我一直在寻找一种可靠的方法来检测 matlab: 协议是否受支持,但我发现的只是你的问题:-)

于 2013-05-08T10:37:55.957 回答
3

MATLAB help browser 的功能差异很大,不仅在不同的 MATLAB 版本之间,而且在不同的操作系统之间,甚至在不同的架构之间(最近的 64 位版本通常有一个特别糟糕的浏览器)。

我们正在使用用户代理来提供特定于 MATLAB 的网页。以下是其中一些的列表:

R2010b/R2011b, 32bit, WinXP:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20060705

R2010b/R2011b, 32bit, Win7:
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.8) Gecko/20060705

R2010b, 64bit, Win7:
Mozilla/5.0 (Java 1.6.0_17; Windows 7 6.1 amd64; de_DE) ICEbrowser/v6_0_2

R2011b, 64bit, Win7:
Mozilla/5.0 (Java 1.6.0_17; Windows 7 6.1 amd64; de_DE) ICEbrowser/v6_0_2

R2012a, 32bit, Win7:
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2) Gecko

R2012a, 32bit, WinXP:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko

R2012a, 64bit, Win7:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2;     .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)

R2012b, 32bit, Win7:
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2) Gecko

R2012b, 64bit, Win7:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2;     .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)

R2010b, 32bit, Linux:
Mozilla/5.0 (Java 1.6.0_17; Linux 2.6.32-33-generic i386; en_US) ICEbrowser/v6_0_2

请注意,您不能简单地对这些进行字符串比较,因为字符串的某些部分会根据客户端机器(例如语言代码)而变化。

另请注意,除了呈现 HTML 和 CSS 之外的其他功能差异很大。特别是对 JavaScript 和 HTTP 身份验证的支持。

于 2013-05-08T11:56:31.440 回答
1

我知道这个问题的年代,但我们也有类似的愿望来检测 MATLAB 内部 Web 浏览器。在我们的例子中,我们希望仅在使用 MATLAB 内部浏览器时才能够显示matlab:协议edit/opentoline链接(因为它们在 Web 浏览器中不起作用)。

正如我们所看到的,用户 agen 字符串完全没用 - 在旧版本中,MATLAB 使用他们自己的自制浏览器和一个无用的用户代理,然后在以后的版本中切换到基于 Chromium 的浏览器(jxbrowser)。

在寻找识别它的方法时,我偶然发现浏览器无法处理URLSearchParamsjava 调用——就像 IE 一样,它触发了异常。从这里看,似乎绝大多数网络浏览器都支持它,除了 Opera Mini 和 IE(尽管我们可以确定它不是其他方式)。这当然不是万无一失的。它可能会在晦涩的浏览器上给出误报(可能),或者如果 MATLAB 实现对它的支持(不太可能),它可能会停止工作。然而到目前为止,它似乎在 MATLAB 版本R2013a 到 R2019a中工作(没有安装更新的版本来测试)。

function isMatlabBrowser() {
    try {
        if(window.operamini) {
            return false;
        }
    } catch(err) {}
    try {
        if (window.document.documentMode) {
            return false;
        }
    } catch(err) {}
    try {
        var hasSearchParamsFcn = new URLSearchParams(window.location.search);
    }
    catch(err) {
        return true;
    }
    return false;
}

为了让我们的 matlab 链接仅在内部浏览器中显示,我预先制作了<a href="matlab: edit('myfile.m')">open</a>包含 HTML 代码中的链接(例如 )的文档页面。然后,每个链接class="matlaburi"都会使用 CSS 默认隐藏带有该类标记的所有内容。

然后我们有以下附加的 javascript,它检查是否在 MATLAB 浏览器中,如果是,则通过更改带有该类标记的任何内容的显示样式来使所有链接可见:

function showMatlabOpenLinks() {
    if (isMatlabBrowser()) {
        var cols = document.getElementsByClassName('matlaburi');
        for(i = 0; i < cols.length; i++) {
            cols[i].style.display = "inline";
        }
    }
}

var onLoadFcn = function() {
    showMatlabOpenLinks();
};

if(window.attachEvent) {
    window.attachEvent('onload', onLoadFcn);
} else {
    window.onload = onLoadFcn;
}

于 2021-12-21T16:17:30.567 回答