web-dev-qa-db-fra.com

Contrôle WebBrowser et erreurs JavaScript

Lorsque j'accède à la page avec le navigateur (ie9), le rendu du navigateur est correct.

Lorsque j'utilise le contrôle WebBrowser, j'ai des erreurs JavaScript.

Je sais que je peux supprimer les erreurs de scripts, mais je veux qu'ils s'exécutent correctement, car ils affectent le rendu et la fonctionnalité de la page.

Comment puis-je résoudre ce problème ? Puis-je intégrer IE9 directement dans le formulaire Windows et utiliser des méthodes similaires comme avec le contrôle WebBrowser (naviguer, obtenir un identifiant, appeler un clic)?

Merci.

21
user689792

Ce que je ferais, c'est attribuer un objet à webbrowser.ObjectForScripting, puis injecter une fonction javascript qui attribue windown.onerror à un wrapper qui appelle le script externe dans l'application hôte. Comme:

window.onerror = function(message, url, lineNumber) 
{ 
  window.external.errorHandler(message, url, lineNumber);
}

Référez-vous à: http://notions.okuda.ca/2009/06/11/calling-javascript-in-a-webbrowser-control-from-c/

14
Alton Crossley

Vous pouvez utiliser la ligne de code suivante pour vous débarrasser de ces types d'erreurs:

webBrowser1.ScriptErrorsSuppressed = true;

Cela évitera les erreurs JavaScript.

9
mgokhanbakal

Si IE9 est installé, le WebBrowser utilisera toujours le mode IE7 à moins que vous ne remplaciez ce comportement par un paramètre de registre - comme décrit dans ceci réponse StackOverflow . C'est la cause la plus probable des erreurs JavaScript que vous obtenez dans le WebBrowser (car vous ne voyez pas les mêmes erreurs dans IE9).

Vous pouvez définir le paramètre de registre à l'aide du code c # suivant (qui définit le mode IE10 si Windows 8 est détecté) et en modifiant app-name.exe pour correspondre à votre propre application. Vous devez ajouter un gestionnaire d'erreurs pour le cas où les privilèges sont insuffisants (les privilèges d'administrateur sont requis pour écrire dans cette clé de registre).

string installkey = @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
string entryLabel = "app-name.exe";
System.OperatingSystem osInfo = System.Environment.OSVersion;

string version = osInfo.Version.Major.ToString() + '.' + osInfo.Version.Minor.ToString();
uint editFlag = (uint)((version == "6.2") ? 0x2710 : 0x2328); // 6.2 = Windows 8 and therefore IE10

RegistryKey existingSubKey = Registry.LocalMachine.OpenSubKey(installkey, false); // readonly key

if (existingSubKey.GetValue(entryLabel) == null)
{
     existingSubKey = Registry.LocalMachine.OpenSubKey(installkey, true); // writable key
     existingSubKey.SetValue(entryLabel, unchecked((int)editFlag), RegistryValueKind.DWord);
}
9
pgfearo

Je sais donc que le message est vieux, mais c'était un problème récent pour moi et j'ai dû faire de sérieux fouilles et sortir des sentiers battus.

fondamentalement comme la plupart des réponses ici - vous ne pouvez pas modifier le contrôle du navigateur Web pour utiliser le moteur le plus récent IE engine. Le mien utilise IE7 par défaut, j'ai vu des réponses qui modifient/ajoutent des éléments au registre, je suis toujours pas confortable en ce qui concerne le registre, une façon plus propre de résoudre ce problème serait d'ajouter du code sur votre site Web qui l'oblige à utiliser le moteur le plus récent IE sur n'importe quel PC et fonctionne comme un charme.

si vous avez accès au fichier web.config de la page que vous souhaitez parcourir, ajoutez simplement:

    <system.webServer>
<httpProtocol>
    <customHeaders>
        <clear />
        <add name="X-UA-Compatible" value="IE=Edge" />
    </customHeaders>
</httpProtocol>
</system.webServer>

et votre site forcerait le contrôle du navigateur Web à exécuter le moteur IE le plus récent sur votre ordinateur. D'autres options se trouvent ici:

https://www.leapinggorilla.com/Blog/Read/1016/ie-ate-my-css---disabling-compatability-mode

Je dois dire que cela ne fonctionnera que si vous avez accès à la page/web.config du site Web/de l'application auquel vous essayez d'accéder - ce qui était mon cas.

7
Dannie Adia

Le contrôle WebBrowser utilise IE7. Donc, s'il y a un problème, votre script ne fonctionne pas pour IE7 et vous devrez le résoudre.

Vous ne pouvez pas intégrer IE9 car cela dépend de son installation sur l'ordinateur et tout le monde n'a pas installé IE9.

3
Oskar Kjellin

Pour aider quiconque pourrait avoir ce problème, j'ai essayé toutes ces choses et rien n'a fonctionné pour moi. Voici ce qui fonctionne. Je ne suis pas sûr exactement ce qui cause cette erreur, mais apparemment, lorsque vous appuyez simplement sur "F5" dans VS pour déboguer votre application, il exécute YourProject.vshost.exe comme nom de processus. Si vous exécutez la même application à partir de la ligne de commande, elle apparaîtra comme YourProject.exe et les erreurs javascript disparaissent. Je pense que IE voit l'application exécutant le visa via VSHOST et décide que c'est louche et désactive le chargement de javascript.

Alors ... allez dans les paramètres de votre projet pour votre exécutable. Sélectionnez les options "Déboguer". Sélectionnez "Démarrer le programme externe". Recherchez et sélectionnez Debug\YourProgram.exe (PAS YourProgram.vshost.exe). Enregistrez, recompilez et appuyez sur F5.

Tout devrait fonctionner comme d'habitude maintenant, et Visual Studio s'attache même automatiquement au processus pour vous.

Prendre plaisir!

Grego

2
Grego The Ancient