2011-07-30 5 views
4

概要:関数リファレンスのソース行とファイルの決定 - Firebugはどのようにそれを行いますか?

パブリックなものだけのドキュメントコメントを解析するための関数定義の行番号を取得しようとしています。私は関数の名前を見つけることができるようになりました。もし私が望むなら、関数を実行することができますが、行番号情報を引き出す方法を見つけることはできません。注:これはドキュメント目的のためのものであり、クロスブラウザは必要ありません。

私はfirebugを知っていますが(これはどのように可能か分かりません)、マウスオーバーで参照されている関数の行番号とスクリプトの場所を示しています。私は放火犯ソースから見て、限り、彼らは(domPanel.js:536)を呼び出す見つけるようだが、そのソースのどこにでもこの「addMember」機能を見つけることができないよう:

this.addMember(object, "userFunction", userFuncs, name, val, level, 0, context); 

それは、これはちょうどにISNいる可能性があり」可能と判断する。私の後退は[userfunction].name[userfunction].toSource()を使っていて、ソースをソースにマッチさせようとしています。しかし、私は名前が一意ではない可能性があり、toSource()がソースの後処理を提供するので、これらを避けたいと思います。たぶん、火かき棒のAPIに結びつける方法がありますか?

最小限の説明コード:

[目標は、この情報を取得することです注意:window.MyWindowObject.PublicFunction: script.js line 3]

script.js

(function() { 

    function referencedFunction() { 
     ///<summary>Sample XML Doc Comment</summary> 
     alert('well hello there!'); 
    } 

    var publicObject = window.MyWindowObject || {}; 
    publicObject.PublicFunction = referencedFunction; 

    window.MyWindowObject = publicObject; 
}()); 

index.htmを

<!DOCTYPE html> 
<html> 
    <script src="script.js"></script> 
</html> 

EDIT :検索でこれを見つけた人のために、後でここにいくつかの他の使い方があります私が見つけたulの関連情報:

Stacktrace.js:https://github.com/eriwen/javascript-stacktrace - 最終的な関数の位置を取得していないので、私は欲しいものではありません。

クロム(およびIE9):[userfunction].toString()は、私がおそらく最終的に使用するコメントです(Firefoxではありません)。 。私はfirefoxの[userfunction] .toSource()を使用するつもりだったが、これはブラウザ操作のソースのように見える。 firefoxの[userfunction] .toString()はコードを保持しているように見えますが、コメントは削除されます

+2

わからない、行番号と関数定義のために解析することが、私はFFのJavaScriptインタプリタに直接Firebugのフックを考えることができます - あなたが行うことができない何かを構築することなく、ブラウザの拡張機能。 – Flambino

+0

@Flambinoは正しい:Firebugはブラウザプラグインなので、このようなものに特別なアクセス権を持っている。これを証明する必要がある場合は、Firebug Liteを参照してください。Firebug Liteは、ブラウザでJavascriptとして動作します。 JSデバッガ機能を持たないのは、プラグインからの特権なしでは実行できないためです。 – Spudley

+0

@Spudleyを(FirebugのLiteのドキュメントは、実際にこれを明示的に述べている):私は、私はすでに放火犯のライトで見てきた私の質問で述べたとJavaScriptの限界を理解し、それでもこれを行うにはどのような方法があるかどうかを尋ねました。スタックトレースには、私が探している情報が含まれているブラウザがいくつかありますが、まだ解決策が見つかっていないので、例外を強制することを考えていました。 –

答えて

0

普通のJSにはない保護されたChrome機能にアクセスできます。しかし

、JSはまだコメントがアクセス、生 <script>ソース、そのまま、限り、同一生成元ポリシーは、アクセスをブロックしないことができて。

たとえば、このコードは、すべての埋め込まれたスクリプトの生のソースと同じドメインからロードされた任意のスクリプトを取得します。 :

var scipts = document.querySelectorAll ('script'); 

for (var J = 0, L = scipts.length; J < L; ++J) { 
    console.log ('Number: ', J); 
    var node = scipts[J]; 
    if (!node) continue; 

    if (node.src) { 
     //$.get (node.src, function (data) {console.log ('Text: ', data); }); 
     try { 
      var req = new XMLHttpRequest(); 
      req.open ('GET', node.src, false); 
      req.send (null); 
      if (req.status == 200 || req.status == 304) 
       console.log ('Text: ', req.responseText); 
     } 
     catch (err) { 
      console.log (err); 
     } 
    } 
    else if (node.innerHTML) { 
     console.log ('Text: ', node.innerHTML); 
    } 
} 

生スクリプトは、その後などが

+0

それはすべて内部的なので、私はXドメインについてあまり心配していません。 –

2

これは私がテストしていない潜在的な解決策です。数年前、security exploitがあったため、JavaScriptはネイティブオブジェクトのコンストラクタを再宣言できました。おそらくそれはインクルードが存在するエクスプロイトのブラウザで関数宣言を再宣言することは可能ですが、同じ静脈では

function Array() { 
    this[1] = 50; 
} 
var a = [40]; 
alert(a[0] + a[1]); // Gives 90 

John Walkerは、この例を与えましたか?

function Function() { 
    // Should give the stack trace, complete with line number? 
    alert(new Error().stack); 
} 

window.x = function() {} 

私は必要なのブラウザを(ジョンResig氏は、アレイは、作品を利用するブラウザとしてのFirefox 2、Opera 9の、およびSafari 3を引用している)持っていないので、私はそれをテストすることはできませんが、多分これは、始める場所?

+0

+1すばらしいアイデアです。私はそれを調べます。 –

+0

Node.jsでv0.10.32が動作していないようです... :-( – Piranna

関連する問題