2012-01-21 20 views
0

是否有跨浏览器的方式将onload事件与静态脚本标记关联在一个html文档中?静态脚本标记中的跨浏览器onload事件

下不会在IE 7和IE 8的工作:

<script onload="DoThat" type="text/javascript" src="..."></script> 

一些背景

我已经找到一种方法与动态脚本标记和if语句来做到这一点。例如在this MSDN article中解释。

我的问题是,我需要找到当前的脚本标记,因为我正在构建在原地插入DOM元素的小部件。在过去的I have found some workarounds to do this,但他们都有其不利因素。我希望在脚本onload事件上使用“this”关键字会有所帮助。

+0

所以你需要'onload'能够使用'this',以指代当前脚本元素? – dfsq

+0

对,这就是为什么我在我的问题中添加了一些上下文。如果我可以在不加载的情况下将“this”指向当前脚本,我也会很高兴。正如您从链接中看到的那样,我已经探索了一些替代方案。 – Christophe

回答

3

据我所知,你需要你的代码来知道它属于哪个脚本元素。然后,您将在此脚本旁边插入必要的HTML小部件内容,或者附加到脚本父级等。如果是这样,那么我会为您提供另一种方法。

里面你部件JavaScript文件放置下一行代码:

var scripts = document.getElementsByTagName('script'), 
    thisScript = scripts[scripts.length - 1]; 

thisScript是你正在寻找,当前脚本元素的代码位于的DOM元素。很简单。

它为什么有效。 详细说明http://feather.elektrum.org/book/src.html。只是一个摘要:

当带有src的脚本加载到页面中时,页面的其余部分尚未写入。这意味着无论页面包含多少个脚本,当前开始执行的脚本都是最后一个脚本

这是相当简单和有效的技术,但并不是很多人知道这种可能性。它的可靠性和100%的浏览器兼容。顺便说一句,谷歌使用此代码来呈现+1按钮:

<script type="text/javascript" src="https://apis.google.com/js/plusone.js"> 
    {lang: 'dk'} 
</script> 

那么如何看待api脚本如何获得这个散列参数呢?在我的例子中,它将是thisScript.innerHTML

+0

如果你按照我的问题中的链接,你会看到这是一个替代方案。断言“当页面中加载了src脚本,页面的其余部分尚未写入”对于延迟脚本或异步脚本是不正确的。 – Christophe

+1

是的,绝对如果你有延期加载,那么这是不适合的。无论如何,这是IE7的绝佳选择。 – dfsq

0

我不知道我是否抓住了您的需求。
反正来定位当前的脚本,你可以尝试这个例子

<script src="jquery-1.7.1.min.js" varTest="valueTest" id="myID"></script> 
<script> 

var scripts = document.getElementsByTagName('script');  
var pattern = 'jquery-1.7.1.min.js'; 
var i = undefined; 

for (var x=0; x<scripts.length; x++) 
{ 
    if (scripts[x].src.match(pattern)) { i = x; break; } 
} 

if (typeof(i) != 'undefined') 
{ 
    // Do any association needed here 
    var current_script = scripts[i]; 
    // Just for test    
    console.log(current_script.attributes); 
} 

</script> 
+0

这个答案非常有意义。但正如我所提到的,我的问题是我有一个小部件方法,用户可以选择多次插入相同的小部件。然后多个脚本将具有相同的“模式”。 – Christophe