debugging通过jQuery getScript函数添加的脚本
我有一个页面,通过jQuery的$.getScript
函数dynamic添加脚本引用。 脚本加载和执行正常,所以我知道引用是正确的。 但是,当我向任何脚本添加“debugging器”语句以允许我在debugging器(如VS.Net,Firebug等)中遍历代码时,它不起作用。 似乎jQuery加载脚本的方式阻止了debugging器find这些文件。
有没有人有这方面的解决办法?
好吧,事实certificate$.getScript()
函数的默认实现工作方式不同,具体取决于引用的脚本文件是否位于同一个域中。 外部参考如:
$.getScript("http://www.someothersite.com/script.js")
会导致jQuery创build一个外部脚本引用,可以debugging没有问题。
<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将asynchronous下载脚本内容,然后将其添加为内联内容:
<script type="text/javascript">{your script here}</script>
后一种方法不适用于我testing过的任何debugging器(Visual Studio.net,Firebug,IE8 Debugger)。
解决方法是重写$.getScript()
函数,以便始终创build外部引用而不是内联内容。 这是脚本来做到这一点。 我已经在Firefox,Opera,Safari和IE 8中testing过了。
<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>
使用JQuery 1.6(也许1.5),你可以切换到不使用getScript,但使用jQuery.ajax()。 然后设置crossDomain:true,你会得到相同的效果。
错误callback将不起作用。 所以你可能不会像下面那样设置它。
但是,我确实设置了一个计时器,并成功清除它。 所以说10秒后,如果我没有听到任何事情,我认为文件是坏的。
jQuery.ajax({ crossDomain: true, dataType: "script", url: url, success: function(){ _success(_slot) }, error: function(){ _fail(_slot); } })
对于那些想要debugging脚本并使用$ .when(James Messinger的答案与$ .when不兼容)的人,我build议使用下面的代码:
var loadScript = function (path) { var result = $.Deferred(), script = document.createElement("script"); script.async = "async"; script.type = "text/javascript"; script.src = path; script.onload = script.onreadystatechange = function (_, isAbort) { if (!script.readyState || /loaded|complete/.test(script.readyState)) { if (isAbort) result.reject(); else result.resolve(); } }; script.onerror = function () { result.reject(); }; $("head")[0].appendChild(script); return result.promise(); };
所有的荣誉和荣誉都归Benjamin Dumke-von der Ehe所有,他的文章: jQuery脚本插入及其对debugging的影响
这适用于$ .when和脚本完全可见和可debugging。 谢谢。
尝试这个,
jQuery.extend({ getScript: function(url, callback) { var head = document.getElementsByTagName("head")[0]; var ext = url.replace(/.*\.(\w+)$/, "$1"); if(ext == 'js'){ var script = document.createElement("script"); script.src = url; script.type = 'text/javascript'; } else if(ext == 'css'){ var script = document.createElement("link"); script.href = url; script.type = 'text/css'; script.rel = 'stylesheet'; } else { console.log("Неизветсное расширение подгружаемого скрипта"); return false; } // 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; } });
有一个简单的方法来使用Chrome进行debugging。
1-在你想要debugging的行写一个console.log(“something”)。
2-监视该日志的控制台。
3-点击日志前面的地址链接。
4-在该行上设置断点。
为了避免大量额外的编码,你可以试试这个。 在你已经声明$('document')。ready()( 或者你的debugging器可以访问的任何其他文件 )的文件中 ,添加类似…
$.debug = function(name) { var n = name; }
在debugging器的分配行中添加一个断点。 然后,在你用$ .getScript()加载的任何其他js文件中,你可以添加…
$.debug("some string to identify this point of code");
每当执行该行时,debugging器将停止并等待您的命令。 跳出$ .debug函数,就是这样!
在使用Firebug 2.0.14的Firefox 38.6.0中,当我进入脚本选项卡时,我在下拉菜单中看到一个条目,如jquery-1.11.1.js line 338 > eval
,其中包含加载的脚本。 另外,看看这个版本的jQuery中的代码,看起来像内部$.getScript()
使用$.get()
,最终$.ajax()
,唯一的区别是脚本的eval()
由jQuery globalEval()
函数处理:
// Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && jQuery.trim( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } },
这与OP的解决scheme相结合。 覆盖必要的jquery,将gets视为始终跨域,他们将完美地显示出来,而不会在jQuery的承诺实现中破坏一件事情。
jQuery.extend({ get: function (url, data, callback, type) { // shift arguments if data argument was omitted if (jQuery.isFunction(data)) { type = type || callback; callback = data; data = undefined; } return jQuery.ajax({ url: url, type: "GET":, dataType: type, data: data, success: callback, crossDomain: true }); } });