evaluateJavascript函数减少反斜杠的数量

时间:2017-12-23 20:06:14

标签: javascript android escaping mathjax

我正试图在WebView动态加载javasctipt,方法是在kitkat之后调用android版本的evaluateJavaScript()方法,并在kitkat下面的版本上使用loadUrl("javascript:"+javascript);。让我更详细地解释一下我在下面的代码的帮助下尝试做什么。

 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,它使用\\(\\)或&#39; $$&#39;识别数学部分。现在htmlStringBuilder完全使用\\(\\)来显示数学,所以我所做的就是在正确的地方添加了$2x$并且数学被正确地呈现,并且在某些地方也是如此#34; \ frac&#34 ;被改为&#34; rac&#34;。这显示javascript正在评估少一个&#39; \&#39;字符。

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

更多信息:我看到的是,如果我正在使用\\\\(\\\\),那么正在渲染的数学应该是\\( \\)渲染的数学。 那么为什么Javascript加载的\字符少一个,例如。 \( \)

1 个答案:

答案 0 :(得分:1)

我一直在尝试找出为什么为什么 animateIcons(requestId)也会减少反斜杠的数量。不幸的是,尚未找到答案。

关于如何处理此问题,我找到了两种解决方案:

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

WebView

(似乎我将2替换为4,但这是因为我要为Java转义反斜杠字符。)

所以这一行意味着在我的字符串中的每个反斜杠上再添加一个。由于getScript(htmlStringBuilder,count).replace('\\', '\\\\') 将反斜杠的数量(在组合的反斜杠中)减少了1,因此该字符串与Java中的字符串相同。

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

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

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

evaluateJavascript

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