twitter bootstrap ตัวอย่างเช่นอาแจ็กซ์


280

ฉันกำลังพยายามหาตัวอย่างการทำงานขององค์ประกอบตัวพิมพ์twitter bootstrapที่จะทำการโทร ajax เพื่อเติมลงมัน

ฉันมีตัวอย่างการเติมข้อความอัตโนมัติ jQuery ที่ใช้งานอยู่ซึ่งกำหนด ajax url เป็นและวิธีการตอบกลับ

<script type="text/javascript">
//<![CDATA[
$(document).ready(function() {
    var options = { minChars:3, max:20 };
    $("#runnerquery").autocomplete('./index/runnerfilter/format/html',options).result(
            function(event, data, formatted)
                {
                    window.location = "./runner/index/id/"+data[1];
                }
            );
       ..

ฉันต้องเปลี่ยนอะไรเพื่อแปลงสิ่งนี้เป็นตัวอย่างของหัวพิมพ์?

<script type="text/javascript">
//<![CDATA[
$(document).ready(function() {
    var options = { source:'/index/runnerfilter/format/html', items:5 };
    $("#runnerquery").typeahead(options).result(
            function(event, data, formatted)
                {
                    window.location = "./runner/index/id/"+data[1];
                }
            );
       ..

ฉันจะรอการแก้ไขปัญหา ' เพิ่มแหล่งที่มาระยะไกลสำหรับ typeahead '


จะเฉพาะเจาะจงมากขึ้นฉันสงสัยว่าตัวเลือกการเติมข้อความอัตโนมัติและฟังก์ชั่นการจัดการผลลัพธ์แผนที่ไปยังตัวเลือกข้อความ? มีชุดของการจัดการผลลัพธ์ textalert ที่กำหนดไว้ซึ่งสามารถแทนที่ได้หรือเป็นวิธีการตั้งชื่อที่สืบทอดมาจาก jquery api
emeraldjava

1
คุณสามารถทำเครื่องหมายคำตอบของ Stijn Van Bael เป็นคำตอบที่ถูกต้องได้หรือไม่? คำตอบของ bogert ใช้ได้กับ Bootstrap รุ่นที่ล้าสมัยเท่านั้น
ไจล์โรเบิร์ตส์

คำตอบ:


302

แก้ไข: typeahead ไม่ได้รวมอยู่ใน Bootstrap 3. ลองดู:

ตั้งแต่ Bootstrap 2.1.0 จนถึง 2.3.2 คุณสามารถทำสิ่งนี้ได้:

$('.typeahead').typeahead({
    source: function (query, process) {
        return $.get('/typeahead', { query: query }, function (data) {
            return process(data.options);
        });
    }
});

ในการใช้ข้อมูล JSON เช่นนี้:

{
    "options": [
        "Option 1",
        "Option 2",
        "Option 3",
        "Option 4",
        "Option 5"
    ]
}

โปรดทราบว่าข้อมูล JSON ต้องเป็นประเภท mime ที่เหมาะสม (application / json) ดังนั้น jQuery จึงรับรู้ว่าเป็น JSON


3
เช่นเดียวกับใน Typeahead fork ข้อมูลจะต้องเป็นอาร์เรย์ของสตริง JSON และประเภทเนื้อหาจะต้องเป็น application / json
Stijn Van Bael

9
2.1 สามารถใช้ json ที่ไม่ใช่แค่อาร์เรย์สตริงได้หรือไม่? ฉันต้องการค่าเพื่อผู้ใช้และใช้รหัสเพื่อทำการประมวลผลเพิ่มเติม เป็นไปได้หรือไม่ที่จะไม่ทำการแยก fork ที่กำหนดเอง?
แอนตัน

2
@Stijin มีตัวอย่างของวิธีใช้ฟังก์ชั่นที่ไม่ระบุตัวตนที่นี่เพื่อประมวลผล id สำหรับตัวเลือกที่แสดงหรือไม่ ขอบคุณ!
Acyra

1
ฉันต้องการจะชี้ให้เห็นว่าการใช้วิธีนี้ส่งผลให้ AJAX เรียกว่าถูกสร้างขึ้นสำหรับการกดแป้นพิมพ์ทุกครั้งที่อินพุต หากเซิร์ฟเวอร์ส่งคืนข้อมูลแบบคงที่เป็นหลัก (เช่นไม่ได้ทำอะไรกับแบบสอบถาม) นี่อาจเป็นประโยชน์อย่างมาก
Dologan

2
เหตุผลที่ใช้getแทนgetJSON? ดูเหมือนจะเหมาะสมกว่า
greg0ire

119

คุณสามารถใช้BS Typeahead forkซึ่งรองรับการโทร ajax จากนั้นคุณจะสามารถเขียน:

$('.typeahead').typeahead({
    source: function (typeahead, query) {
        return $.get('/typeahead', { query: query }, function (data) {
            return typeahead.process(data);
        });
    }
});

1
ของ jQuery "เดาอัจฉริยะ" สำหรับประเภทการกลับมาของข้อมูล POST ["aardvark", "apple"]ไม่ได้ทำงานเมื่อฉันกลับมายกตัวอย่างเช่น ฉันต้องตั้งค่าdataTypeพารามิเตอร์อย่างชัดเจนในการ$.postโทร ดูjQuery.post ()
Raus Fausak

1
@rfausak อีกวิธีหนึ่งตั้งค่าContent-typeส่วนหัวเป็นapplication/json
Rusty Fausak

23
ฉันได้รับ Uncaught TypeError: ไม่สามารถเรียกเมธอด 'toLowerCase' ของไม่ได้กำหนด
Krishnaprasad Varma

ในลิงก์ที่คุณส่งฉันไม่ได้รับsourceฟังก์ชั่นการทำงาน
James

8
คำตอบที่ดี! ฉันจะใช้คำขอ GET แทนเพียงเพื่อให้ได้มาตรฐาน REST
Mauro

72

เริ่มต้นจาก Bootstrap 2.1.0:

HTML:

<input type='text' class='ajax-typeahead' data-link='your-json-link' />

javascript:

$('.ajax-typeahead').typeahead({
    source: function(query, process) {
        return $.ajax({
            url: $(this)[0].$element[0].dataset.link,
            type: 'get',
            data: {query: query},
            dataType: 'json',
            success: function(json) {
                return typeof json.options == 'undefined' ? false : process(json.options);
            }
        });
    }
});

ตอนนี้คุณสามารถสร้างรหัสแบบรวมได้โดยวางลิงก์ "json-request" ใน HTML-code ของคุณ


11
$(this)[0].$element.data('link')แต่ผมจะเปลี่ยนไปใช้
Andrew Ellis

หรือthis.$element.data('link')
Richard87

51

การตอบสนองทั้งหมดอ้างถึง BootStrap 2 typeahead ซึ่งไม่มีอยู่ใน BootStrap 3 อีกต่อไป

สำหรับทุกคนที่กำกับที่นี่กำลังมองหาตัวอย่าง AJAX โดยใช้ post-Bootstrap Twitter typeahead.jsใหม่นี่เป็นตัวอย่างการทำงาน ไวยากรณ์แตกต่างกันเล็กน้อย:

$('#mytextquery').typeahead({
  hint: true,
  highlight: true,
  minLength: 1
},
{
  limit: 12,
  async: true,
  source: function (query, processSync, processAsync) {
    processSync(['This suggestion appears immediately', 'This one too']);
    return $.ajax({
      url: "/ajax/myfilter.php", 
      type: 'GET',
      data: {query: query},
      dataType: 'json',
      success: function (json) {
        // in this example, json is simply an array of strings
        return processAsync(json);
      }
    });
  }
});

ตัวอย่างนี้ใช้ทั้งการซิงโครนัส (การเรียกไปยังprocessSync ) และคำแนะนำแบบอะซิงโครนัสดังนั้นคุณจะเห็นตัวเลือกบางอย่างปรากฏขึ้นทันทีจากนั้นผู้อื่นจะถูกเพิ่ม คุณสามารถใช้อย่างใดอย่างหนึ่ง

มีเหตุการณ์ที่ผูกมัดจำนวนมากและตัวเลือกที่ทรงพลังบางอย่างรวมถึงการทำงานกับวัตถุมากกว่าสตริงในกรณีนี้คุณจะใช้ฟังก์ชั่นการแสดงผลที่กำหนดเองของคุณเองเพื่อแสดงรายการของคุณเป็นข้อความ


1
ขอบคุณ. อีกหนึ่งคำถาม: ด้วย processAsync ฉันได้รับ "TypeError: ข้อเสนอแนะ. JSON ที่ส่งคืนจะมีลักษณะอย่างไรเช่นกัน นี่คือการคาดเดาที่ดีที่สุดของฉัน: {: ข้อเสนอแนะ => ["สิ่งที่ 1", "สิ่งที่ 2", "สิ่งที่ 3"]}
user1515295

1
ตรวจสอบให้แน่ใจว่าคุณส่งคืนสตริง JSON ที่ถูกต้อง ฟังก์ชั่นแนะนำ AJAX ของคุณควรส่งคืนอาร์เรย์ของสตริงเช่น["Thing 1","Thing 2"]หรือด้วยฟังก์ชั่นการแสดงผลที่กำหนดเองอาร์เรย์ของวัตถุตามความต้องการของคุณเช่น[{"id":1,"label":"Foo"},{"id":2,"label":"Bar"}]
Jonathan Lidbeck

ฉันกลับมา[{"id":1,"label":"Foo"},{"id":2,"label":"Bar"}]ตอนนี้ฉันต้องการแสดงสองคอลัมน์ในรายการแบบหล่นลงของ typeahead พร้อมรหัสและป้ายกำกับ ฉันจะทำสิ่งนั้นได้อย่างไร
Vishal

2
พระเจ้า!!! ฉันค้นหาจาก 3 วันที่ผ่านมาไม่มีใครพูดถึงเรื่องนี้ ฉันทดสอบกับฟังก์ชั่นการซิงค์จนถึงตอนนี้ ขอบคุณ DUDE !!
Gilson PJ

ขอบคุณมาก! ใช้งานได้ดีกับ bootstrap 4.3 และ jquery 3.4 แต่ตัวเลือกในรายการจะไม่ได้รับการเน้นเมื่อเมาส์อยู่เหนือ ฉันคิดว่ามันควรจะเป็นส่วนหนึ่งของหัวพิมพ์ตัวเอง
Binita Bharati

25

ฉันได้เพิ่มปลั๊กอิน Bootstrap typeahead ดั้งเดิมที่มีความสามารถ ajax ใช้งานง่ายมาก:

$("#ajax-typeahead").typeahead({
     ajax: "/path/to/source"
});

นี่คือ repo github: Ajax-Typeahead


ฉันดูโค้ดของ Gudbergur แล้ว ฉันชอบอันนี้ที่สุด มันค่อนข้างเป็นมิตรมากกว่าและมีฟังก์ชั่นเพิ่มเติม เก่งมากพอล! สิ่งเดียวที่ฉันอยากจะแนะนำคือใน README ของคุณเตือนผู้ใช้ว่าพวกเขาจำเป็นต้องวิเคราะห์ข้อมูล JSON ของพวกเขาใน JS เพื่อให้รหัสของคุณสามารถใช้งานได้อย่างถูกต้อง ฉันคิดว่าคุณกำลังแยกมันสำหรับฉันเพื่อที่จะแขวนฉันสักหน่อย ไม่งั้นสวยดีขอบคุณ! :)
สารพิษ

3
เซิร์ฟเวอร์ของคุณส่งคืนสตริงแทนที่จะเป็นวัตถุ JSON jQuery's $ .ajax () ใช้เพื่อโทรออกและดูแลการแยกวิเคราะห์
Paul Warelis

1
ถูกต้องแน่นอนขอบคุณสำหรับการจับ! :) ปลั๊กอินนี้ใช้งานได้ดีมาก
สารพิษ

สวัสดี, ฝั่งเซิร์ฟเวอร์ควรJSONมีลักษณะอย่างไร Uncaught TypeError: Cannot read property 'length' of undefined ฉันได้รับ ฉันใช้json_encode($array)และส่งหัวกระดาษด้านขวา ( 'Content-Type: application/json; charset=utf-8') jquery versionjQuery v1.9.1
Kyslik

5

ฉันทำการแก้ไขบางอย่างใน jquery-ui.min.js:

//Line 319 ORIG:
this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(...
// NEW:
this.menu=d("<ul></ul>").addClass("ui-autocomplete").addClass("typeahead").addClass("dropdown-menu").appendTo(d(...

// Line 328 ORIG:
this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr...
// NEW:this.element.attr....

// Line 329 ORIG:
this.active=a.eq(0).children("a")
this.active.children("a")
// NEW:
this.active=a.eq(0).addClass("active").children("a")
this.active.removeClass("active").children("a")`

และเพิ่ม CSS ต่อไปนี้

.dropdown-menu {
    max-width: 920px;
}
.ui-menu-item {
    cursor: pointer;        
}

ทำงานได้สมบูรณ์แบบ


คุณใช้ jquery ui min เวอร์ชันใดอยู่
emeraldjava

หากคุณต้องการสิ่งนี้สำหรับ jQuery 1.7.1 และ jQuery UI 1.8.16 จากนั้นฉันได้สร้าง GIST ตามการแก้ไขด้านบนที่แสดงตำแหน่งที่จะเปลี่ยนไฟล์ jQuery UI gist.github.com/1884819 - บรรทัดมีความเห็นพร้อม // แก้ไข
Richard Hollis

นี่เป็นคำถาม / คำตอบที่ค่อนข้างเก่า แต่ฉันแค่อยากจะบอกว่ามันเป็นวิธีที่ไม่ดีในการเปลี่ยนรหัสส่วนประกอบของบุคคลที่สาม คุณจะต้องทบทวนการเปลี่ยนแปลงทั้งหมดทุกครั้งที่คุณอัปเกรด ในกรณีนี้วิดเจ็ต jQuery สามารถสืบทอดซึ่งเป็นวิธีที่ปลอดภัยกว่ามากในการปรับแต่ง ดังนั้นโดยพื้นฐานแล้วสร้างวิดเจ็ตของคุณเองสืบทอดมาจากแกนกลาง (การเติมข้อความอัตโนมัติในกรณีนี้) และปลดปล่อยจินตนาการของคุณ! :)
AlexCode

3

ฉันใช้วิธีนี้

$('.typeahead').typeahead({
    hint: true,
    highlight: true,
    minLength: 1
},
    {
    name: 'options',
    displayKey: 'value',
    source: function (query, process) {
        return $.get('/weather/searchCity/?q=%QUERY', { query: query }, function (data) {
            var matches = [];
            $.each(data, function(i, str) {
                matches.push({ value: str });
            });
            return process(matches);

        },'json');
    }
});

คงจะดีถ้าคุณสามารถเพิ่มคำอธิบายลงในคำตอบของคุณ ตัวอย่างเช่นอะไรคือความแตกต่างของการแก้ปัญหาของคุณเมื่อเทียบกับโซลูชั่นที่นำเสนอในคำตอบที่มีอยู่แล้ว?
honk

2

หนึ่งสามารถโทรโดยใช้ Bootstrap รุ่นปัจจุบันไม่มีปัญหาการอัพเดทใด ๆ ปัญหาในการอัปเดตแหล่งหัวพิมพ์ Bootstrap ของแหล่งข้อมูลด้วยการตอบสนองโพสต์ นั่นคือที่มาของ bootstrap เมื่อการปรับปรุงสามารถแก้ไขได้อีกครั้ง

โปรดดูตัวอย่างด้านล่าง:

jQuery('#help').typeahead({
    source : function(query, process) {
        jQuery.ajax({
            url : "urltobefetched",
            type : 'GET',
            data : {
                "query" : query
            },
            dataType : 'json',
            success : function(json) {
                process(json);
            }
        });
    },
    minLength : 1,
});

2

สำหรับผู้ที่กำลังมองหาคำตอบที่ได้รับการยอมรับ:

$(".typeahead").typeahead source: (query, process) ->
  $.get "/typeahead",
    query: query
  , (data) ->
    process data.options

2

ฉันผ่านโพสต์นี้และทุกอย่างไม่ต้องการทำงานอย่างถูกต้องและในที่สุดก็ปะติดปะต่อบิตจากคำตอบสองสามข้อดังนั้นฉันจึงมีตัวอย่างการทำงาน 100% และจะวางไว้ที่นี่เพื่ออ้างอิง - วางสิ่งนี้ลงในไฟล์ php และตรวจสอบให้แน่ใจว่า สถานที่ที่เหมาะสม

<?php if (isset($_GET['typeahead'])){
    die(json_encode(array('options' => array('like','spike','dike','ikelalcdass'))));
}
?>
<link href="bootstrap.css" rel="stylesheet">
<input type="text" class='typeahead'>
<script src="jquery-1.10.2.js"></script>
<script src="bootstrap.min.js"></script>
<script>
$('.typeahead').typeahead({
    source: function (query, process) {
        return $.get('index.php?typeahead', { query: query }, function (data) {
            return process(JSON.parse(data).options);
        });
    }
});
</script>

2

ลองทำเช่นนี้หากบริการของคุณไม่ได้ส่งคืนส่วนหัวของประเภทแอปพลิเคชัน / json ที่ถูกต้อง:

$('.typeahead').typeahead({
    source: function (query, process) {
        return $.get('/typeahead', { query: query }, function (data) {
            var json = JSON.parse(data); // string to json
            return process(json.options);
        });
    }
});

1

UPDATE: ฉันแก้ไขรหัสโดยใช้ทางแยกนี้

แทนการใช้ $. แต่ละฉันเปลี่ยนเป็น $ .map ตามที่ Tomislav Markovski แนะนำ

$('#manufacturer').typeahead({
    source: function(typeahead, query){
        $.ajax({
            url: window.location.origin+"/bows/get_manufacturers.json",
            type: "POST",
            data: "",
            dataType: "JSON",
            async: false,
            success: function(results){
                var manufacturers = new Array;
                $.map(results.data.manufacturers, function(data, item){
                    var group;
                    group = {
                        manufacturer_id: data.Manufacturer.id,
                        manufacturer: data.Manufacturer.manufacturer
                    };
                    manufacturers.push(group);
                });
                typeahead.process(manufacturers);
            }
        });
    },
    property: 'name',
    items:11,
    onselect: function (obj) {

    }
});

อย่างไรก็ตามฉันกำลังประสบปัญหาบางอย่างจากการได้รับ

Uncaught TypeError: ไม่สามารถเรียกเมธอด 'toLowerCase' ที่ไม่ได้กำหนด

อย่างที่คุณเห็นในโพสต์ที่ใหม่กว่าฉันพยายามคิดที่นี่

หวังว่าการอัปเดตนี้จะช่วยคุณได้ ...


ไม่เกี่ยวข้องกับ OP: ฉันจะใช้Array.mapแทน$.eachและแทนที่เนื้อหาของsuccessฟังก์ชันการโทรกลับทั้งหมดของคุณด้วยvar manufacturers = results.data.manufacturers.map(function (item) { return { id: item.Manufacturer.id, manufacturer: item.Manufacturer.manufacturer } });
Tomislav Markovski

ขอบคุณ @TomislavMarkovski ฉันแก้ไขโค้ดตามที่คุณแนะนำ
mmoscosa

0

ฉันไม่มีตัวอย่างการทำงานสำหรับคุณหรือฉันไม่มีวิธีแก้ปัญหาที่สะอาดมาก แต่ให้ฉันบอกสิ่งที่ฉันพบ

หากคุณดูโค้ดจาวาสคริปต์สำหรับ TypeAhead จะมีลักษณะดังนี้:

items = $.grep(this.source, function (item) {
    if (that.matcher(item)) return item
  })

รหัสนี้ใช้วิธีการ jQuery "grep" เพื่อจับคู่องค์ประกอบในอาร์เรย์ที่มา ฉันไม่เห็นสถานที่ใดที่คุณสามารถขอสาย AJAX ได้ดังนั้นจึงไม่มีทางออกที่ "สะอาด" สำหรับเรื่องนี้

อย่างไรก็ตามวิธีหนึ่งที่ค่อนข้างแฮ็กที่คุณสามารถทำได้คือการใช้ประโยชน์จากวิธีการทำงานของ grep ใน jQuery อาร์กิวเมนต์แรกของ grep คืออาร์เรย์ต้นทางและอาร์กิวเมนต์ที่สองคือฟังก์ชันที่ใช้จับคู่อาร์เรย์ต้นทาง (สังเกต Bootstrap เรียกว่า "matcher" ที่คุณระบุเมื่อคุณเตรียมข้อมูลเบื้องต้น) สิ่งที่คุณสามารถทำได้คือตั้งค่าแหล่งที่มาให้เป็นอาเรย์แบบจำลององค์ประกอบเดียวและกำหนดตัวจับคู่เป็นฟังก์ชันที่มีการเรียก AJAX ด้วยวิธีดังกล่าวมันจะเรียกใช้ AJAX เพียงครั้งเดียว (เนื่องจากอาร์เรย์ต้นทางของคุณมีองค์ประกอบหนึ่งอยู่ในนั้น)

โซลูชันนี้ไม่เพียง แต่จะแฮ็ก แต่จะประสบปัญหาด้านประสิทธิภาพเนื่องจากรหัส TypeAhead ถูกออกแบบมาเพื่อทำการค้นหาในทุกการกดปุ่ม (การโทร AJAX ควรเกิดขึ้นในทุกการกดแป้นบางครั้งหรือหลังจากเวลาที่ไม่ได้ใช้งาน) คำแนะนำของฉันคือให้ลองใช้ แต่ใช้ไลบรารีเติมข้อความอัตโนมัติอื่นหรือใช้เฉพาะกับสถานการณ์ที่ไม่ใช่ AJAX หากคุณพบปัญหาใด ๆ


0

เมื่อใช้ Ajax ให้ลอง$.getJSON()แทน$.get()หากคุณมีปัญหากับการแสดงผลที่ถูกต้อง

ในกรณีของฉันฉันได้เฉพาะอักขระตัวแรกของทุกผลลัพธ์เมื่อฉันใช้$.get()แม้ว่าฉันจะใช้json_encode()ฝั่งเซิร์ฟเวอร์


0

ฉันใช้$().one() สำหรับแก้ปัญหานี้ เมื่อโหลดหน้าเว็บฉันส่ง ajax ไปยังเซิร์ฟเวอร์และรอให้เสร็จ จากนั้นส่งผ่านผลลัพธ์ไปยังฟังก์ชัน $().one()เป็นสิ่งสำคัญเนื่องจากบังคับให้typehead.jsแนบกับอินพุตหนึ่งครั้ง ขอโทษที่เขียนไม่ดี

(($) => {
    
    var substringMatcher = function(strs) {
        return function findMatches(q, cb) {
          var matches, substringRegex;
          // an array that will be populated with substring matches
          matches = [];
      
          // regex used to determine if a string contains the substring `q`
          substrRegex = new RegExp(q, 'i');
      
          // iterate through the pool of strings and for any string that
          // contains the substring `q`, add it to the `matches` array
          $.each(strs, function(i, str) {
            if (substrRegex.test(str)) {
              matches.push(str);
            }
          });
          cb(matches);
        };
      };
      
      var states = [];
      $.ajax({
          url: 'https://baconipsum.com/api/?type=meat-and-filler',
          type: 'get'
      }).done(function(data) {
        $('.typeahead').one().typeahead({
            hint: true,
            highlight: true,
            minLength: 1
          },
          {
            name: 'states',
            source: substringMatcher(data)
          });
      })
      

})(jQuery);
.tt-query, /* UPDATE: newer versions use tt-input instead of tt-query */
.tt-hint {
    width: 396px;
    height: 30px;
    padding: 8px 12px;
    font-size: 24px;
    line-height: 30px;
    border: 2px solid #ccc;
    border-radius: 8px;
    outline: none;
}

.tt-query { /* UPDATE: newer versions use tt-input instead of tt-query */
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
}

.tt-hint {
    color: #999;
}

.tt-menu { /* UPDATE: newer versions use tt-menu instead of tt-dropdown-menu */
    width: 422px;
    margin-top: 12px;
    padding: 8px 0;
    background-color: #fff;
    border: 1px solid #ccc;
    border: 1px solid rgba(0, 0, 0, 0.2);
    border-radius: 8px;
    box-shadow: 0 5px 10px rgba(0,0,0,.2);
}

.tt-suggestion {
    padding: 3px 20px;
    font-size: 18px;
    line-height: 24px;
    cursor: pointer;
}

.tt-suggestion:hover {
    color: #f0f0f0;
    background-color: #0097cf;
}

.tt-suggestion p {
    margin: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.js"></script>

<input class="typeahead" type="text" placeholder="where ?">


-1
 $('#runnerquery').typeahead({
        source: function (query, result) {
            $.ajax({
                url: "db.php",
                data: 'query=' + query,            
                dataType: "json",
                type: "POST",
                success: function (data) {
                    result($.map(data, function (item) {
                        return item;
                    }));
                }
            });
        },
        updater: function (item) {
        //selectedState = map[item].stateCode;

       // Here u can obtain the selected suggestion from the list


        alert(item);
            }

    }); 

 //Db.php file
<?php       
$keyword = strval($_POST['query']);
$search_param = "{$keyword}%";
$conn =new mysqli('localhost', 'root', '' , 'TableName');

$sql = $conn->prepare("SELECT * FROM TableName WHERE name LIKE ?");
$sql->bind_param("s",$search_param);            
$sql->execute();
$result = $sql->get_result();
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
    $Resut[] = $row["name"];
    }
    echo json_encode($Result);
}
$conn->close();

?>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.