Предотвратить остановку JavaScript при обнаружении ошибки

Наш продукт вставляет скрипт в веб-сайты клиента, что-то вроде живого чата.

Часто клиенты & apos; на сайтах есть глючный javascript, который также останавливает наш код (браузер останавливает выполнение при возникновении ошибок). Есть ли способ заставить наш код по-прежнему выполняться, даже если в консоли есть ошибки, связанные с неопределенными методами или переменными?

Спасибо за вашу помощь.

 Fabrício Matté31 мая 2012 г., 02:27
Я не думаю, что вы должны присматривать за клиентами места. Если их сайты глючат, это их собственная проблема. Это также мотивирует их на фактическое исправление кода вместо добавления обходного пути после обходного пути.
 Chris Tonkinson31 мая 2012 г., 02:27
@AlfalfaStrange близко, но это не похоже на общий провал, и больше похоже на фактический взрыв. :-) +1
 CD Smith31 мая 2012 г., 02:25
Вроде как, когда двигатель самолета выходит из строя, нет способа просто заставить его продолжать работать
 Chris Tonkinson31 мая 2012 г., 02:25
Теоретически, нет, если вы не запустите свой скрипт перед чем-либо еще на странице (что обычно невозможно или даже желательно).
 ThiefMaster♦31 мая 2012 г., 02:51
@ D3mon-1stVFW: Вы серьезно относитесь к этому? Апплет? У нас 2012, а не 2000. Но да, не тратьте время на то, чтобы ваши вещи работали на сломанных сайтах. Если они хотят этого, они должны исправить свои вещи.

Ответы на вопрос(5)

iframe на их страницу вместо того, чтобы пытаться ввести код, используяscript пометить так:http://jsfiddle.net/EzMGD/ Обратите внимание, как скрипт выдает ошибку, но мы все еще можем видеть содержимое в iframe. Iframe должен помогать от использования переменных друг друга, если это применимо.

<script>
    MeaningOfLife();
</script>

<iframe src="http://bing.com"></iframe>​

Или введите код, чтобы он был самым первым или самым последнимscript.

 31 мая 2012 г., 03:25
Проблема в том, что вы можете легко и быстро столкнуться с ограничениями на использование файлов cookie сторонних производителей и междоменными политиками безопасности ... это делает разработку iframe для чего-то более умного, чем социальный значок, абсолютной болью.
Решение Вопроса

Как уже говорили другие, продолжение после ошибки может быть не лучшим решением, но вы можете попробовать это:

function ignoreerror()
{
   return true
}
window.onerror=ignoreerror();

ПодробнееВот

The onerror event fires whenever an JavaScript error occurs (depending on your browser configuration, you may see an error dialog pop up). The onerror event is attached to the window object, a rather unusual place to take refuge in, but for good reason. It is attached this way so it can monitor all JavaScript errors on a page, even those in the section of the page.

У Opera есть страница сбольше деталей

Browsers supporting window.onerror
Chrome 13+
Firefox 6.0+
Internet Explorer 5.5+
Opera 11.60+
Safari 5.1+
 31 мая 2012 г., 03:24
Обратите внимание на документы MDN: & quot; Обратите внимание, что некоторые / многие события ошибок не вызывают window.onerror, вы должны специально их прослушивать. & Quot; (developer.mozilla.org/en/DOM/window.onerror)
 03 сент. 2015 г., 20:57
Я обнаружил, что window.onerror все еще заставляет код перестать выполняться. Кажется, все, что возвращает true, - это исключение исключения из консоли. Следующий код (протестированный в Chrome 42 и IE 10) иллюстрирует мою точку зрения: window.onerror = function () {return true;}; var s = & quot ;; s.push (& Quot, H & Quot;); оповещение (& Quot; тест & Quot;); Ошибка подавлена, но код предупреждения никогда не достигается.

Короткий ответ: вы действительно не можете.

"Solution" #1: Вы можете настаивать на том, чтобы ваш сторонний код запускался раньше всех. В большинстве случаев это невозможно или даже желательно.

"Solution" #2: Вы можете настаивать на том, чтобы сторонние инженеры упаковывали весь сторонний код вtry/catch блоки. Но это решение действительно не дает вам никакой гарантии, потому что очень часто сторонние библиотеки прилагают дополнительные<script> теги на странице - они не подпадают под «юрисдикцию» изtry/catch область действия, включающая код, который создал этот / эти теги.

"Solution" #3: Вы можете создать свое приложение полностью в рамках<iframe>, тем самым избегая вопроса полностью. К сожалению, даже если вы очень умны, вы быстро столкнетесь с междоменными нарушениями, ограничениями сторонних файлов cookie и т. П. Весьма вероятно, что это не сработает для вас.

"Solution" #4: Вы могли бы объяснить эту проблему своему клиенту и потребовать, чтобы другой сторонний код выполнялся корректно. Я говорю, что это «решение» потому что, честно говоря, это не "решение" на ваш вопрос, если ваш вопросhow to avoid doing exactly this.

К сожалению, вариант № 4 - ваш лучший выбор. Это может помочь, если вы наблюдаете, как другие сторонние библиотеки «ломаются»; таким же образом: вы можете сказать своему клиенту: «Эй, это не только я - X, Y и Z все также» сломаны ». из-за & lt; имени другой сторонней библиотеки & gt;. & quot; Это может привести к тому, что они разогреют нарушающий код, что делает Интернет более счастливым местом для всех участников.

 31 мая 2012 г., 03:15
Тщательный ответ.
 xd4428 июл. 2012 г., 12:54
Спасибо Крис! Хороший совет.
 16 окт. 2017 г., 17:21
Таким образом, оборачивая функции в «закрытие»; лайк$(function() { function myLibraryFunction() {...} } не поможет и изолировать выполнение кода, как это изолирует имена функций и переменных?

element = document.querySelector('.that-pretty-element');
if (element != null) {
    element.onclick = function () {
        alert(" I'm working beibi ;) ");
    }
}

querySelector() возвращаетсяfalseИтак, мы можем проверить сif's

try/catch для сомнительных частей сценария.

Ваш ответ на вопрос