当前位置: 首页 > 知识库问答 >
问题:

Android WebView中的MathJax——加载HTML页面后注入脚本

百里承业
2023-03-14

我必须将MathJax功能添加到我的应用程序中。

根据一些示例,要添加的正确脚本是

<script type='text/x-mathjax-config'>"
                            +"MathJax.Hub.Config({ "
                           + "showMathMenu: false, "
                           + "jax: ['input/TeX','output/HTML-CSS'], "
                           + "showProcessingMessages: false, "
                           + "messageStyle: 'none', "
                           + "extensions: ['tex2jax.js'], "
                           + "TeX: { extensions: ['AMSmath.js','AMSsymbols.js',"
                           + "'noErrors.js','noUndefined.js'] } "
                           + "});</script>"
                           + "<script type='text/javascript' "
                           + "src='file:///android_asset/MathJax/es5/tex-mml-svg.js'"
                           + "></script><span id='math'></span>

脚本从Asset目录中的本地文件夹加载。

当从文件系统上的另一个文件夹(私有应用文件夹)加载到Android WebView中时,我必须将该脚本添加到本地超文本标记语言文件中。

HTML页面中有数学公式,必须由MathJax函数读取。

在加载之前,我无法将脚本作为标记注入HTML文件。但是,公式的渲染也必须在加载后立即执行。

在这些例子中,他们提出了如下建议:

webView.loadDataWithBaseURL("http://bar", "<script type='text/x-mathjax-config'>"
                        +"MathJax.Hub.Config({ "
                       + "showMathMenu: false, "
                       + "jax: ['input/TeX','output/HTML-CSS'], "
                       + "showProcessingMessages: false, "
                       + "messageStyle: 'none', "
                       + "extensions: ['tex2jax.js'], "
                       + "TeX: { extensions: ['AMSmath.js','AMSsymbols.js',"
                       + "'noErrors.js','noUndefined.js'] } "
                       + "});</script>"
                       + "<script type='text/javascript' "
                       + "src='file:///android_asset/MathJax/es5/tex-mml-svg.js'"
                       + "></script><span id='math'></span>","text/html","utf-8","");    

该指令在页面加载后执行,随后是

webView.evaluateJavascript("MathJax.Hub.Queue(['Typeset',MathJax.Hub]);");

我认为这是呈现文档中所有数学标记的指令

但我明白

I/chromium: [INFO:CONSOLE(1)] "Uncaught ReferenceError: MathJax is not defined"

在加载的页面中注入脚本并执行渲染的正确方式是什么?

共有1个答案

景温书
2023-03-14

我的解决方案是下面的代码

String scriptText=
                        "MathJax.Hub.Config({ "
                        + "showMathMenu: false, "
                        + "jax: ['input/TeX','output/HTML-CSS'], "
                        + "showProcessingMessages: false, "
                        + "messageStyle: 'none', "
                        + "extensions: ['tex2jax.js'], "
                        + "TeX: { extensions: ['AMSmath.js','AMSsymbols.js',"
                        + "'noErrors.js','noUndefined.js'] } "
                        + "});";

                
String js_command = "var newScript = document.createElement(\"script\");"
+"newScript.setAttribute('type','text/x-mathjax-config');"
+"var inlineScript = document.createTextNode(\""+scriptText+"\");"
+"newScript.appendChild(inlineScript);"
+"document.body.appendChild(newScript);"

+"newScript = document.createElement(\"script\");"
+"newScript.setAttribute('type','text/javascript');"
+"newScript.setAttribute('src','file:///android_asset/MathJax/es5/tex-mml-svg.js');"
+"document.body.appendChild(newScript);";

没有后续的调用指令

MathJax.Hub.Queue(['Typeset',MathJax.Hub]);

代码的名称如下:

webView.evaluateJavascript(js_command);

几秒钟后,脚本开始工作,渲染完成,也就是说,公式显示为真实的数学表达式(具有正确的字体、布局等)。

 类似资料:
  • 嗨,伙计们,我是一个平均堆栈开发的初学者,我试图在注销后刷新页面。我尝试了;但它不起作用告诉我可能的代码页面重载在这种情况下

  • 问题内容: 我的index.html 在该函数中,我打印到控制台以查看其运行时间。 当我加载页面时,经常会 在 react组件 之后 加载。 Login.js 在调试器中,您可以看到脚本正在组件之后加载 如果我刷新页面几次,则可以正常工作。但是有时它起作用,有时却不起作用。 为什么? 问题答案: 我认为在react中加载脚本的最好方法是使用容器组件。这是一个非常简单的组件,它允许您编写将脚本导入组

  • 我正在尝试在angularjs中注销后重新加载页面。我正在使用ui路由。只有状态正在更改,但不会删除缓存。我尝试了以下场景。使用$窗口时。地方重新加载,浏览器警告警报(是否要重新加载)即将出现。但我不需要警惕。 $状态。go(登录) $窗口。地方重新加载(true) $位置。路径(“/登录名”) 任何人都可以建议如何在更改angularjs中的状态时删除缓存。

  • 问题内容: 当您使用AJAX加载html文档时,它对HEAD标记内的节点有何作用:(脚本,链接,样式,元,标题)忽略它们或加载并解析它们?并且在jquery的ajax()函数的情况下? 问题答案: 调用该方法时,可以指定属性,该属性描述了您希望从服务器获得什么样的数据,以及接收到数据后如何处理。 默认情况下,jQuery将尝试根据响应的MIME类型猜测。但是,您可以从以下内容显式指定dataTyp

  • 我想在注销后刷新/重新加载页面(屏幕上的消息在5秒钟内可见)。当前代码不会刷新它,所以我仍然在标题中看到用户名,而不是像登录按钮这样的东西。 我已经检查了这篇文章,但没有什么变化。

  • 问题内容: 我正在尝试使用加载外部页面,但是该页面是一个页面,我只想使用ajax来获取其内容。 编辑:之所以这样做,是因为我想在加载页面而不是我的服务器时传递所有用户信息,例如:标头,ip,代理。 这可行吗?现在,我可以获取页面,但是jsonp尝试解析json,并返回错误: 样例代码: 我已经建立了一个jsfiddle供人们测试:http : //jsfiddle.net/8A63A/1/ 问题答