jQuery Autocomplete - Неверная метка (Firebug) / Uncaught SyntaxError (Chrome) - PullRequest
0 голосов
/ 19 марта 2011

С помощью хороших людей из SO мне удалось запустить автозаполнение на тестовой странице с пустыми костями в CodeIgniter 2.0.

Когда я перемещаю код на реальную страницу, возникает проблема.

Как только я наберу первую букву, я получаю Firebug

invalid label
[Break On This Error] {"response":"true","message":[{"label"... My Park","value":"Thier  Park"}]}

и Chrome

// jquery.min.js:line 16
Uncaught SyntaxError: Unexpected token :
d.d.extend.globalEvaljquery.min.js:16
d.ajaxSetup.converters.text scriptjquery.min.js:16
bQjquery.min.js:16
vjquery.min.js:16
d.support.ajax.d.ajaxTransport.send.c

Вот мой код представления CI:

<script>
    $(document).ready(function() {    

        $("#exer_loc").autocomplete({
            source: function(req, add){
                $.ajax({
                    url: '<?php echo base_url(); ?>exercise/loc_autocomplete',
                    dataType: 'json',
                    type: 'POST',
                    data: req,
                    success: function(data){
                        if(data.response =='true'){
                           add(data.message);
                        }
                    }
                });
        },
        minLength: 1,
        select: function(event, ui){
            $(this).end().val(ui.item.value);
            }
        });

     });   
</script>

и мой код контроллера CI:

public function loc_autocomplete()
{

    $search = $this->input->post('term');

    $data['response'] = 'false';
    $this->db->select('*');
    $this->db->from('loc_exercise');
    $this->db->like('locations', $search);
    $locations = $this->db->get()->result();

    if (count($locations) > 0) {
        $data['message'] = array();

        foreach ($locations as $location) {
            $data['message'][] = array('label' => $location->locations,
                'item'  => $location->locations,
                'value' => $location->locations );
        }

        $data['response'] = 'true';
    }
    echo json_encode($data);
}

Как и выше, все это отлично работает на странице с открытым огнем в CI.

Но когда это выводится на мой стандартный CIШаблон я получаю ошибки.Я отключил несколько других JS-скриптов, и проблема не исчезла.

Любопытно, если я повторяю загрузку jQuery прямо перед тем, как скрипт CI view над ним работает.Но очевидно, что это не решение: P.

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    <script>
        $(document).ready(function() {    

            $("#exer_loc").autocomplete({
                source: function(req, add){
etc...

Кто-нибудь знает, как убить эту ошибку?

Спасибо!

РЕДАКТИРОВАТЬ:

Вотответ JSON на консоли

    [Object { label="My Place", item="My Place", value="My Place"}, Object { label="Pond Park", item="Pond Park", value="Pond Park"}, Object { label="Rock Park", item="Rock Park", value="Rock Park"}]

//html
{"response":"true","message":[{"label":"My Place","item":"My Place","value":"My Place"},{"label":"Fresh Pond Park","item":"Fresh Pond Park","value":"Fresh Pond Park"},{"label":"Cat Rock Park","item":"Cat Rock Park","value":"Cat Rock Park"}]}

EDIT2:

Использование console.log(req) показывает

Object { term="asd"}

1 Ответ

0 голосов
/ 14 апреля 2011

Похоже, это связано с ошибкой повторного вызова ajax jQuery, перечисленной здесь: Ошибка jQuery # 8398

Оказывается, что jQuery 1.5 модифицирует последующие вызовы ajax для json в jsonp, что приводит к этой ошибке.

Я исправил это, следуя одному из обходных путей, предложенных в истории изменений ошибок, и поместил следующий код где-то перед выполнением моих вызовов ajax:

$.ajaxSetup({
   jsonp: null,
   jsonpCallback: null
});

Должно также исправить любые проблемы для других запросов ajax.

...