У меня есть экземпляр моментального снимка Apache Solr 4.0.Solr для тех, кто не знает, предоставляет конечную точку HTTP, которая выполняет запросы.Вы можете попросить его вернуть результаты в виде json или jsonp (или других вещей, которые не имеют отношения к делу).
Используя jquery 1.5.2, я пытался использовать $.ajax
, чтобы поговорить с этим, используя код изПроект ajax-solr на github.Его автор настроил вещи для jsonp, чтобы позволить вещам работать между доменами.
Когда вы спрашиваете у solr о jsonp, это действительно делает jsonp.Он включает json в вызов функции.
В этом режиме работы (jsonp) я не смог заставить его работать ни с Chrome, ни с Firefox 4. Я сделал некоторую отладку в jquery, но у меня может бытьследовал за следом красных сельдей.
Проблема запуска заключалась в том, что solr возвращает тип содержимого «текст» вместо «приложение / json».Это, в свою очередь, запускает некоторый сложный код в jquery, который пробует несколько стратегий преобразования.
В Chrome, похоже, происходит ILLEGAL SYNTAX, когда весь кусок добавляется к узлу сценария DOM.В Firefox нет явной ошибки, но никогда не вызывается функция jsonp.
Когда я изменяю вещи, чтобы использовать простой json вместо jsonp, все работает нормально (у меня solr работает на том же хосте: port, как истатический контент, который говорит с ним.)
Я вставил гигантский кусок jsonp и связал его ниже.Это синтаксически верно.Я озадачен, но не застрял, поскольку для моего приложения использование простого json работает нормально.
Отвечающие указывают, что в текст включены символы, недопустимые в jsonp, поскольку они недопустимы в javascript в качестве объяснения дляошибка jsonp.
Код для разговора с solr:
var url = this.solrUrl + servlet + '?' + this.store.string() + '&wt=json&json.wrf=?';
jQuery.ajax({
url: url,
dataType: 'jsonp',
success: function (data, textStatus, xhr) {
self.handleResponse(data);
},
error: function(jqXHR, textStatus, errorThrown) {
alert(textStatus + " " + errorThrown);
}
});
Это относится к функции ошибки с errorThrown:
errorThrown: "jQuery15205321112349629402_1304645690480 не был вызван"
Ответ выглядит как вызов функции для этого прекрасного элемента.
Консоль Chrome говорит: «Uncaught SyntaxError: Неожиданный токен ILLEGAL».
Я захватил полную загрузку JavaScript,и передал его в jsLint, у которого нет претензий.
Pastebin: http://pastebin.com/ft5rw6uT
Я собираюсь попытаться поймать исключение синтаксического анализа в chrome.
Вотгде jquery получает бросок:
// Evalulates a script in a global context
globalEval: function( data ) {
if ( data && rnotwhite.test(data) ) {
// Inspired by code by Andrea Giammarchi
// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement,
script = document.createElement( "script" );
if ( jQuery.support.scriptEval() ) {
script.appendChild( document.createTextNode( data ) );
} else {
script.text = data;
}
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709).
head.insertBefore( script, head.firstChild );
//Chrome annotates the above with:
//jquery-1.5.2.js:593Uncaught SyntaxError: Unexpected token ILLEGAL
head.removeChild( script );
}
}
А вот версия, полученная с помощью CURL, с использованием более короткой строки для имени функции.
http://pastebin.com/zB6BkmEL