如何禁用WebBrowser中的每个导航?

时间:2014-05-29 09:34:10

标签: c# winforms hyperlink browser

我有WebBrowser控件,我根据用户输入动态刷新/更改网址。我不想让用户导航,因此我将AllowNavigation设置为false。这似乎没问题,但是下面的链接仍然是"活跃":

<a href=# onClick="javascript:window.close()">Close Page</a>

这里的问题是:如果用户点击它,并在弹出窗口中确认关闭,我就不能再管理WebBrowser了。虽然最后一页仍然可见但看起来它已关闭。此外,我无法删除此链接,因为该网站不是由我管理的。

禁用控件?不,我必须允许用户突出显示并复制网页上的文字。 我还有其他选项可以禁用字面上的所有链接吗?

@TaW:这是我的代码基于你的。所以我必须从我的代码中设置url并调用自定义的URL:

button_click()
{
    webBrowser1_load_URL("http://website/somecheck.php?compname=" + textBoxHost.Text);
}

这是功能:

private void webBrowser1_load_URL(string url)
{
    string s = GetDocumentText(url.ToString());
    s = s.Replace(@"javascript:window.close()", "");
    webBrowser1.AllowNavigation = true;
    webBrowser1.DocumentText = s;
}

剩下的就是你答案中的内容:     private void webBrowser1_DocumentCompleted(object sender,

WebBrowserDocumentCompletedEventArgs e)
{
    webBrowser1.AllowNavigation = false;
}
public string GetDocumentText(string s)
{
    WebBrowser dummy = new WebBrowser(); //(*)
    dummy.Url = new Uri(s);
    return dummy.DocumentText;
}

仍然无法正常工作。请帮我用我的代码发现问题。

1 个答案:

答案 0 :(得分:1)

如果您可以控制页面的加载,则可以获取页面文本并更改代码以禁用流氓脚本。您展示的那个可以简单地删除。当然,你可能不得不更多地预测..

显然,如果你可以完全不使用javascript,这可以放宽,但如果那不是一个选项,那就去那些做真实或伪导航的人。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
  webBrowser1.AllowNavigation = false;
}

private void loadURL_Click(object sender, EventArgs e)
{
  webBrowser1.AllowNavigation = true;
  string s = File.ReadAllText(textBox_URL.Text);
  s = s.Replace("javascript:window.close()", "");
  webBrowser1.DocumentText = s;
}

如果页面不在文件系统中,则应该使用相同的技巧,例如将URL加载到虚拟WebBrowser中,如下所示:

private void cb_loadURL_Click(object sender, EventArgs e)
{
    string s = GetDocumentText(tb_URL.Text);
    s = s.Replace("javascript:window.close()", "");
    webBrowser1.AllowNavigation = true;
    webBrowser1.DocumentText = s;
}

public string GetDocumentText(string s) 
{ 
    WebBrowser dummy = new WebBrowser(); //(*)
    dummy.Url = new Uri(s);
    return dummy.DocumentText;
}

注意:根据this帖子,您不能像人们想象的那样自由地设置DocumentText;可能是一个错误..每次你也可以将(*)行移动到类级别,而不是创建虚拟。然后,无论您需要进行多少更改,您将始终拥有未更改的版本,用户可以例如保存在某个地方..