2014-12-02 1 views
0

Примечание: Это скалоид, поэтому синтаксис немного отличается от Java, но все классы являются обычными классами Android из Java.Настройка innerHTML в веб-просмотре заменяет весь документ, а не только на элемент

Я инициализация WebView с помощью:

webView.settings.setJavaScriptEnabled(true) 
webView.setWebChromeClient(new WebChromeClient) 

, а затем я называю

val jsUrl = "javascript:document.getElementById('" + getTagId(word) + "').innerHTML = '" + guess + "'" 
webView.loadUrl(jsUrl) 

getTagId(word) где находится существующий идентификатор (я отлаженное это) и guess является короткой строкой, как "abc".

Он отлично работает в моем браузере рабочего стола, но в webview он заменяет весь документ вместо того, чтобы просто заменять элемент.

Я пытался отладки и убедитесь, что элемент действительно найден, заменив вызов с

"javascript:alert(document.getElementById('" + getTagId(word) + "').innerHTML)" 

и это показывает предупреждение с правильным содержанием! Только замена идет не так.

Эта ошибка сводит меня с ума :-(Что я упускаю

PS Я работаю над этим открытым исходным кодом проекта: https://github.com/ilyakogan/gluckentext

ответ

0

Я до сих пор не знаю, почему это не сделали работа, но я в конечном итоге добавив функцию JS и вызова его из родного кода Android, вместо вызова getElementById непосредственно из нативного кода

Я добавил это в HTML:.

<script> 
    function markSolved(id) { document.getElementById(id).className='solved'; } 
</script> 

, а затем написал в нативном коде (Scala в моем случае, Java в общем случае):

val jsUrl = "javascript:markSolved(" + getTagId(answeredWord) + ")" 
webView.loadUrl(jsUrl) 
0

Вы можете просто обернуть пользовательский код Js в модуле:

view.loadUrl("javascript:(function(){document.getElementById('uname').value = 'test';})()"); 

работает для меня

Смежные вопросы