2016-12-21 10 views
0

私のWebページには、カスタムコンテキストメニューから呼び出されると思われるエラーの報告方法が含まれていますより簡単に。 私が達成したいのは、コンテキストメニューが開いている要素の内容をエラーレポートの特定のフィールドに入力することです。JavaScript:カスタムコンテキストメニューからオブジェクトリファレンスを渡す方法

function ReporterContext(p_menu, p_context, p_elem, p_prestage) 
    { 
var l_listitem; 
var l_link; 
var l_text; 
var l_lang = document.children[0].attributes['xml:lang'].value; 
var l_section; 

    if(!p_prestage) 
    { 
    switch(p_context) 
     { 
     case 'link': 
     case 'ext-link': 
     l_section = 'link'; 
     break; 

     default: 
     l_section = 'misc'; 
     } 

    l_listitem = document.createElement('li'); 
    l_link = document.createElement('a'); 
    l_link.setAttribute('href', 'javascript:void(InvokeReporter());'); // Object reference supposed to be added here   
    l_text = document.createTextNode(err_outtext[l_section][l_lang]['report']); 
    l_link.appendChild(l_text); 
    l_listitem.appendChild(l_link); 
    p_menu.appendChild(l_listitem); 
    } 
    } 
ページがロードされたときに、この機能は、全体のコンテキストメニューの魔法に結びついている

(それは次のとおりです。

さて、(エラーの記者を呼び出すためのリンクが追加されます)問題のコードは次のとおりですコンテキストメニューが開かれたときに呼び出されます)、上記のコードでは、コンテキストメニューが開かれた要素に含まれるテキストを自動的に埋め込むことはできませんが、エラーレポーターが開きます。 はしかし、私はこのような要素の参照を渡すためにhref属性を設定する行を変更したときに、私は、コンソール上の構文エラーを取得:

l_link.setAttribute('href', 'javascript:void(InvokeReporter(' + p_elem + '));'); 

p_elemは、コンテキストメニューをトリガしたイベントから抽出された要素の参照です。二重引用符で渡された要素の参照は明白な理由のために、いずれか、それを行うことはありません持っもちろん

、...今

、私は私ができるエラー記者に渡された要素の参照を取得しますどのようにコンテキストメニュー内の参照される要素の内容を使用しますか?方法があれば、私はそれを見ません。私は要素参照を保持するグローバル変数を定義することを避けたいと思います...

EDIT:この問題は、別個の名前空間を形成するために関数をカプセル化することによって回避できます。コンテキストメニューが開かれたエンティティ エラーレポータがその後呼び出されると、以前に保存された要素から内容を読み取ることができます。

答えて

0

実行可能な回避策として、ハンドラ全体を無名関数でラップすることができます。次に、メニューがオープンされたオブジェクトを受け取るローカル変数を宣言します。 エラーレポーターが実際に呼び出されると、以前に記憶されたオブジェクトからの情報を取得できます。

1

hrefプロパティを評価する必要があるJavaScriptコードに設定する代わりに、クリックハンドラをl_linkにバインドします。

ので、代わりにこの:

l_link.setAttribute('href', 'javascript:void(InvokeReporter(' + p_elem + '));'); 

...この操作を行います。

l_link.setAttribute('href', '#'); // this is just to give it the hyperlink style 
l_link.addEventListener('click', function() { 
    InvokeReporter(p_elem); 
    return false; // to cancel the default hyperlink behaviour 
}); 

NB:関数には首都で始まる名前を与えること型破りです。これは通常、コンストラクタに対してのみ行われます。だから私は名前としてinvokeReporterを提案します。

関連する問題