2013-01-04 43 views

回答

13

做一些研究和拉動幾乎所有我的頭髮後,我終於想通了如何將全名,圖片和用戶名添加到類似twitter的類型。

比方說,這是每一個對象爲源的結構如下,

{{ friend.id }}#{{ friend.username }}#{{ friend.imgurl }}#{{ friend.fullname }} 

然後,所有你需要做的就是寫一個很好的熒光筆,像這樣

highlighter: function(item) { 
       var parts = item.split('#'), 
       html = '<div class="typeahead">'; 
       html += '<div class="media"><a class="pull-left" href="#"><img src='+parts[2]+' /></a>' 
       html += '<div class="media-body">'; 
       html += '<p class="media-heading">'+parts[3]+' (@'+parts[1]+')'+'</p>'; 
       html += '</div>'; 
       html += '</div>'; 
       return html; 
      }, 

某事,這將很容易在Typeahead中添加圖片,全名和用戶名。

+0

我想你錯過了這裏的一個關閉div。但除此之外,效果很好。 –

7

您可能會發現使用http://ivaynberg.github.com/select2/更容易/更好,而不是嘗試自定義默認垃圾Bootstrap!

如果搜索模板該網頁上,你會發現它 - 它看起來像這樣:

enter image description here

+0

我還可以使用個性化的匹配和更新的功能呢?我實際上是試圖在textarea中實現@ trigger typehead,就像Twitter一樣。 – Jonathan

+0

它有自己的功能,但我懷疑語法會相似。如果你通過ajax提取東西,Select2可以作爲一個預先輸入,而不是一個選擇框。說實話,我很快放棄了bootstrap,因爲我想要在20-30,000個項目中提前打字,所以需要在服務器上而不是客戶端上進行過濾。 –

+0

大聲笑沒關係。那麼我終於想出瞭如何爲Bootstrap的Typeahead添加額外的東西。所以我認爲我會堅持那個 – Jonathan

5

您可以嘗試使用以下自定義代碼來渲染包含JSON模式的圖像。

請按照fiddle link here進行實施和測試。

的預輸入的樣子:

$(".typeahead").typeahead({ 
    source: function (query, process) { 

     //here we pass the query (search) and process callback arguments to the throttled function 
     throttledRequest(query, process); 

    }, 
    highlighter: function (item) { 
     var test = testObjs[item]; 

     return '<div class="test">' + '<img src="' + test.photo + '" />' + '<br/><strong>' + test.name + '</strong>' + '</div>'; 
    }, 
    updater: function (selectedName) { 

     //note that the "selectedName" has nothing to do with the markup provided 
     //by the highlighter function. It corresponds to the array of names 
     //that we sent from the source function. 

     //save the id value into the hidden field 
     $("#testId").val(testObjs[selectedName].id); 

     //return the string you want to go into the textbox (the name) 
     return selectedName; 
    } 
}); 
+0

+1感謝您的回答。它真的救了我的一天:) –

7

熒光筆不再工作。

使用模板,例如:

var my_friends = [ 
    {name: "John", picture: "http://..."} 
    ,{name: "Mel", picture: "http://..."} 
]; 

var friends = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'), 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    local: my_friends 
}); 
friends.initialize(); 
$('#friend_name').typeahead(
    { 
     hint: true, 
     highlight: true, 
     minLength: 1, 
    }, 
    { 
     name: 'friends', 
     displayKey: 'name', 
     source: friends.ttAdapter(), 
     templates: { 
      empty: 'not found', //optional 
      suggestion: function(el){return '<img src="'+el.picture+'" />'+el.name} 
     } 
    } 
); 

來源:https://gist.github.com/jharding/9458780#file-custom-templates-js

+0

非常感謝你!!!!!!它像一個魅力! – 118218

3
typeahead.initialize(); 
var typeahead = { 

    typeaheadInit: function() { 
     var jsonData = [{ 
      'id': 1, 
      'name': 'Parajanov Museum', 
      'image': 'img/1.png' 
     }, { 
      'id': 2, 
      'name': 'Parajanov’s Movie', 
      'image': 'img/2.png' 
     }, { 
      'id': 3, 
      'name': 'S Parajanov’s about his series of Giocondas', 
      'image': 'img/3.png' 
     }, { 
      'id': 4, 
      'name': 'S Parajanov’s about the colore of pomegranate', 
      'image': 'img/4.png' 
     }, { 
      'id': 5, 
      'name': 'George Michael', 
      'image': 'img/5.png' 
     }]; 

     var productNames = []; 
     $.each(jsonData, function(index, product) { 
      productNames.push(product.name + "#" + product.image + "#" + product.id); 
     }); 
     $('#typeahead').typeahead({ 
      source: productNames, 
      highlighter: function(item) { 
       var parts = item.split('#'), 
        html = '<div><div class="typeahead-inner" id="' + parts[2] + '">'; 
       html += '<div class="item-img" style="background-image: url(' + parts[1] + ')"></div>'; 
       html += '<div class="item-body">'; 
       html += '<p class="item-heading">' + parts[0] + '</p>'; 
       html += '</div>'; 
       html += '</div></div>'; 

       var query = this.query; 
       var reEscQuery = query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); 
       var reQuery = new RegExp('(' + reEscQuery + ')', "gi"); 
       var jElem = $(html); 
       var textNodes = $(jElem.find('*')).add(jElem).contents().filter(function() { 
        return this.nodeType === 3; 
       }); 
       textNodes.replaceWith(function() { 
        return $(this).text().replace(reQuery, '<strong>$1</strong>'); 
       }); 

       return jElem.html(); 
      }, 
      updater: function(selectedName) { 
       var name = selectedName.split('#')[0]; 
       return name; 
      } 
     }); 
    }, 

    initialize: function() { 
     var _this = this; 
     _this.typeaheadInit(); 
    } 
}; 

來源:https://jsfiddle.net/geghamk/59eranrc/3/

+1

這是簡單而偉大的答案,typeahead和jquery只:) –

相關問題