javascript - 减少反斜杠数量的 evaluateJavascript 函数

标签 javascript android escaping mathjax

我正在尝试通过在 kitkat 之后为 android 版本调用 evaluateJavaScript() 方法并使用 loadUrl("javascript:"+javascript ); 在 kitkat 以下的版本上。让我在下面的代码的帮助下更详细地解释我想做什么。

 if(mProblemMathView!=null && count <=10){
//this code is run when the full html is being loaded for the first time
//there is no error in this part
                    htmlStringBuilder.append(htmlStringEnding);
                    mProblemMathView.loadDataWithBaseURL(null, htmlStringBuilder.toString(), null, null, null);
                }
                else{
      //this part of code is run when html has been loaded atleast once

                    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {

                        Log.e("Hi",htmlStringBuilder.toString());
                        mProblemMathView.evaluateJavascript(getScript(htmlStringBuilder,count), null);
                    } else {
                        Log.e("Hi","Hello2");
                        mProblemMathView.loadUrl(getScript(htmlStringBuilder,count));
                    }
                }

下面是修改 htmlStringBuilder 并返回一个 String

的函数
  private String getScript(StringBuilder htmlStringBuilder,int count){
            String script="var functionOne= function () {console.log('start');var div = document.createElement('div');div.id='recall_'+"+count+";" +
                    "div.innerHTML=\""+htmlStringBuilder.toString()+"\";document.body.appendChild(div);"
                    + "var math = document.getElementById('recall_'+"+count+");\n" +
                    "MathJax.Hub.Queue(['Typeset',MathJax.Hub,math]);"+"console.log('end');} \n functionOne();"
                    ;
            Log.e("s",script);
            return script;
        }

当我第一次使用 htmlStringBuilder 加载 html 时,一切都很好,但是当我使用 evaluateJavascript 方法或 loadUrl 加载 javascript 时方法 我面临的问题是加载 javascript 时少了一个 \ 字符。我怎么知道这是因为我正在使用 mathjax,它使用 \\(\\) 或 '$$' 来标识数学部分。现在 htmlStringBuilder 完全使用 \\(\\) 来显示数学,所以我所做的是在正确的位置附加 $2x$ 和数学被正确渲染并且在某些地方“\frac”被更改为“rac”。这表明 javascript 正在评估少了一个 '\' 字符。

我应该怎么做才能使 javascript 的加载方式与第一次加载时的加载方式相同?

更多信息:我所看到的是,如果我使用 \\\\(\\\\) 只有这样才呈现数学而不是它应该有在 \\(\\) 处呈现。 那么为什么 Javascript 加载时少了一个 \ 字符,例如。 \(\)?

最佳答案

我一直在努力找出为什么 WebView 也减少了黑斜杠的数量。很遗憾,目前还没有找到答案。

至于如何处理这个问题,我找到了两种解决方案:

1。当您将“可能带有反斜杠的字符串”传递给 WebView 时,将所有黑斜杠('\')替换为 2 个反斜杠('\\')

getScript(htmlStringBuilder,count).replace('\\', '\\\\')

(看起来我正在用 4 替换 2,但那是因为我正在转义 Java 的反斜杠字符。)

所以这一行意味着对于我的字符串中的每个反斜杠,再添加一个。由于 evaluateJavascript 将反斜杠(在组合反斜杠中)的数量减少了 1,这将导致字符串与 Java 中的字符串相同。

但是,我不确定在某些反斜杠需要采用特定格式的情况下,这种方法是否会破坏字符串。在我的用例中,这一直有效,但我不确定这是否是一个好的通用解决方案

2。 URL 在将字符串传递给 WebView 之前对其进行编码

正如有人在我关于为什么 的问题中建议的那样(Why does WebView.evaluateJavascript() remove escape characters?),您可以在将字符串传递给您的 WebView 之前对其进行 URLEncode

URLEncoder.encode(getScript(htmlStringBuilder,count), "UTF-8")

这可能是最好的通用解决方案。这种方法的唯一问题是您必须在 Javascript 中进行更改以对字符串进行 URLDecode,这在某些情况下可能很烦人或无法完成

关于javascript - 减少反斜杠数量的 evaluateJavascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47955628/

相关文章:

javascript - Selenium-WebDriver 如何使用 javascript 和 firefox 浏览器突出显示元素

android - google analytics easytracker导致java连接异常

JavaScript:转义 HTML 中的双引号

php - LIKE 表达式中的 MySQL 连字符

javascript - 如何替换 Rails Controller 中的内联 JavaScript

javascript - FormData 中的 Blob 为空

javascript - 单击时显示 antd 水平菜单

android - 我想为我的应用程序截屏并分享

c# - 密码输入字段审查 (****) - 记录和注册

python - 使用 Python/MySQLdb 转义 MySQL 的 UPDATE 操作字符