Цитата:
|
LamerNo1 в любом случае надо выяснить причину, т.е. постепенно сокращать скрипт, пока он не станет запускаться. Например, в конце скрипта можно вставить тот же alert. При это появление диалогового окна будет означать, что скрипт запустился
|
Так получилось сделать?
|
test.js
var AnyElem={
param1: 'val1',
param2: 2,
setParam: function(p,v){
if(this[p]&&v){
this[p]=(typeof this[p]==='string')?v.length>0?v:'':parseInt(v);
}
}
};
index.html
<html>
<head>
<script language="javascript">
function loadSrc(p){
if(p&&p.length>0){
var s=document.createElement('script');
with(s){
setAttribute('type', 'text/javascript');
setAttribute('language', 'javascript');
src=p;
}
// document.getElementsByTagName('head')[0].appendChild(s);
document.body.appendChild(s);
}
}
var init=function(){
loadSrc('test.js');
console.log(AnyElem);
}
</script>
</head>
<body onload="init()">
</body>
</html>
Лог консоли FF3 Цитата:
|
jquery, например, так не делает, она создает элемент, в который вставляет скрипт, а потом этот элемент вставляет в документ. Примерно так:
var script = document.createElement("script"),
id = "script" + (new Date).getTime();
script.type = "text/javascript";
try {
script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
} catch(e){}
root.insertBefore( script, root.firstChild );
// Make sure that the execution of code works by injecting a script
// tag with appendChild/createTextNode
// (IE doesn't support this, fails, and uses .text instead)
if ( window[ id ] ) {
jQuery.support.scriptEval = true;
delete window[ id ];
}
root.removeChild( script );
// Evalulates a script in a global context
globalEval: function( data ) {
if ( data && /\S/.test(data) ) {
// Inspired by code by Andrea Giammarchi
// [url]http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html[/url]
var head = document.getElementsByTagName("head")[0] || document.documentElement,
script = document.createElement("script");
script.type = "text/javascript";
if ( jQuery.support.scriptEval )
script.appendChild( document.createTextNode( data ) );
else
script.text = data;
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709).
head.insertBefore( script, head.firstChild );
head.removeChild( script );
}
},
p.s. по-моему ничего важного не пропустил |
. .
|
Общий принцип понятен, но по моему через чур заморочисто... Можно использовать по принципу "если нельзя, но очень хочется, то можно"... в самых крайних условиях.
ИМХО, легче до начала инициализации подгрузить все скрипты и спокойно работать... |
да уж, сообщение: "Подгружаются все скрипты, приходите завтра!" :)
p.s. я и не говорил, что нужно этим повсеместно пользоваться |
Я делал немного проще...
var head=document.documentElement.firstChild; // Есть и другие варианты получить head. Кому как удобнее.
// Подключаем скрип
var js=document.createElement('script');
js.type='text/javascript';
js.src='script.js';
head.appendChild(js);
//Подключаем стили (так... до кучи...)
var css=document.createElement('link');
css.href='style.css';
css.media='screen'; //all, print ect.
css.rel='stylesheet';
css.type='text/css';
head.appendChild(css);
Работает везде, где нада (не придерацца к мелочам!!). Проверить загрузился ли скрипт нужно вариантом с callback имхо. Более точно проверять можно при использовании аякс. Получили в xml, распарсили, вставили(как вариант). |
B~Vladi,
для общего развития. Попробуйте запустить ваш код в ИЕ6 в контексте такой вот страницы.
<html>
<head>
<base href="/" />
<script type="text/javascript">
var head=document.documentElement.firstChild; // Есть и другие варианты получить head. Кому как удобнее.
var js=document.createElement('script');
js.type='text/javascript';
js.src='script.js';
head.appendChild(js);
</script>
</head>
<body>
</body>
</html>
|
| Часовой пояс GMT +3, время: 18:12. |