Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > target = "_blank" - не работает


Автор: transkriptsiya 17.8.2014, 16:50
Всем привет,

На форме есть контрол WebBrouser, который корректно открывает сайт. но если страничка сайта открывается на новом листе - то запускается интернет експлорер - что меня катигорически не устраивает - все должно быть на форме. Попытка добиться успеха вот так 
Код

 private void webBrowser1_NewWindow(object sender, System.ComponentModel.CancelEventArgs e)
        {
            webBrowser1.Navigate(webBrowser1.StatusText);
            e.Cancel = true;
        }

не помогла - открывает стартовую страницу- пару секунд думает - потом пишет что страница не доступна.

Код

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            webBrowser1.Navigate(@"C:\Users\Lena\Documents\Unnamed Site 2\MyBooks.html");
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {

            HtmlElementCollection a_tag = webBrowser1.Document.GetElementsByTagName("a");

            foreach (HtmlElement he in a_tag)
            {
                if (he.InnerHtml == "Заголовок")
                    he.InvokeMember("click");
            }

        }


        private void webBrowser1_NewWindow(object sender, System.ComponentModel.CancelEventArgs e)
        {
            webBrowser1.Navigate(webBrowser1.StatusText);
            e.Cancel = true;
        }

       
       
    }


вот так все ок
Код

<h1><a href="Untitled-1.html">Заголовок</a></h1>

а с  target="_blank" - уже не работает

Код

<h1><a href="Untitled-1.html" target="_blank">Заголовок</a></h1>


Автор: jonie 18.8.2014, 20:31
нууу уберите этот атрибут вообще вырезав его javascript-том, исполненым вашим браузером (как вариант).
Вот как выполнить:
Код


    object[] args = {....javascript here...};
    webBrowser1.Document.InvokeScript("eval",args);


а функцию вроде такой
Код

(function()
{
    var elems=document.getElementsByTagName('a');
    for (var i=0;i<elems.length;i++)
    {
        var attrTarget = elems[i].getAttribute('target') || '';
        if (attrTarget.indexOf('_blank')==0)
        {
            elems[i].removeAttribute('target');
        }
    }
})();

Автор: transkriptsiya 18.8.2014, 20:43
подскажите. webBrowser1.Document.GetElementsByTagName("a")
по тегу <а> ищет - а вот если подставить <h1> - то не работает почему-то 

Автор: diadiavova 18.8.2014, 22:44
Цитата(jonie @  18.8.2014,  21:31 Найти цитируемый пост)
нууу уберите этот атрибут вообще вырезав его javascript-том, исполненым вашим браузером (как вариант).
Вот как выполнить:

Зачем же такие сложности? Можно просто при загрузке документа обойти все гиперссылки и назначить атрибуту значение _self. 
Код

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
            {
                foreach (HtmlElement link in webBrowser1.Document.Links)
                {
                    link.SetAttribute("target", "_self");
                }
            }

        }

Автор: jonie 18.8.2014, 23:46
Цитата(diadiavova @  18.8.2014,  23:44 Найти цитируемый пост)

Зачем же такие сложности? Можно просто при загрузке документа обойти все гиперссылки и назначить атрибуту значение _self. 

я не уверен что это хорошо будет работать при всяческих вещах типа DOM маниупуляциях после ajax вызовов и т.д. Я привёл лишь простенький скрипт, конечно, в реальности он должен быть посложнее 8-)

Автор: diadiavova 19.8.2014, 00:45
Цитата(jonie @  19.8.2014,  00:46 Найти цитируемый пост)
я не уверен что это хорошо будет работать при всяческих вещах типа DOM маниупуляциях после ajax вызовов и т.д.

Я не думаю, что вопрос был об этом, но в принципе можно сделать что-то вроде такого
Код

       private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
            {
                webBrowser1.Document.Body.AttachEventHandler("onmousedown",
                    (object br, EventArgs ea) =>
                    {
                        dynamic win = webBrowser1.Document.Window.DomWindow;
                        dynamic element = win.@event.target;
                        dynamic link = element;
                        while (link.tagName != "A")
                        {
                            link = link.parentElement;
                            if (link.tagName == "BODY")
                            {
                                return;
                            } 
                        }
                        link.setAttribute("target", "_self");
                    });
            }

        }
То есть повесить на да документ обработчика мауздауна и проверять был ли он выполнен на ссылке, если ссылка найдена, то назначать ей таргет. Тут уже не важно была ли она сформирована после загрузки документа или нет. Но в любом случае, тут как не изголяйся, все равно возможны варианты, когда это не сработает.
Цитата(jonie @  19.8.2014,  00:46 Найти цитируемый пост)
привёл лишь простенький скрипт, конечно, в реальности он должен быть посложнее 8-)
Не знаю, мне такой способ взаимодействия с ДОМ не нравится. Его хорошо использовать, когда нет другого способа дотянуться до каких-то возможностей, ну например вызвать querySelector или еще что-то из новинок ие9, которые недоступны через ком-интерфейсы, а ради каких-то простых задач дергать инвоукскрипт smile 

Автор: jonie 19.8.2014, 10:46
Цитата(diadiavova @  19.8.2014,  01:45 Найти цитируемый пост)
Не знаю, мне такой способ взаимодействия с ДОМ не нравится. Его хорошо использовать, когда нет другого способа дотянуться до каких-то возможностей, ну например вызвать querySelector или еще что-то из новинок ие9, которые недоступны через ком-интерфейсы, а ради каких-то простых задач дергать инвоукскрипт 

ну вообще в js нынче и модно менять dom имхо. Я даже думаю что это работает быстрее и везде, не только в IE хосте (и не факт что завтра там что-нибудь не поменяют)...

Автор: transkriptsiya 21.8.2014, 22:29
Цитата
Код

Зачем же такие сложности? Можно просто при загрузке документа обойти все гиперссылки и назначить атрибуту значение _self. 

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
            {
                foreach (HtmlElement link in webBrowser1.Document.Links)
                {
                    link.SetAttribute("target", "_self");
                }
            }

        }

То что  доктор прописал. Большое спасибо!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)