Веб-просмотр Android ПРОПУСКАЕТ javascript даже с setJavascriptEnabled (true) и WebChromeClient

(используя Samsung Galaxy Tab и Android 3.0, это предназначено для работы на каждом планшете 3.0+, как и в их браузерах, но не в веб-просмотре)

У меня есть страница с CSS и jQuery, которая отлично загружается в браузерах, браузерах Android и устройствах iOS, но веб-просмотр Android отказывается загружать ее последовательно.

Я сузил проблему до простого пропуска javascript при загрузке (реплицируя проблему с некоторыми демонстрационными приложениями javascript для веб-просмотра). Почему это?

ВОТ ПОЛНЫЙ ТЕСТ HTML-КОД http://pastebin.com/GmE2vEYx

и вот как я это называю:

  myWebview.loadUrl("file:///android_asset/myPage.html");
  myWebview.getSettings().setJavaScriptEnabled(true);
  myWebview.setWebChromeClient(new WebChromeClient());

Порядок этих трех вызовов не влияет на результат.

  myWebview.getSettings().setJavaScriptEnabled(true);
  myWebview.setWebChromeClient(new WebChromeClient());
  myWebview.loadUrl("file:///android_asset/myPage.html");

Одна вещь, которую я заметил, заключается в том, что если вы дадите ему время (приостановив приложение с помощью точки останова в отладчике), то javascript будет загружаться более последовательно. Это привело меня к некоторым надуманным экспериментам с попытками замедлить загрузку приложения, но на самом деле это не желаемый пользовательский опыт. Я действительно надеюсь, что веб-просмотр Android действительно не является IE6 мобильной разработки.

Дополнительные факты:

Если вы удалите теги <script>, которые содержат весь Jquery, страница быстро загрузится со всем форматированием CSS. Как только добавляется Jquery, вообще ничего не загружается.

Я также нашел несколько других вопросов, которые сталкиваются с той же проблемой, многие из них остаются без ответа или не имеют окончательного ответа на то, что искал ОП :(

см.: Android: не удается получить javascript для работать в WebView даже с setJavaScriptEnabled(true)

Перезагрузка страницы (Webview.loadUrl) приводит к Javascript не обрабатывается (полностью)

http://groups.google.com/group/android-developers/browse_thread/thread/9962064ef217a5a7#

JavaScript иногда не работает в веб-просмотре Android

Android WebView не загружает JavaScript файл, но браузер Android загружает его нормально

Android Webview не может обрабатывать javascript?

предложения? давайте докопаемся до сути! В документации по Android говорится, что веб-просмотр имеет ограничения, но я не знаю, где этот предел, поскольку люди постоянно создают приложения HTML CSS JS!


person CQM    schedule 04.08.2011    source источник
comment
Если в JS есть ошибки, они должны отображаться в adb logcat с тегом Web Console или WebCore. Видите ли вы какие-либо ошибки JS на своих страницах?   -  person NoBugs    schedule 19.08.2011


Ответы (4)


У меня также есть Samsung Galaxy Tab и Android 3.0 с веб-страницей jQuery javascript, и она работает. Убедитесь, что ваша страница работает в браузере Crome и что у вас нет ошибок javascript. Известны проблемы с некоторыми стилями CSS3 (например, исчезновение изображений), но jQuery должен работать. Если вы пытаетесь связаться с javascript, убедитесь, что вы делаете это после загрузки страницы. Убедитесь также, что все файлы находятся в правильном каталоге :). Также иногда содержимое кэшируется, поэтому попробуйте удалить его (или удалить приложение).

Пожалуйста, предоставьте исходный код вашей веб-страницы, чтобы мы могли проверить.

Пример веб-просмотра:

webView = (WebView) findViewById(R.id.webview);

WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setPluginsEnabled(true);
webSettings.setLoadsImagesAutomatically(true);
webSettings.setSupportZoom(false);

webView.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);
webView.setWebViewClient(new WebViewClient()
{
    @Override
    public void onPageFinished(WebView view, String url) 
    {
        // page loaded...
        super.onPageFinished(view, url);
    }
});
webView.setWebChromeClient(new WebChromeClient()
{
    @Override
    public boolean onJsAlert(WebView view, String url, String message,JsResult result) 
    {
        Log.e("alert triggered", message);
        return false;         
    }
});
webView.loadUrl("http://mypage/mypage.html");

Я надеюсь, что это помогает.

ОБНОВЛЕНИЕ 1: я проверил ваш код на вкладке Samsung Galaxy. Я изменился

<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.2.min.js"></script>

линия. Страница загружена, я вижу содержимое с картинкой. Итак... код работает как положено. Я заметил, что иногда содержимое отображается не так, как должно быть. Похоже, проблема в масштабировании:

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, user-scalable=no" />

и вычисление внутри $(document).ready() неверно!

Кстати... то, что вы ищете, это ViewPager с WebViews.

ОБНОВЛЕНИЕ 2: Обратите внимание, что при загрузке веб-страницы в виде файла:/// вы должны иметь файлы JS в том же каталоге (без внешних URL-адресов).

