2017-01-22 11 views
0

私はC#でWebブラウザを作っており、ユーザーが右クリックした要素に基づいてカスタムコンテキストメニューを表示しています。どの要素をリンクとして扱わなければならないのか分かりませんか?Javascriptで親と祖父母のリンクを検出する

if (el_tag == "a") 
    showLinkMenu(); 

else if (el_tag == "img" && parent_tag == "a") 
    showAdvancedMenu(); 

else if (el_tag == "img") 
    showImgMenu(); 

Shot1:Google chrome detected this as a link

Shot2:Structure>のdiv> div>のdiv>のdiv>のIMG

私は、このようなリンクを検出するために何をすべき?

+0

既存のWebブラウザではそうしないと考えてください。代わりに、各ネストされた要素はclickイベントを受け取り、独自のロジックに従って処理します。したがって、例の場合、aとdivs、およびimageはすべて、そのクリックイベントを外側から内側(順番に)。アンカーがhrefを持っている場合、それはナビゲーションアクションになるべきであり、それゆえさらなる伝播を妨げると論理が言います。 – Paul

+0

'var p = el_tag;一方、(1){p = p.parentElement.tagName; if(p == 'a' || p == 'body'){alert(p);}ブレーク; }} ' これはいかがですか? –

+0

?私はあなたがあなたがCで働いていると言ったと思った# – Paul

答えて

1

<a>hrefという属性がある場合は、親タグのリストを繰り返し、リンクを呼び出す必要があります。

+0

が実行したコマンドを送信しました。上記の私のコメントを読んでください。今それを試みる。 –

0

IContextMenuHandlerを実装し、CefMenuCommandの組み込み機能とTypeFlagの組み込み関数を使用することをお勧めします。これにより、右クリックされた要素に基づいてコンテキストメニュー項目を追加または削除することができます。

MenuHandler.cs

internal class MenuHandler : IContextMenuHandler 
{ 
    private const int SaveImage = 26503; 
    private const int OpenLinkNewTab = 26501; 

    public event EventHandler OnSaveImage = delegate { }; 

    void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model) 
    { 
     if(parameters.TypeFlags.HasFlag(ContextMenuType.Media) && parameters.HasImageContents) 
     { 
      model.AddItem((CefMenuCommand)SaveImage, "Save image"); 
     } 
     if(!string.IsNullOrEmpty(parameters.UnfilteredLinkUrl)) 
     { 
      model.AddItem((CefMenuCommand)OpenLinkNewTab, "Open link in new tab"); 
     } 
    } 

    bool IContextMenuHandler.OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags) 
    { 
     return false; 
    } 

    void IContextMenuHandler.OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame) 
    { 
     if ((int)commandId == SaveImage) 
     { 
      OnSaveImage?.Invoke(this, new ImageSaveEventArgs(parameters.SourceUrl)); //ImageSaveEventArgs is just a class with one property that houses the source url of the image to download. 
     } 
    } 

    bool IContextMenuHandler.RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback) 
    { 
     return false; 
    } 
} 

次に、あなたがあなたのChromiumWebBrowserインスタンスを作成どこでも、あなたがこのような何か行うことができます。

ChromiumWebBrowser browser = new ChromiumWebBrowser(); 
MenuHandler menuHandler = new MenuHandler(); 
menuHandler.OnSaveImage += Handler_OnSaveImage; 
browser.MenuHandler = menuHandler; 

private void Handler_OnSaveImage(object sender, EventArgs e) 
{ 
    DownloadImage(((ImageSaveEventArgs)e).SourceUrl); 
} 

注意、これは内蔵のIContextMenuHandler得るために使用しての単なる一例ですユーザーが右クリックした内容、自分のイベントを処理して、必要な動作を実装することができます。この場合、URLからファイルをダウンロードすることができます。

MenuHandler.csCefSharpの詳細やその他の例については、GitHubのページをご覧ください。

+0

私のコードははるかに簡単で、すべての私の要件を満たしています。とにかく、ありがとう!私のC#コードはすでにJavaScriptについて混乱していました。 –

+0

@WorldBoss十分に公正です。私は 'WebBrowser'コントロール(http://stackoverflow.com/questions/36767938/obtain-child-anchor-element-within-webbrowser-control)を使用していて、徹底的に悲惨な時を過ごしたとき、私は過去に自分自身をロールバックしようとしました。 HTML文書に関しては、百万と一辺のケースがあるので、おそらく私がこれまで以上に解決したエンジンを使用することを好む。小さな要件があり、あなたがそれらに出会ったならば、自分自身を圧倒することは涼しいです! :-) – TEK

+0

リンクを共有してくれてありがとう! –

関連する問題