我正试图在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加载的\
字符少一个,例如。 \( \)
?
答案 0 :(得分:1)
我一直在尝试找出为什么为什么 animateIcons(requestId)
也会减少反斜杠的数量。不幸的是,尚未找到答案。
关于如何处理此问题,我找到了两种解决方案:
WebView
(似乎我将2替换为4,但这是因为我要为Java转义反斜杠字符。)
所以这一行意味着在我的字符串中的每个反斜杠上再添加一个。由于getScript(htmlStringBuilder,count).replace('\\', '\\\\')
将反斜杠的数量(在组合的反斜杠中)减少了1,因此该字符串与Java中的字符串相同。
但是,我不确定在某些情况下反斜杠需要采用某种格式时,这种方法是否会破坏字符串。在我的用例中,这一直有效,但是我不确定这是否是一个好的通用解决方案
正如我在有关为什么的问题中建议的那样(Why does WebView.evaluateJavascript() remove escape characters?),您可以在将字符串传递到WebView之前进行URLEncoding
evaluateJavascript
这可能是最好的常规解决方案。这种方法的唯一问题是,您还必须在Javascript中进行更改以对字符串进行URLDecode,这在某些情况下可能令人讨厌或无法完成