2012-01-21 5 views
0

Есть ли способ перекрестного браузера связать событие onload с тегом статического сценария в html-документе?Событие с перекрестным браузером в статическом теге скрипта

Следующая не будет работать в IE 7 и IE 8:

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

Некоторые фон

Я нашел способ сделать это с помощью динамического тега сценария и если заявления. Это, например, объясняется в this MSDN article.

Моя проблема в том, что мне нужно найти текущий тег скрипта, потому что я создаю виджеты, которые вставляют элементы DOM на место. В прошлом I have found some workarounds to do this, но все они имеют недостатки. Я надеюсь, что использование ключевого слова «this» в событии onload скрипта поможет.

+0

Так что вам нужно 'onload', чтобы иметь возможность использовать' this' для того, чтобы ссылаться на текущий элемент сценария? – dfsq

+0

Правильно, вот почему я добавил некоторый контекст к моему вопросу. Если бы я мог получить «это», чтобы указать на текущий скрипт без загрузки, я тоже был бы счастлив. Как видно из ссылки, я уже изучил ряд альтернатив. – 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% совместимый браузер. Кстати, Google использует этот код, чтобы сделать кнопки +1:

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

Так как думать, как сценарий апи может получить этот хэш-параметры? В моем примере это было бы 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