9 votes

Comment empêcher WebView d'ouvrir des liens sur le navigateur dans WinRT ( target=_blank links ) ?

J'ai une WebView dans mon application et je ne peux pas changer le fichier html (type de lien "target=_blank"). Mais certains liens sur la page font que mon application les ouvre dans le navigateur du système. Comment puis-je empêcher cette action ?

Merci.

10voto

Aliaksandr Hmyrak Points 289

Dans le gestionnaire d'événement NavigationCompleted, exécutez ce script :

webView.InvokeScriptAsync("eval", new[]
            {
                @"(function()
                {
                    var hyperlinks = document.getElementsByTagName('a');
                    for(var i = 0; i < hyperlinks.length; i++)
                    {
                        if(hyperlinks[i].getAttribute('target') != null)
                        {
                            hyperlinks[i].setAttribute('target', '_self');
                        }
                    }
                })()"
            });

10voto

Kiewic Points 2863

Sous Windows 10, vous pouvez utiliser WebView.NewWindowRequested :

private void WebView1_NewWindowRequested(
    WebView sender,
    WebViewNewWindowRequestedEventArgs args)
{
    Debug.WriteLine(args.Uri);
    args.Handled = true; // Prevent the browser from being launched.
}

1voto

user1985513 Points 441

Il existe un événement de démarrage de la navigation. Il possède une propriété cancel qui peut être utilisée pour annuler la navigation. Peut-être cela fonctionnera-t-il pour vous ?

http://msdn.microsoft.com/en-us/library/Windows/apps/Windows.ui.xaml.controls.webview.navigationstarting

1voto

Andrey Ashikhmin Points 1810

Je suis tombé sur ce site récemment, et je tiens à ajouter que même si les de l'utilisateur2269867 est une solution viable, mais elle peut ne pas fonctionner dans certaines situations.

Par exemple, le navigateur du système ne s'ouvrira pas seulement si l'utilisateur clique sur un lien avec l'attribut target="_blank", mais aussi si la fonction window.open() est appelée en javascript. En outre, même la suppression de tous les attributs "target" ne fonctionnera pas si une page charge du contenu dynamiquement et modifie le DOM après que votre script a déjà fini de s'exécuter.

Pour résoudre tous les problèmes ci-dessus, vous devez surcharger la fonction window.open et vérifier l'attribut 'target' non pas une fois, mais à chaque fois que l'utilisateur clique sur quelque chose. Voici un script qui couvre ces cas :

function selfOrParentHasAttribute(e, attributeName) {
    var el = e.srcElement || e.target;

    if (el.hasAttribute(attributeName)) {
        return el;
    }
    else {
        while (el = el.parentNode) {
            if (el.hasAttribute(attributeName)) {
                return el;
            }
        }
    }

    return false;
}

var targetAttributeName = "target";

document.addEventListener("click", function (e) {
    var el = selfOrParentHasAttribute(e, targetAttributeName);

    if (el) {
        if ((el.getAttribute(targetAttributeName) == "_blank") ||
            (el.getAttribute(targetAttributeName) == "_new"))
        {
             el.removeAttribute(targetAttributeName);
        }
}
});

window.open = function () {
    return function (url) {
        window.location.href = url;
    };
}(window.open);

Mes compétences en js ne sont pas idéales, alors n'hésitez pas à les modifier. N'oubliez pas non plus que, comme kiewic mentionnée Pour Windows 10, il existe l'événement WebView.NewWindowRequested qui résout ce problème de manière plus naturelle.

0voto

Jake Bock Points 33

Si vous souhaitez simplement afficher la page et ne permettre aucune action sur cette page, je me tournerais vers WebViewBrush. Le WebViewBrush fait une capture d'écran du site web et les utilisateurs ne peuvent pas utiliser de liens ou quoi que ce soit d'autre sur cette page, qui devient alors une page en lecture seule. Je crois que c'est ce que vous demandez.

Plus d'informations sur WebViewBrush sont disponibles ici : http://msdn.microsoft.com/en-us/library/Windows/apps/Windows.ui.xaml.controls.webviewbrush

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X