person xpepermint    schedule 14.08.2011
comment
Хорошо, я сократил его до нескольких строк $('body').css({height : height+'px', width : Math.floor(width*0.98)+'px' }); $('.text').css({height : height+'px', width : Math.floor(width*0.98)+'px' }); $('#firstpage').css({height : height+'px', width : Math.floor(width*0.98)+'px' }); $('body').prepend('<style>.text{-moz-column-count:'+numCols+';-webkit-column-count:'+numCols+';}</style>'); без них, все загружается нормально, но эти строки жизненно важны, поэтому я буду искать лучший способ сделать то же самое (он помещает страницу в столбцы динамически) - person CQM; 16.08.2011
comment
Эй... не могли бы вы предоставить URL? Вы проверили это в Crome? Вы получаете какие-либо ошибки? Как вы загружаете jQuery (где)? - person xpepermint; 16.08.2011
comment
URL-адрес указан в pastebin, вам придется протестировать его на своем компьютере. JQuery загружается локально из папки с ресурсами, я подтвердил, что это работает, потому что функции смахивания работают. Проверил в Хроме, ошибок нет - person CQM; 16.08.2011
comment
что вы имеете в виду, что расчет внутри готового документа является ложным? который из? ТАКЖЕ, куда именно идет метатег? выше или ниже тега script (я не получаю разных результатов). Можете ли вы рассказать о ViewPager с веб-просмотрами ??? - person CQM; 17.08.2011

Ответ заключается в том, что javascript должен находиться в функциях HTML-страницы <script>sections, а затем должен быть внедрен с помощью webview.loadUrl("javascript:yourJavascriptFunction()") after webview.setWebviewClient(new WebviewClient(){ public void onPageFinishedLoading(){ ...//js injections here });

person CQM    schedule 25.08.2011

Некоторое время назад я столкнулся с той же проблемой - моим окончательным решением было отказаться от jquery и просто использовать простой JS. Вещи постоянно ломались, при этом нормально работали при просмотре из обычного Android-браузера.

Если это единственные строки, которые нарушают код, попробуйте воспроизвести ту же функциональность этих строк с помощью чистого JS. Собственный веб-просмотр Android имеет довольно хорошую поддержку всех последних возможностей JS,

so...

$('body').css({height : height+'px', width : Math.floor(width*0.98)+'px' });
$('.text').css({height : height+'px', width : Math.floor(width*0.98)+'px' }); 
$('#firstpage').css({height : height+'px', width : Math.floor(width*0.98)+'px' }); 
$('body').prepend('<style>.text{-moz-column-count:'+numCols+';-webkit-column-count:'+numCols+';}</style>'); 

было бы...

var doc = document,
    body = doc.getElementsByTagName('body')[0],
    bodyStyle = body.style,
    firstPage = doc.getElementById('firstpage'),
    firstPageStyle = firstPage.style,

    head = doc.getElementsByTagName('head')[0],
    style = doc.createElement('style'),
    rules = doc.createTextNode('.text{-webkit-column-count:'+numCols+';}');

bodyStyle.height = height + 'px';
bodyStyle.width = Math.floor(width * 0.98) + 'px';

firstPageStyle.height = height + 'px';
bodyStyle.width = Math.floor(width * 0.98) + 'px';

style.type = 'text/css';

if( style.styleSheet )
    style.styleSheet.cssText = rules.nodeValue;
else 
    style.appendChild( rules );

head.appendChild( style );

Просто убедитесь, что приведенный выше код запускается после загрузки всех используемых элементов (после состояния готовности DOM или до закрытия тега).

пс. Кроме того, поскольку вы используете веб-кит Android, зачем нужен -moz-column-count?

person Pantelis    schedule 17.08.2011
comment
Не могли бы вы уточнить, как именно должен работать этот синтаксис? Все это терпит неудачу на jslint.com . В моем исходном коде есть $(document).ready(function(){....});, и я считаю, что ваша версия js входит в эту функцию, но если я полностью перейду на js, то я думаю, что мое объявление функции теперь будет другим. - person CQM; 17.08.2011
comment
$(документ).готовый(функция(){....}); в значительной степени гарантирует, что код, заключенный в анонимном обратном вызове готовой функции, будет запущен после загрузки DOM. Того же эффекта можно добиться, добавив свои скрипты перед закрытием тега body. Код, которым я поделился, должен работать на 100% правильно, заключенный в готовый документ, если установлена ​​переменная ширины, потому что это единственные отсутствующие значения. Я только что перевел код jQuery, который вы разместили, на обычный JS. - person Pantelis; 18.08.2011
comment
Что касается jslint, проблема в строке 22, символ 5: ожидается ровно один пробел между «else» и «style». и Проблема в строке 21, символ 1: ожидается «еще» в столбце 5, а не в столбце 1. В большинстве случаев простые ошибки идентификации легко исправимы. Единственная опасность - это переменная ширины, которая, я считаю, уже объявлена ​​​​в вашем существующем коде, поэтому здесь не должно быть проблем :) - person Pantelis; 18.08.2011

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

Изменить

Если это не проблема, вы можете рассмотреть возможность публикации

  • самый простой SSCCE, который, по вашему мнению, не работает, но который, по вашему мнению, должен
  • марка/модель вашего устройства и версия Android, с которой вы работаете
person no.good.at.coding    schedule 13.08.2011
comment
@RD Без вашего фактического кода никому трудно ответить. Кроме того, публикация марки/модели устройства, с которым вы работаете, может привести к предложениям от кого-то, кто уже сталкивался с конкретной проблемой устройства. - person no.good.at.coding; 13.08.2011
comment
Вкладка Samsung Galaxy, но желательно все устройства Honeycomb 3.0+ - person CQM; 13.08.2011