2009-09-18 2 views
5

Я делаю кучу json-запросов с динамическими тегами сценариев. Можно ли обнаружить, есть ли ошибка в запросе (например, ошибка 503, ошибка 404) и что-то запустить при обнаружении ошибки?Теги динамического сценария для запросов JSON ... обнаружение ошибки XXX?

+0

Как вы делаете эти запросы JSON? –

+0

Я использую document.createElement ('script'), меняя src элемента на нужный URL, а затем добавляя этот элемент в DOM. Я попытался поставить appendChild в блок try/catch, но это ничего не делает. – rawrrrrrrrr

+4

Можете ли вы обновить вопрос с помощью фрагмента кода или сообщения на http://jsbin.com/, это помогает для полноты? –

ответ

11

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

Используя библиотеку как JQuery это становится очень просто:

$.ajax({ 
    type: "GET", 
    url: "test.js", 
    dataType: "script", 
    error: function(xhr, error, exception){ 
    alert(xhr.status); //Will alert 404 if the script does not exist 
    } 
}); 
+1

Но ... но ... есть способ. –

4

AFAIK, нет доступа к коду состояния какого-либо внешнего актива, загруженного из документа (например, сценарий, стиль или изображение). Даже обнаружение ошибки (через, скажем, onerror обработчик событий) не так широко поддерживается в браузерах.

Если все, что вы загружаете, находится под SOP, используйте XHR, который дает вам доступ к заголовкам ответов. В противном случае вы можете попробовать изучить недавно введенный X-domain XHR.

1
+0

Это, кажется, решение. Если бы вы добавили текст, объясняющий его и/или включив в ответ образец кода с ссылочной страницы, вы можете получить некоторые проценты и вознаградить принятый ответ. –

+0

ссылка объясняет это в значительной степени, не хочу загрязнять пространство копией/пастой, увеличивая энтропию lol. – Kane

+0

Я не считаю эту ссылку актуальной. Связанная статья посвящена обнаружению успешной загрузки, а не обнаружению ошибок. –

0

Если вы хотите обнаружить ошибки, послушайте событие error и сравните свойство ошибки fileName ошибки с именем файла скрипта. Если они совпадают, вы обрабатываете ошибку. Дело в том, что я считаю, что свойство fileName - это Firefox и Opera. Большинство браузеров, которые имеют стек для ошибок, также могут имитировать это поведение.

Вот пример, по просьбе Эрика Bréchemier:

var getErrorScriptNode = (function() { 
    var getErrorSource = function (error) { 
     var loc, replacer = function (stack, matchedLoc) { 
      loc = matchedLoc; 
     }; 

     if ("fileName" in error) { 
      loc = error.fileName; 
     } else if ("stacktrace" in error) { // Opera 
      error.stacktrace.replace(/Line \d+ of .+ script (.*)/gm, replacer); 
     } else if ("stack" in error) { // WebKit 
      error.stack.replace(/at (.*)/gm, replacer); 
      loc = loc.replace(/:\d+:\d+$/, ""); 
     } 
     return loc; 
    }, 
    anchor = document.createElement("a"); 

    return function (error) { 
     anchor.href = getErrorSource(error); 
     var src = anchor.href, 
     scripts = document.getElementsByTagName("script"); 
     anchor.removeAttribute("href"); 
     for (var i = 0, l = scripts.length; i < l; i++) { 
      anchor.href = scripts.item(i).src; 
      if (anchor.href === src) { 
       anchor.removeAttribute("href"); 
       return scripts.item(i); 
      } 
     } 
    }; 
}()); 
+0

как вы можете это сделать? любой пример? –

+0

Эрик: Я добавил пример. –

3

Я предполагаю, что вы хотите, чтобы это работать кросс-домен, поэтому вы не можете использовать XHR?

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

Если выполняется первый скриптовый тег, очистите обработчик ошибок в своем обратном вызове. Но если первый получает 404, будет выполняться обработчик ошибок во втором теге скрипта.

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

0

Если вам нужно перекрещивать домены (и нужно, чтобы страница работала переносимо), вам нужно использовать теги динамического сценария.

Если у вас есть доступ к удаленному серверу, вы можете передать код ошибки, с сервера, и есть возвращение страницы сервера 200.

Имеете ли вы доступ или нет, вы можете использовать SetTimeout при создании тег сценария, передающий функцию, которая вызовет ошибку, если она истечет до вызова обработчика jsonp. Убедитесь, что обработчик jsonp прерывается, если обработчик ошибок был вызван.

Вам нужно будет отслеживать каждый запрос через глобальную коллекцию, но вы сможете отменить и подсчитать запросы. Это похоже на то, как объекты XHR управляются библиотекой типа jQuery.

1

Если вы используете jQuery, ознакомьтесь с jQuery-JSONP, который является плагином jQuery, который выполняет довольно приличную работу по установке вставки для вас, а также для обнаружения ошибок выборки.

Цитирования со страницы проекта, JQuery-JSONP характеристики:

  • исправления ошибок в случае отказа сети или плохо сформированных ответов JSON,
  • точного контроля над обратным вызовом именованием и как она передается в URL-адрес,
  • несколько запросов с тем же именем обратного вызова, работающих одновременно,
  • два механизма кэширования (на основе браузера и на основе страницы),
  • возможность вручную ABO rt запрос, как и любой другой запрос AJAX,
  • механизм тайм-аута.
+0

Но не существует способа узнать фактический код состояния неудавшегося запроса, есть ли? – kangax

Смежные вопросы