如何禁用WebBrowser中的每个导航

本文关键字:导航 何禁用 WebBrowser | 更新日期: 2023-09-27 18:05:37

我有一个WebBrowser控件,我根据用户输入动态刷新/更改url。我不想让用户导航,所以我将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(对象发送者,

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

还是不行。请帮我找出我的代码的问题

如何禁用WebBrowser中的每个导航

如果您可以控制页面的加载,您可以抓取页面的文本并更改代码以禁用流氓脚本。您展示的那个可以简单地删除。当然,你可能要预见的不止一个……

显然,如果你可以完全不使用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;
}

注意:根据这篇文章,你不能像人们想象的那样自由地设置DocumentText;可能是个bug…您也可以将(*)行移动到类级别,而不是每次都创建虚拟对象。然后,无论你做了多少修改,你总是有一个未修改的版本,用户可以保存在某处…