</b>", $name);\r\n\t \r\n\t echo "<li onselect=\"this.setText('$name').setValue('$id');\">$display_name</li>";\r\n\t}\r\n\tmysql_close();\r\n\t?>\r\n\t ","dateCreated":"2010-10-16T11:51:03","author":{"@type":"Person","name":"zraptor80@hotmail.com","url":"https://www.goragod.com/index.php"},"upvoteCount":0,"url":"https://www.goragod.com/forum.html?wbid=2659#R_5505"},{"@type":"Answer","text":"เข้าใจว่า ที่ทำงาน น่าจะเป็น IE7 มั้ง\n\nถ้าใช่ ลองเปลี่ยน tag เป็น tag อื่น ที่ไม่ใช่ li เช่น อาจใช้ p สำหรับแต่ละแถว แทน\n\nหรือ ลองดูตามนี้ IE 8 มันมากับเรื่องปวดหัว","dateCreated":"2010-10-16T12:42:09","author":{"@type":"Person","name":"กรกฎ วิริยะ","url":"https://www.goragod.com/index.php"},"upvoteCount":0,"url":"https://www.goragod.com/forum.html?wbid=2659#R_5506"}]}}]
^
ว่าแต่ แสน record จะ หากันเจอมั้ยเนี่ย...
โดยปกติ ก็ควรจัด query เพื่อทำการสรุปข้อมูลออกมาก่อนแหละครับ เพื่อลดจำนวนข้อมูลที่ต้องการออกให้เหลือน้อยที่สุด หรือ อาจใช้วิธีการสร้าง View ก้ได้ครับ
หาเจอครับ ใน ie จะ not responding ก่อน ถึงจะโหลดได้ แต่ในบางเครื่องก็ไม่ได้
ฟอร์มหน้านั้นเลยอืดมาก
ขอบคุณครับ
ปัญหาคงไม่ได้อยู่ที่ query จาก Server เพียงอย่างเดียวครับ จำนวนข้อมูลที่มากมายขนาดนั้น จะทำให้เว็บโหลดช้า จนถึงทำงานช้าได้ครับ
โดยส่วนตัวมองว่าไม่ควรเอารายการมากขนาดนั้นมาไว้ในดรอบดาวน์ (ไม่ทราบเหมือนกันว่าจำเป็นอย่างไร) ถ้าต้องการเอารายการมาใส่ดรอบดาวน์ น่าจะใส่เงื่อนไขที่พอเพียงสำหรับงานนั้นๆ เพื่อลดปริมาณรายการลง แล้วยังทำให้ผู้ใช้งานสะดวกขึ้นด้วย....
ก่อนจะมาเป็นดรอบดาวน์อันนี้ น่าจะให้ผู้ใช้ระบุข้อมูลให้แคบลงก่อนน่าจะดีกว่านะครับ หรือถ้ามันไม่สามารถระบุให้แคบลงได้ ก็ใช้หน้าของการเลือกข้อมูลแสนรายการนี้เป็นการดำเนินการขั้นตอนก่อนจะไปหน้าต่อไปก็ได้
ผมมองว่าการคอนเนคชั่นบ่อยๆ น่าจะดีกว่าคิวรี่นานๆ ทั้งนี้ขึ้นอยู่กับระบบแต่ละระบบนะครับ
อาจใช้วิธีการโหลดด้วย Ajax ก็ได้นะครับ โดยการใช้หลักการเหมือน จังหวัด อำเภอ ตำบล ด้วย Ajax โดยการแบ่งกลุ่มของข้อมูลออกเป็นกลุ่มๆ (แล้วแต่ความสัมพันธ์ของข้อมูล) หรือ ถ้าหาความสัมพันธ์ไม่ได้ อาจต้องใช้วิธีแบ่งตามตัวอักษร ก้ได้ครับ
คำแนะนำที่จำเป็น เพื่อให้โหลดเร็ว และหาข้อมูลที่ต้องการได้ง่าย ควรจัดแบ่งกลุ่มของข้อมูลออกเป็นกลุ่มย่อยๆ ให้ข้อมูลในแต่ละกลุ่มเล็กที่สุด อาจจะมีหลายๆกลุ่มก็ได้ โดยพยายามดูจากพฤติกรรมของผู้ใช้ (เดา) ว่าผู้ใช้ น่าจะพยายามมองหาข้อมูลอะไรก่อน เป็นลำดับจาก dropdown
ยกตัวอย่างเช่น การหาตำบล ควรเริ่มจาก การหาจังหวัดก่อน แล้วก็ไปเลือกอำเภอ แล้วจึงไปเลือกตำบล ซึ่งจะทำให้หาง่ายกว่า การแสดงรายการตำบลทั้ง 77 จั้งหวัด ในลิสต์รายการเดียวให้หา
ข้อมูลที่นำมาใช้เป็นข้อมูลของชื่อเรือครับ ไม่สามารถคัดกรองได้ เวลาหาก้อหาทั้งหมดทีเดียว
กำลังคิดถึงวิธีของการทำ autocomplete ครับ แต่ในเว็บนี้ เท่าที่หาดูยังไม่มีครับ(รึเปล่า)
ลองหาจากข้างนอก ก้อมีเยอะ แต่ที่ใช้กับภาษาไทยได้ยังไม่มี
มีคำแนะนำเกี่ยวกับเรื่องนี้มั๊ยครับ
หรืออีกวิธีนึงก้อคือทำ popup ขึ้นมาให้เลือกแล้ว return ค่ากลับมายัง main form
เท่าที่คิดได้ตอนนี้ครับ
ขอบคุณครับ
ตอนนี้ผมเปลี่ยนจาก dropdown มาเป็น auto complete แล้วครับ ก็ได้ผลดีขึ้นเยอะ หลักการทำงานก็เหมือนกับ คห.8 คือหาจากตัวแรกก่อนแล้วจากนั้นก้อหาจากกลุ่มของชุดแรกที่ค้นเจอ
แต่ทีนี้ติดปัญหานิดนึงครับ
ทดสอบกับ google chrome สามารถแสดงรายการได้ปกติ
ทดสอบกับ firefox สามารถแสดงรายการได้ปกติ
ผมทดสอบกับ ie ที่บ้านทำงานได้ปกติ
แต่ที่ทำงาน มันแสดงรายการลิสมาให้ แต่ไม่มีตัวอักษร ในรายการ ต้องเอาเมาท์คลิก ถึงจะ return ค่ากลับมาใส่ text box
ผมต้องแก้ยังไงครับ
<input name="vesselName" type="text" id="vesselName" size="50" />
<input name="VesselId" type="hidden" id="VesselId" value="" />
<script type="text/javascript">
function make_autocom(autoObj,showObj){
var mkAutoObj=autoObj;
var mkSerValObj=showObj;
new Autocomplete(mkAutoObj, function() {
this.setValue = function(id) {
document.getElementById(mkSerValObj).value = id;
}
if ( this.isModified )
this.setValue("");
if ( this.value.length < 1 && this.isNotClick )
return ;
// return "gdata.php?q=" + this.value;
return "gdata.php?q=" + decodeURIComponent(this.value);
});
}
make_autocom("vesselName","VesselId");
</script>
//-----------------------------------------------------
gdata.php
<?php
header("Content-type:text/html; charset=tis-620");
// เชื่อมต่อฐานข้อมูล
$link=mysql_connect("localhost","xxx","yyy") or die("error".mysql_error());
mysql_select_db("xy",$link);
mysql_query("SET NAMES TIS620");
$q = $_GET["q"];
$pagesize = 50; // จำนวนรายการที่ต้องการแสดง
$table_db="tblvessel"; // ตารางที่ต้องการค้นหา
$find_field="vesselName"; // ฟิลที่ต้องการค้นหา
echo $sql = "select * from $table_db where locate('$q', $find_field) > 0 order by locate('$q', $find_field), $find_field limit $pagesize";
$results = mysql_query($sql);
while ($row = mysql_fetch_array( $results )) {
$id = $row["RecId"]; // ฟิลที่ต้องการส่
$name = ucwords( $row["vesselName"] ); // ฟิลที่ต้องการแงค่ากลับ
//$name = ucwords( ( $row["vesselName"] ) ); // ฟิลที่ต้องการแงค่ากลับ
// ป้องกันเครื่องหมาย '
$name = str_replace("'", "'", $name);
// กำหนดตัวหนาให้กับคำที่มีการพิมพ์
$display_name = preg_replace("/(" . $q . ")/i", "<b></b>", $name);
echo "<li onselect=\"this.setText('$name').setValue('$id');\">$display_name</li>";
}
mysql_close();
?>
ถ้าใช่ ลองเปลี่ยน tag เป็น tag อื่น ที่ไม่ใช่ li เช่น อาจใช้ p สำหรับแต่ละแถว แทน
หรือ ลองดูตามนี้ IE 8 มันมากับเรื่องปวดหัว