Как сообщить об ошибках JS из скрипта в другом домене? - PullRequest
0 голосов
/ 08 декабря 2011

В настоящее время я пытаюсь сообщать обо всех нераспознанных ошибках JS, например, с помощью jquery:

window.onerror = function(msg, file, line) {
  $.post("https://"+current_url+"/js_error", {
     msg: msg
     file: file
     line: line
  });
}

current_url - это всегда домен, в котором я сейчас нахожусь.

Когда я нахожусь вwww.website.com и скрипт загружается из www.website.com/script.js (тот же домен), все работает нормально.Я попробовал это с неопределенной переменной, и получил правильное сообщение variable is undefined постет к https://www.website.com/js_error.

Теперь у меня есть несколько поддоменов: a.website.com, b.website.com и т. Д. Все они имеют разный контент, но используйте точно такой же javascript.

Моя идея заключалась в следующем: всегда включайте javascript из www.website.com, чтобы при переключении субдомена скрипт мог кэшироваться браузерами и не должен былперезагружен снова.

Но, к сожалению, это нарушает сообщение об ошибке выше.Когда скрипт включен из другого домена, например, я нахожусь на a.website.com и включаю скрипт от www.website.com/script.js, я отправляю только эти ошибки в https://a.website.com/js_error (для браузеров Firefox):

"Script Error." on line 0

Я понимаю, что это связано с политикой того же происхождения, см. этот вопрос .

Я также пытался жестко кодировать current_url в www.website.com (откуда загружается скрипт),поэтому POST всегда там, независимо от домена, в котором я нахожусь.Но этот POST вообще не работает с другого субдомена, отличного от www.website.com (я думаю, что междоменные POST-записи ajax невозможны).

Я также пытался отправить ошибку как GET ($.get), но это всегда дает мне "Script Error." on line 0 на поддомене - независимо от цели GET.

Итак, как я могу сообщить об ошибках для моего скрипта?Я хочу обнаружить их, чтобы исправить, но не хочу отказываться от кэширования.

Кстати: я использую firebug для отладки своих сценариев, поэтому я обнаруживаю ошибки, когда I возьми их.Но из-за сложности не всегда возможно обнаружить каждую ошибку для каждой комбинации ОС / браузера, и я хочу убедиться, что они обнаруживаются, когда они происходят и у моих клиентов.

РЕДАКТИРОВАТЬ : jsfiddle удалено

1 Ответ

2 голосов
/ 08 декабря 2011

CORS - это именно ваша проблема, просто добавьте разрешенные заголовки CORS к вашему ответу https://"+current_url+"/js_error.

Access-Control-Allow-Origin: *

Или чтобы быть более ограничительным.

Access-Control-Allow-Origin: http://a.website.com http://b.website.com

http://enable -cors.org / - хороший ресурс для этого.

Что касается window.onerror, который не выдает все данные с ошибками из разных доменов; Я могу подтвердить, что это не сумасшествие, а то, как работает Firefox. http://jsbin.com/ojavoy/3/edit#javascript,html

  • Firefox пропускает номер строки
  • Chrome не дает имя сценария или номер строки
  • IE <8 не поддерживает window.onerror (не знаю о 9) </li>

Я видел, как люди оборачивали свои сценарии в блоке try {} catch {}. Это будет работать в разных браузерах и будет ловить некоторые, но не все ошибки (что лучше, чем ничего в IE). В настоящее время не существует «правильного способа сделать это».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...