Игнорировать ошибки синтаксиса JavaScript на странице и продолжить выполнение сценария

44

Я разрабатываю плагины для WordPress. Он использует некоторые jquery в пользовательской части (темы) как плагин jquery. Проблема в том, что когда есть ошибка javascript с другими плагинами, сделанными другими авторами, мой javascript моего плагина не может выполнить.

И самое страшное, что люди считают, что есть серьезная ошибка в моем плагине, даже если он работает на 100% отлично с условными заявлениями об обработке ошибок. Но на самом деле это связано с некоторыми другими синтаксическими ошибками javascript некоторых других авторов плагинов/тем WP.

Есть ли способ продолжить выполнение моего плагина JS, игнорируя другие ошибки JS. Или у меня есть предложения по решению этой проблемы?

Изображение 194

  • 3
    Вы хотите, но всегда есть попытка / поймать ??
  • 20
    Вы не можете поймать то, что не ваше.
Показать ещё 4 комментария
Теги:
plugins

10 ответов

22

Попробуйте:

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

То есть, если вы можете включить это до того, как был выполнен прослушанный script.

8

Вы должны исправить старую ошибку JavaScript, потому что это может создать много проблем, а не сейчас, но в следующий раз.

Поместите свой файл/код JavaScript вверху (перед тем как JS получит ошибку) и вызовите его перед JavaScript, выполняемым другим кодом JavaScript.

Если вам нужно обработать исключение JavaScript во время выполнения, лучшим вариантом является

try { /* run js code */ } 
    catch (error){ /* resolve the issue or bug */ }
  • 5
    На самом деле, проблема создана JS-файлом другого автора. Так что я не знаю, как попытаться поймать его, и в WP есть много плагинов, и сначала трудно загрузить мой плагин.
  • 1
    Это действительно полезно.
Показать ещё 1 комментарий
4

Вы можете усвоить любую ошибку, используя событие error:

$(window).error(function(e){
    e.preventDefault();
});

Я никогда не пытался этого, но он должен работать теоретически.

Следует отметить, что это, вероятно, не является отличным решением вашей проблемы. Возможно, ваш плагин мешает другим плагинам. Конечно, возможно, что ошибки не являются вашими ошибками, но, вообще говоря, (с публично выпущенными плагинами) не так.

  • 1
    api.jquery.com/error - это устарело, и в любом случае, рекомендуется не использовать это против окна.
3

Я столкнулся с одной и той же проблемой: существует множество плагинов, которые делают слишком много предположений и вызывают ошибки JavaScript на ВАШЕЙ странице, даже когда вы являетесь хорошим гражданином; эти ошибки не имеют никакого отношения к вашему плагину.

Нет смысла пытаться обрабатывать ошибки в других плагинах - ИМО лучше быть самодостаточным, но устойчивым к их ошибкам.

В моем случае ошибки останавливали событие готовности DQLOM, и мой код инициализации JavaScript не выполнялся. Точная форма ошибки не важна, хотя решение - это просто запустить несколько событий.

Решение для меня состояло в том, чтобы иметь резервные копии, а не полагаться на событие готовности JQuery DOM:

  • Я завернул любой код, который я хотел запустить в готовом событии DOM, в свою собственную функцию - например. my_hardened_init_action();
  • Я добавил функцию my_hardened_init(), которая запускается только один раз. Он вызывает my_hardened_init_action() при первом вызове и ничего не делает при последующих вызовах.
  • Я добавил различные методы для вызова my_hardened_init() в нижнем колонтитуле WordPress. В моем случае мне было только два. Сначала попробуйте обычный jQuery DOM init, но вернемся к простому setTimeout(). Поэтому, если jQuery DOM init никогда не срабатывает из-за неисправности JavaScript, таймаут срабатывает вскоре после завершения загрузки страницы.

Вы можете добавить несколько других резервных копий - даже добавьте код в заголовок, если это необходимо. Поскольку my_hardened_init() запускается только один раз, вы можете попробовать столько раз, сколько хотите, чтобы вызвать его.

Это работало на связке клиентских сайтов с рядом других сломанных плагинов.

Надеюсь, что это поможет.

  • 0
    Отличный ответ. Это работает по причине youtu.be/8aGhZQkoFbQ?t=14m53s
2
1
<script>
var _z = console;
Object.defineProperty(window, 'console', {
    get: function(){
        if (_z._commandLineAPI) {
         return true;   
        }
        return _z;
    },
    set: function(val) {
        _z = val;
    }
});
</script>
1

Если страница запущена. Использование:

$(window).error(function(e){ e.preventDefault(); }); // IGNORE ALL ERROR JQUERY!

или используйте:

window.onerror = function(){ return true; } // IGNORE ALL ERROR JAVASCRIPT!

0

Поместите свой вызов в плагин в

try{
  ......
}
catch(e){

}
0

Возможно, вы могли бы попробовать разместить js в html-объекте, чтобы он выполнялся на отдельной странице. Вероятно, это не поможет, если js на главной странице не будет работать для взаимодействия с объектом. Просто с чем играть.

  • 0
    Не очень понятно, что ты пытаешься сказать. Можете ли вы перефразировать это, чтобы было понятнее?
  • 0
    Извините, у меня там был какой-то html, который испортил пост.
0

Регулярные утверждения catch catch не будут работать для этих типов ошибок.

Возможные обходные пути:

Использовать inline-css, чтобы плавать панель слева, а не jQuery (я не уверен, что полная функция вашего плагина, но если она просто плавает на панели слева, почему бы просто не использовать css?)

Имейте невидимый iframe, который пытается запустить некоторый код на родительской странице. если он терпит неудачу, чем предупредит пользователя (изнутри этого iframe), что это не ваша ошибка:)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню