Хорошо, получается, что реализация функции $.getScript()
по умолчанию работает по-разному в зависимости от того, находится ли указанный файл сценария в одном домене или нет. Внешние ссылки, такие как:
$.getScript("http://www.someothersite.com/script.js")
приведет к тому, что jQuery создаст внешнюю ссылку на скрипт, которую можно без проблем отладить.
<script type="text/javascript" src="http://www.someothersite.com/script.js"></script>
Однако, если вы ссылаетесь на локальный файл сценария, такой как любой из следующих:
$.getScript("http://www.mysite.com/script.js")
$.getScript("script.js")
$.getScript("/Scripts/script.js");
, затем jQuery будет асинхронно загружать содержимое сценария и затем добавлять его как встроенное содержимое:
<script type="text/javascript">{your script here}</script>
Этот последний подход не работает с любым отладчиком, который я тестировал (Visual Studio.net, Firebug, IE8 Debugger).
Обходной путь - переопределить функцию $.getScript()
, чтобы она всегда создавала внешнюю ссылку, а не встроенный контент. Вот скрипт для этого. Я проверил это в Firefox, Opera, Safari и IE 8.
<script type="text/javascript">
// Replace the normal jQuery getScript function with one that supports
// debugging and which references the script files as external resources
// rather than inline.
jQuery.extend({
getScript: function(url, callback) {
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = url;
// Handle Script loading
{
var done = false;
// Attach handlers for all browsers
script.onload = script.onreadystatechange = function(){
if ( !done && (!this.readyState ||
this.readyState == "loaded" || this.readyState == "complete") ) {
done = true;
if (callback)
callback();
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
}
};
}
head.appendChild(script);
// We handle everything using the script element injection
return undefined;
},
});
</script>