2013-11-20 2 views
2

Я пытаюсь получить html-объекты, такие как амперсанды &, и кавычки '', чтобы появиться в меню автозаполнения jquery ui.jquery ui autocomplete select menu html entity (амперсанд и кавычки)

я смог переопределить метод _renderItem, чтобы зафиксировать дисплей в меню, но когда элемент seleted закодированные символы по-прежнему появляются на входе

как бы я идти о фиксации на дисплее в поле ввода сам?

см эту скрипку http://jsfiddle.net/Gq2F6/2/

благодаря

JS код здесь:

var autocomplete_items = [{label:'fish & chips',value:'fish&chips',id:'01'},{label:'food',value:'food',id:'02'}]; 

var $keywords = $('#keywords'); 

$keywords.autocomplete({ 
    minLength:2, 
    source: autocomplete_items 
}); 

$keywords.data("autocomplete")._renderItem = function (ul, item){ 
    return $("<li></li>").data("item.autocomplete", item).append($("<a></a>").html(item.value)).appendTo(ul); 
}; 
+0

Возможно, я что-то упустил. Почему это не работает? http://jsfiddle.net/Gq2F6/3/ – Nathan

+0

Скрипка - это минимальный тестовый пример. В реальном приложении я не могу управлять массивом строк, переданных в качестве источника. label: и value: всегда всегда совпадают с закодированными html-объектами. – mjr

ответ

1

Попробуйте это: http://jsfiddle.net/Gq2F6/4/

var autocomplete_items = [{label:'fish &amp; chips',value:'fish&amp;chips',id:'01'},{label:'food',value:'food',id:'02'}]; 

var decodeEntities = (function() { 
    // this prevents any overhead from creating the object each time 
    var element = document.createElement('div'); 

    function decodeHTMLEntities (str) { 
    if(str && typeof str === 'string') { 
     // strip script/html tags 
     str = str.replace(/<script[^>]*>([\S\s]*?)<\/script>/gmi, ''); 
     str = str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/gmi, ''); 
     element.innerHTML = str; 
     str = element.textContent; 
     element.textContent = ''; 
    } 

    return str; 
    } 

    return decodeHTMLEntities; 
})(); 


var $keywords = $('#keywords'); 

$keywords.autocomplete({ 
    minLength:2, 
    source: autocomplete_items, 
    select: function (e, ui) { 
     $keywords.val(decodeEntities(ui.item.value)); 
     return false; 
    } 
}); 

$keywords.data("autocomplete")._renderItem = function (ul, item){ 
    return $("<li></li>").data("item.autocomplete", item).append($("<a></a>").html(item.value)).appendTo(ul); 
}; 

Он использует выберите событие автозаполнения, чтобы отменить то, что происходит, когда вы нажимаете на один из возвращенных элементов. Вместо того, чтобы просто делать копию значения по умолчанию в поле ввода, он сначала декодирует объекты HTML. (Лучше декодировать подобные объекты, а не использовать jQuery .text(), когда у вас могут быть ненадежные данные).

+0

Это отлично подходит для выбранного события! Когда я использую клавиши со стрелками для перемещения по списку, он не запускает функцию decodeEntities. Я не думаю, что для этого есть событие autocomplete ui. – mjr

+0

Просто добавьте аналогичное фокусное событие, затем - см. Http://jsfiddle.net/Gq2F6/5/ –

+0

отличная идея, спасибо! – mjr

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