Аксесс веб браузер ошибка сценария
Я создаю форму Access 2010 с веб-браузером, который содержит данные о погоде. Я получаю ошибку скрипта во время выполнения: "объект не поддерживает свойство или метод 'attachEvent'". Я все еще могу использовать веб-браузер и форму, но эта ошибка-просто неприятность, так как пользователю придется очищать ее каждый раз, когда форма загружается. Эта ошибка, по-видимому, связана с кнопкой share option на веб-странице, которая, похоже, не поддерживается Access 2010.
Есть ли способ обойти эту ошибку? Я добавил код vba
на форме и подформе во время событий OnLoad и после обновления, но это не игнорировало предупреждение. Любая помощь будет оценена по достоинству.
1 ответ
У нас есть веб-приложение , которое можно протестировать с помощью Selenium , но этого недостаточно, потому что веб-приложение будет использоваться внутри приложения WinForms с помощью элемента управления веб-браузером . Приложение WinForms взаимодействует с содержимым страницы, размещенной внутри.
Я все понял. Я использовал следующий код VBA для подавления ошибок:
Похожие вопросы:
Мне нужна кнопка обновления (чтобы обновить веб-страницу) для моего приложения веб-браузера для windows phone 7. Кто-нибудь может мне в этом помочь? Мой элемент управления веб-браузером называется.
В моем приложении windows phone 7 у меня есть элемент управления веб-браузером (названный Holder ), в котором, если пользователь GotFocus находится в элементе управления браузером, то я хочу скрыть.
Каковы ограничения управления веб-браузером WPF? Достаточно ли он хорош для реальной реализации браузера? И является ли это полностью управляемой реализацией?
У нас есть веб-приложение , которое можно протестировать с помощью Selenium , но этого недостаточно, потому что веб-приложение будет использоваться внутри приложения WinForms с помощью элемента.
Я поместил элемент управления веб-браузером на свою форму и пытаюсь изменить его размер при изменении размера окна. Однако кажется, что элемент управления веб-браузером заблокирован, и даже на.
Есть ли возможность назначить строку агента пользователя элементу управления веб-браузером в winforms или wpf? например, у меня есть 3 различных элемента управления веб-браузером, и каждый из них.
У меня есть элемент управления веб-браузером в моем проекте. Отлично работает! Однако если я потеряю соединение с интернетом, то открою проект, IE откроется и покажет стандартную веб-страницу не.
У меня есть диалоговое приложение VC++ MFC с элементом управления веб-браузером ActiveX. Чего я в конечном счете хочу добиться, так это запретить действие щелчка по ссылкам на веб-странице.
ScriptErrorsSuppressed включен для WebBrowser.
ну.. раз уж WebBrowser а не WebView (как WPF и UWP) то WinForms.. кстати, стоит сразу уточнять подобные нюансы ;)
дело в том, что в формах, и в WPF - это старый, "добрый", "ослик" (IE, я даже не знаю когда и почему его стали звать "осликом", но какие то годы, это было весьма распространено).. (и ради бога - если у вас вин 10 - не путайте с Edge. только в UWP контроле WebView используется движок Edge, и все что ниже НЕ о нем)
.. ну и раз уж это IE. то:
1 - для начала проверьте сайт в IE той же системы, где разрабатываете и дебажите программу. если вдруг в "просто" IE, сайт отрабатывает вполне себе адекватно.. см пункт 2 .. если нет.. проверьте в Хроме, и читайте п3.. или ругайтесь с создателями сайта и/или с МС..
2 - у "встраиваемого" IE есть особенность (была до последних лет точно) - "опускать" себя на пару версий. это может показаться диким, но это был тактический ход, для обеспечения совместимости огромного количества корпоративного софта.. дальше я немного расскажу об этом..
- гуглите про ветку реестра HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION - что и как в нее писать. досадное неудобство, состоит в том, что каждый экзешник, который пользует именно IE, но хочет новейшие фичи - надо там прописать
- .. что еще досаднее, если вы планируете распространять свое творение (прогу) то ее надо будет обучить самопрописке (освоить работу с реестром)
. в любом случае копать вам в эту сторону
ну и - UWP с Edge.. для винды оч даже хороший выбор ;))). полный сапорт в МСДН. опять же короткий путь на витрину "магазина МС". и ни каких "корпоративных" заморочек с версионностью движка. ;)))
плохая новость. ваша ссылка из текста вопроса - в "осле" 10ки (классическом IE) без всякого ограничения версионности - работает не адекватно.. так что либо ругачки с разрабами сайта/МС.. либо смена инструмента. WinForms/WPF с дефолтным контролом - вам не помогут..
Ошибки — это хорошо. Автор материала, перевод которого мы сегодня публикуем, говорит, что уверен в том, что эта идея известна всем. На первый взгляд ошибки кажутся чем-то страшным. Им могут сопутствовать какие-то потери. Ошибка, сделанная на публике, вредит авторитету того, кто её совершил. Но, совершая ошибки, мы на них учимся, а значит, попадая в следующий раз в ситуацию, в которой раньше вели себя неправильно, делаем всё как нужно.
Код демонстрационного проекта, используемого в данном материале, можно найти в этом репозитории.
1. Ошибки в JavaScript и универсальные способы работы с ними
Если в вашем коде что-то пошло не так, вы можете воспользоваться следующей конструкцией.
В ходе выполнения этой команды будет создан экземпляр объекта Error и будет сгенерировано (или, как говорят, «выброшено») исключение с этим объектом. Инструкция throw может генерировать исключения, содержащие произвольные выражения. При этом выполнение скрипта остановится в том случае, если не были предприняты меры по обработке ошибки.
Начинающие JS-программисты обычно не используют инструкцию throw . Они, как правило, сталкиваются с исключениями, выдаваемыми либо средой выполнения языка, либо сторонними библиотеками. Когда это происходит — в консоль попадает нечто вроде ReferenceError: fs is not defined и выполнение программы останавливается.
▍Объект Error
У экземпляров объекта Error есть несколько свойств, которыми мы можем пользоваться. Первое интересующее нас свойство — message . Именно сюда попадает та строка, которую можно передать конструктору ошибки в качестве аргумента. Например, ниже показано создание экземпляра объекта Error и вывод в консоль переданной конструктором строки через обращение к его свойству message .
Второе свойство объекта, очень важное, представляет собой трассировку стека ошибки. Это — свойство stack . Обратившись к нему можно просмотреть стек вызовов (историю ошибки), который показывает последовательность операций, приведшую к неправильной работе программы. В частности, это позволяет понять — в каком именно файле содержится сбойный код, и увидеть, какая последовательность вызовов функций привела к ошибке. Вот пример того, что можно увидеть, обратившись к свойству stack .
▍Генерирование и обработка ошибок
Создание экземпляра объекта Error , то есть, выполнение команды вида new Error() , ни к каким особым последствиям не приводит. Интересные вещи начинают происходить после применения оператора throw , который генерирует ошибку. Как уже было сказано, если такую ошибку не обработать, выполнение скрипта остановится. При этом нет никакой разницы — был ли оператор throw использован самим программистом, произошла ли ошибка в некоей библиотеке или в среде выполнения языка (в браузере или в Node.js). Поговорим о различных сценариях обработки ошибок.
▍Конструкция try. catch
Блок try. catch представляет собой самый простой способ обработки ошибок, о котором часто забывают. В наши дни, правда, он используется гораздо интенсивнее чем раньше, благодаря тому, что его можно применять для обработки ошибок в конструкциях async/await .
Этот блок можно использовать для обработки любых ошибок, происходящих в синхронном коде. Рассмотрим пример.
Если бы в этом примере мы не заключили бы сбойную команду console.log(b) в блок try. catch , то выполнение скрипта было бы остановлено.
▍Блок finally
Иногда случается так, что некий код нужно выполнить независимо от того, произошла ошибка или нет. Для этого можно, в конструкции try. catch , использовать третий, необязательный, блок — finally . Часто его использование эквивалентно некоему коду, который идёт сразу после try. catch , но в некоторых ситуациях он может пригодиться. Вот пример его использования.
▍Асинхронные механизмы — коллбэки
Программируя на JavaScript всегда стоит обращать внимание на участки кода, выполняющиеся асинхронно. Если у вас имеется асинхронная функция и в ней возникает ошибка, скрипт продолжит выполняться. Когда асинхронные механизмы в JS реализуются с использованием коллбэков (кстати, делать так не рекомендуется), соответствующий коллбэк (функция обратного вызова) обычно получает два параметра. Это нечто вроде параметра err , который может содержать ошибку, и result — с результатами выполнения асинхронной операции. Выглядит это примерно так:
Если в коллбэк попадает ошибка, она видна там в виде параметра err . В противном случае в этот параметр попадёт значение undefined или null . Если оказалось, что в err что-то есть, важно отреагировать на это, либо так как в нашем примере, воспользовавшись командой return , либо воспользовавшись конструкцией if. else и поместив в блок else команды для работы с результатом выполнения асинхронной операции. Речь идёт о том, чтобы, в том случае, если произошла ошибка, исключить возможность работы с результатом, параметром result , который в таком случае может иметь значение undefined . Работа с таким значением, если предполагается, например, что оно содержит объект, сама может вызвать ошибку. Скажем, это произойдёт при попытке использовать конструкцию result.data или подобную ей.
▍Асинхронные механизмы — промисы
В результате можно порекомендовать всегда, при работе с промисами, использовать блок catch . Взглянем на пример.
▍Асинхронные механизмы и try. catch
После того, как в JavaScript появилась конструкция async/await , мы вернулись к классическому способу обработки ошибок — к try. catch. finally . Обрабатывать ошибки при таком подходе оказывается очень легко и удобно. Рассмотрим пример.
При таком подходе ошибки в асинхронном коде обрабатываются так же, как в синхронном. В результате теперь, при необходимости, в одном блоке catch можно обрабатывать более широкий диапазон ошибок.
2. Генерирование и обработка ошибок в серверном коде
Теперь, когда у нас есть инструменты для работы с ошибками, посмотрим на то, что мы можем с ними делать в реальных ситуациях. Генерирование и правильная обработка ошибок — это важнейший аспект серверного программирования. Существуют разные подходы к работе с ошибками. Здесь будет продемонстрирован подход с использованием собственного конструктора для экземпляров объекта Error и кодов ошибок, которые удобно передавать во фронтенд или любым механизмам, использующим серверные API. Как структурирован бэкенд конкретного проекта — особого значения не имеет, так как при любом подходе можно использовать одни и те же идеи, касающиеся работы с ошибками.
В качестве серверного фреймворка, отвечающего за маршрутизацию, мы будем использовать Express.js. Подумаем о том, какая структура нам нужна для организации эффективной системы обработки ошибок. Итак, вот что нам нужно:
▍Разработка собственного конструктора объектов ошибок
Вот как выглядит класс CustomError , код которого оформлен в виде модуля.
▍Маршрутизация
Теперь, когда наш объект ошибки готов к использованию, нужно настроить структуру маршрутов. Как было сказано выше, нам требуется реализовать унифицированный подход к обработке ошибок, позволяющий одинаково обрабатывать ошибки для всех маршрутов. По умолчанию фреймворк Express.js не вполне поддерживает такую схему работы. Дело в том, что все его маршруты инкапсулированы.
Если на данном этапе происходящие кажется вам непонятным — не беспокойтесь — просто продолжайте читать, пробуйте работать с тем, о чём идёт речь, и постепенно вы во всём разберётесь. На самом деле, если говорить о компьютерном обучении, здесь применяется подход «сверху-вниз», когда сначала обсуждаются общие идеи, а потом осуществляется переход к частностям.
Вот как выглядит код обработчика маршрутов.
Полагаем, комментарии в коде достаточно хорошо его поясняют. Надеемся, читать их удобнее, чем объяснения подобного кода, данные после него.
Теперь взглянем на файл маршрутов.
В этих примерах с самими запросами ничего не делается. Тут просто рассматриваются разные сценарии возникновения ошибок. Итак, например, запрос GET /city попадёт в функцию const GET = req =>. , запрос POST /city попадёт в функцию const POST = req =>. и так далее. Эта схема работает и при использовании параметров запросов. Например — для запроса вида GET /city?startsWith=R . В целом, здесь продемонстрировано, что при обработке ошибок, во фронтенд может попасть либо общая ошибка, содержащая лишь предложение попробовать снова или связаться с владельцем сервера, либо ошибка, сформированная с использованием конструктора CustomError , которая содержит подробные сведения о проблеме.
Данные общей ошибки придут в клиентскую часть приложения в таком виде:
Конструктор CustomError используется так:
Это даёт следующий JSON-код, передаваемый во фронтенд:
Теперь, когда мы основательно потрудились над серверной частью приложения, в клиентскую часть больше не попадают бесполезные логи ошибок. Вместо этого клиент получает полезные сведения о том, что пошло не так.
Не забудьте о том, что здесь лежит репозиторий с рассматриваемым здесь кодом. Можете его загрузить, поэкспериментировать с ним, и, если надо, адаптировать под нужды вашего проекта.
3. Работа с ошибками на клиенте
Теперь пришла пора описать третью часть нашей системы обработки ошибок, касающуюся фронтенда. Тут нужно будет, во-первых, обрабатывать ошибки, возникающие в клиентской части приложения, а во-вторых, понадобится оповещать пользователя об ошибках, возникающих на сервере. Разберёмся сначала с показом сведений о серверных ошибках. Как уже было сказано, в этом примере будет использована библиотека React.
▍Сохранение сведений об ошибках в состоянии приложения
Следующее, с чем надо разобраться, заключается в том, что ошибки одного типа нужно показывать в одном стиле. По аналогии с сервером, здесь можно выделить 3 типа ошибок.
Здесь будет использоваться встроенная в React система управления состоянием приложения, но, при необходимости, вы можете воспользоваться и специализированными решениями для управления состоянием — такими, как MobX или Redux.
▍Глобальные ошибки
Теперь взглянем на код, который хранится в файле Application.js .
Как видно, в состоянии, в Application.js , имеется место для хранения данных ошибки. Кроме того, тут предусмотрены методы для сброса этих данных и для их изменения.
Обратите внимание на строку if (!this.props.error) return null . Она указывает на то, что при отсутствии ошибки компонент ничего не выводит. Это предотвращает постоянный показ красного прямоугольника на странице. Конечно, вы, при желании, можете поменять внешний вид и поведение этого компонента. Например, вместо того, чтобы сбрасывать ошибку по нажатию на x , можно задать тайм-аут в пару секунд, по истечении которого состояние ошибки сбрасывается автоматически.
▍Обработка специфических ошибок, возникающих при выполнении запросов
Тут используется тот же принцип, который мы применяли при работе с глобальными ошибками. Только сведения о таких ошибках хранятся в локальном состоянии соответствующих компонентов. Работа с ними очень похожа на работу с глобальными ошибками. Вот код файла SpecificErrorReq.js .
▍Ошибки, возникающие в клиентской части приложения
В поле ничего нет, мы сообщаем об этом пользователю
Вот код файла SpecificErrorFrontend.js , реализующий вышеописанный функционал.
Я работаю со встроенным (Active X?) Экземпляром IE в приложении VB6.
Браузер отображает демографическую информацию на основе выбранного человека (отображается в виде списка).
Все работает отлично, пока я не попытаюсь быстро выбрать разных людей из списка (нажимая случайно на разных людей так быстро, как я могу). После нескольких кликов получите две ошибки.
Первая - это Ошибка сценария Internet Explorer "
Произошла ошибка в скрипте на этой странице
Линия :
Char :
Ошибка:
Код:
URL: Вы хотите продолжить запуск скриптов на этой странице? да | Нет
(Строка, Char, Ошибка, Код, URL - все пустые).
Вторая ошибка выскакивает прямо над первой.
В этом диалоговом окне произошла ошибка
Ошибка: 53 «Отказано в доступе »
Любой совет о том, как отладить / разрешить / избежать проблемы, был бы очень признателен.
ИЗМЕНИТЬ
Вот изображение ошибки
ИЗМЕНИТЬ
Я получаю анонимную функцию JScript. Источник не доступен, когда мне удается обнаружить ошибку.
ИЗМЕНИТЬ
Я успешно поймал некоторые ошибки. Похоже, что они происходят в основном из MicrosoftAjax.js
- Происходит последовательно: MicrosoftAjax.js - Sys._Application.callBaseMethod (this, "initialize"); Ожидаемый объект
- Произошло однажды: ожидается объект jquery-1.4.2.min.js - b.InsertBefore (d, b.firstChild)
- Произошло однажды: Исключение нехватки памяти.
4 ответа
После долгих испытаний и попыток выяснить, действительно ли мне нужно отредактировать файл MicrosoftAjax.js для решения проблемы, я наконец нашел решение, которое, похоже, решило проблему.
В заголовок любого приложения, которое я загружал через iFrames, а также на родительскую страницу. Прошло около двух дней с тех пор, как я внес эти изменения, и пока все хорошо (хотя мне понадобится еще несколько дней тестирования, чтобы подтвердить, что он работает на 100%).
Я пытался сделать это раньше, но безуспешно, но это было связано с положением Писания. У меня были другие скрипты (такие как jQuery и MicrosoftAjax), которые были расположены перед ним. Эти скрипты выдавали ошибки еще до того, как мой скрипт window.onerror был оценен.
Другая интересная вещь заключается в том, что ошибки iFrame, кажется, всплывают независимо от обработки ошибок на родительской странице. Поэтому я вошел в наш репозиторий Code и внес необходимые изменения в каждое из приложений, которые я загружал.
Наконец, я хочу сказать спасибо @Jacob за его первоначальную помощь в устранении этой проблемы.
ИЗМЕНИТЬ
Читайте также: