2013-12-23 37 views
2

具體例子:從How Big is Your Haystack?如何調試外部評估和演示腳本

haystack.js腳本我搜索的答案,一切似乎指向使用//# sourceURL=name.js評論。然而,如何完成這個機制避開了我(也許我只是密集)。

每個人總是指向Debugging JavaScript,但演示已損壞(同源錯誤)。其他常見示例不能提供有關使用諸如此類的外部腳本的信息。

我試過使用Live Edit來插入sourceURL註釋,但到目前爲止,eval腳本從來沒有出現在Sources選項卡中。

有人請走過我完成這項任務的步驟?

UPDATE:這已被證明是一個有趣和煩人的努力。這種特殊的網站讓任務不必要具有以下併發症困難:

  • 的haystack.js腳本包括document.write()語句(其中加載使用其他腳本)。腳本重新加載之前必須刪除這些內容,否則DOM將被清除。

  • 作者在代碼上使用了一種奇怪的反向密碼形式的模糊處理。因此,在刪除混淆之後,但在評估發生之前,必須修改代碼(包括sourceURL)。

我克服了部分解決方案。 jQuery的加載到頁面後,我運行此腳本:

$.ajax({ 
    url: '/js/haystack.js', 
    dataType: 'text' 
}).done(function(data) { 
    // Remove document.write() statements and append sourceURL comment after obfuscation is removed 
    var refactored = data.replace(/return d/, "return d.replace(/document\.write[^;]+;/g, '') + '\\n//# sourceURL=haystack.js\\n';"); 
    $('head').append('<script type="text/javascript">' + refactored + '</script>'); 
}); 

DevTools Source Tag after script

現在haystack.js出現在(無域)來源標籤的樹。斷點可以設置,但有一些奇怪的行爲。似乎DOM事件處理程序仍然綁定到原始腳本(重新加載的腳本處理程序中的斷點永遠不會到達)。執行pageInit()再次將處理程序重新綁定到修改後的腳本,但頁面更新仍然不穩定。不知道爲什麼行爲依然存在。我可以遍歷代碼,並且所有內容都正常顯示,但頁面更新似乎落後於代碼。代碼違反幾乎所有JavaScript最佳實踐的事實無疑是一個因素。

+0

你說的是調試腳本嗎?你不能使用'try'和'catch'嗎? – Cilan

+0

好問題。 +1 –

+0

即使已經有一段時間了,我也想添加它。 https://chrome.google.com/webstore/detail/switcheroo-redirector/cnmciclhnghalnpfhhleggldniplelbg?hl=zh_CN將允許finagle腳本標記,以便您可以將其指向本地副本(您已解開),然後調試: https://chrome.google.com/webstore/detail/switcheroo-redirector/cnmciclhnghalnpfhhleggldniplelbg?hl=zh-CN –

回答

3

這個問題真的很吸引我。我希望我的回答有幫助。我開始與Set breakpoints and debug eval'd JavaScript再擴展有點

這比使用eval,您可以插入腳本元素插入文檔更好plunker

var js = "console.log('this is line 1');" 
addCode(js); // Right now! Debuggable! 

// Dynamically evaluate JavaScript-as-string in the browser 
function addCode(js){ 
    var e = document.createElement('script'); 
    e.type = 'text/javascript'; 
    e.src = 'data:text/javascript;charset=utf-8,'+escape(js); 
    document.head.appendChild(e); 
} 

然後它會在源選項卡中顯示:

enter image description here

使用eval還通過增加線//@ sourceURL=dynamicScript.js末工作

看到這個plunker

var js = "console.log('this is line 1');\n" + 
"//@ sourceURL=dynamicScript.js;" 
addCode(js); // Right now! Debuggable! 

// Dynamically evaluate JavaScript-as-string in the browser 
function addCode(js){ 
    eval(js); 
} 

請注意,腳本列在(無域)源文件夾下。

+0

我曾看過Phrogz的帖子,但仍未看到如何將其應用於手頭的問題。有問題的haystack.js加載在