2012-12-12 68 views
3

比方說,我們有一個網頁包含此內嵌腳本:如何在動態添加的JavaScript文件的開頭暫停執行?

<script> 
(function() { 
    var script = document.createElement('script'); 
    script.src = 'http://remote.com/external.js'; 
    document.body.appendChild(script); 
}()); 
</script> 

正如你所看到的,外部腳本,external.js,追加到該頁面。

我想在該外部腳本的開頭暫停執行。我是而不是能夠編輯該外部腳本。 (如果我是,我只是在該文件的頂部插入一個debugger;聲明。)

我目前停在這條語句(上面的腳本):

document.body.appendChild(script); 

有沒有其他頁面上的SCRIPT元素,因此,如果我恢復執行,將要執行的下一條語句將成爲外部腳本的第一條語句。

如何命令Chrome的開發工具在下一條語句中暫停執行? 「跳過」命令僅在同一個調用堆棧中工作。

爲什麼我需要這樣的:(這僅僅是背景你並不需要閱讀本。)W3C的HTML5 404頁,包含的頁面加載調用的script with a fixBrokenLink function。該功能然後動態地將fragment-links.js腳本添加到頁面。我想穿過該腳本。我的目標是瞭解腳本如何「修復斷開的鏈接」。當然,我可以靜態分析該腳本,但我更願意通過開發工具直接執行代碼。如果我不認爲這是可能的,我不會問這個問題。


解決辦法:

如果它不是從接受的答案明確,一個人只要邁過document.body.appendChild(script);聲明,使執行暫停在大括號}(見上面的代碼)。此時,Chrome會在後臺加載外部腳本,以便最終顯示在開發工具中。一旦完成,可以在該腳本中設置一箇中斷點,然後繼續執行到該中斷點。

+0

Opera的蜻蜓可以讓你 「[*上一個新的腳本的第一條語句歇*](http://www.opera.com/dragonfly/documentation/debugger/)」。我認爲Chrome devtools有類似的選擇,不是嗎? – Bergi

+0

@Bergi OMG,OMG,OMG ...現在測試... –

+0

哦,來吧,*你*真的可以靜態分析[小腳本](http://www.w3.org/TR/html5 /fragment-links.js),它沒有魔力:-)但有效的問題。 – Bergi

回答

4

這是現在實施的爲它投票或評論,你可以在事件監聽器斷點腳本部分打開腳本首先聲明

enter image description here

4
  1. 在第一個腳本(在這裏,link-fixup.js),添加一個斷點立即appendChild(script)線。 (所以,在這裏,在link-fixup.js末尾的括號內)。

  2. 單擊Devtools的左上角,在Sources窗格中打開導航器。一旦瀏覽器完成加載腳本,您將看到在那裏列出的加載腳本。

  3. 在導航器中,打開Sources窗格中的加載腳本(這裏是fragment-links.js),並在其中放置一個斷點。

  4. 繼續到斷點;你完成了!

+0

作品:)....... –

+0

這很簡單。不知何故,我認爲瀏覽器的UI線程不允許在JavaScript執行暫停時加載外部腳本。 –

1

一種方法:

看代碼,並重寫屬性之一,defineGetter訪問。我與DevTools領導Pavel交談,他建議攔截window.jQuery這是關於第一個JS行。它存儲舊jQuery的價值,你可以用_defineGetter_function() { debugger; return null; }

參見:

不過,雖然我們在這,你可以file a bug,你想能夠進入appendChild當它是要評估JS?還提到歌劇的「新腳本的第一個陳述」,因爲這非常方便。 Chrome DevTools eng團隊希望爲您提供對此用例的很好支持。

+0

這是一個創造性的方法。幸運的是,一旦你跨過appendChild(script),腳本*會顯示出來,所以我對目前的狀態非常滿意。我提交了功能請求[此處](http://code.google.com/p/chromium/issues/detail?id=165781)。 –

+0

http://code.google.com/p/chromium/issues/detail?id=156556 – beefeather