предположим, у вас есть простая веб-страница, которая динамически загружает контент, который выглядит следующим образом:
- main.html -
<!DOCTYPE html>
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript"
src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-1.6.2.js">
</script>
<script type="text/javascript">
$(function() {
$.ajax({
type: 'get', cache: false, url: '/svc.html',
success: function(h) {
$('#main').html(h);
}
});
});
</script>
</head>
<body>
<div id='main'>
loading...
</div>
</body>
</html>
и загружаемая страница использует небольшой Javascript в отдельном файле:
- svc.html -
<script type="text/javascript"
src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-1.6.2.js">
</script>
<script type="text/javascript" src="/plugin.js" css="/plugin.css"></script>
<div id='inner'>
dynamically loaded content
</div>
обратите внимание на атрибут css
на теге скрипта - он указывает таблицу стилей, которая принадлежит скрипту и которую скрипт будет загружать для нас. Вот сценарий:
- plugin.js -
var css = $('<link />', {
rel: "stylesheet", type: "text/css", href: $('script:last').attr('css')
});
$('head').append(css);
и, наконец, таблица стилей, которая просто окрашивает загруженный div inner
, в качестве доказательства того, что все это работает:
- plugin.css -
#inner
{
border: solid 1px blue;
}
Теперь вы заметите, как загружается таблица стилей: мы смотрим на $('script')
и выбираем последний, затем берем атрибут css
и прикрепляем элемент link
к голове документ.
Я могу посетить /svc.html
, и javascript запускается, загружает мою таблицу стилей, все круто - однако, если я посещаю /main.html
, javascript запускается, но не может найти загрузку plugin.js
в массиве $('script')
(и поэтому не может загрузить таблицу стилей). Обратите внимание, что скрипт плагина действительно работает, он просто не видит себя.
Это ошибка? ограничение метода JQuery AJAX? не должны ли $('script')
отражать все скрипты, которые были загружены?
* редактировать *
после долгих воплей и скрежета зубов я решил пойти на решение Кевина Б. Однако я не могу заставить его работать, в основном потому, что код plugin.js
запускается в тот момент, когда вставляется scriptNode
, но в коде плагина узел еще не вставлен и поэтому недоступен в массиве $('script')
- так что я все еще SOL. Я поместил весь код для просмотра здесь:
http://www.arix.com/tmp/loadWithJs/