jQuery getScript не работает в Android WebView при использовании локальных ресурсов / HTML / ресурсов - PullRequest
5 голосов
/ 21 марта 2012

У меня есть нативное приложение для Android, которое содержит WebView.Весь мой HTML, js & css был добавлен в проект Android в папке активов, поэтому я инициализирую свой WebView в коде Java примерно так ...

WebView webView = (WebView)findViewById(R.id.webview);
webView.loadUrl("file:///android_asset/index.htm");

Все работает нормально, пока мне не понадобитсядинамически загрузить дополнительный js-файл из JavaScript с помощью метода jQuery getScript ...

var scriptUrl = "scripts/dynamicScript.js";
$.getScript(scriptUrl , function() { alert("Success"); })
    .fail(function(e){ alert("failed: " + JSON.stringify(e)); });

В основном скрипт не загружается, и я получаю следующее сообщение:

failed: {"readState":4,"responseText":"", "status":404, "statusText":"error"}

Я также попробовал следующие альтернативы для scriptUrl и получил точно такой же результат и сообщение:

"/scripts/dynamicScript.js"
"./scripts/dynamicScript.js"
"android_asset/scripts/dynamicScript.js"
"../android_asset/scripts/dynamicScript.js"
"file:///android_asset/scripts/dynamicScript.js"

Я предполагаю, что это может иметь какое-то отношение к same-origin-policy.Любая помощь в получении этой работы приветствуется.

РЕДАКТИРОВАТЬ: Кроме того

Я также попробовал следующие альтернативы $ .getScript ().

Использование неасинхронный вызов сценария ajax.Это приводит к тому же результату, что и выше ...

$.ajax({
   url: scriptUrl, 
   dataType: 'script', 
   success: function() { alert("Success"); },
   error: function(e){ alert("failed: " + JSON.stringify(e)); },
   async: true
});

, а также динамически вставляет тег сценария в заголовок.Это, похоже, не работает (например, если у меня просто есть предупреждение в dynamicScript.js, его никогда не видно) ...

$("<script type='text/javascript' src='" + scriptUrl +"'></script>").appendTo("head");

Я также мог бы отметить, что ВСЕ вышеописанные попытки работаютесли я размещаю веб-сайт удаленно, а не в качестве локального ресурса, то, тем не менее, это не выполнимое решение IE, это работает, если я создаю экземпляр следующим образом ...

WebView webView = (WebView)findViewById(R.id.webview);
webView.loadUrl("http://remote-server/index.htm");

1 Ответ

7 голосов
/ 22 марта 2012

Ага, я, кажется, подозревал, этот старый классик выполняет свою работу ...

var scriptUrl = "scripts/dynamicScript.js";
var head = document.getElementsByTagName("head")[0];
script = document.createElement('script');
script.type = 'text/javascript';
script.src = scriptUrl;
script.onload = function() { alert("Success"); };
script.onerror = function(e) { alert("failed: " + JSON.stringify(e)); };
head.appendChild(script);

Благодаря Филиппу Фицсиммонсу. Не уверен, почему приложение jQuery не помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...