|
|
|
ถามเรื่องการ return ค่าจากใน Callback ของ jQuery ไปให้functionอื่นครับ |
|
|
|
|
|
|
|
ฟังก์ชัน Callback Parameters มันรับค่าอะไรมาครับ?
|
|
|
|
|
Date :
2013-02-13 16:22:10 |
By :
ALTELMA |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลองเปลี่ยน call back data เป็นตัวอักษรดูดีกว่าครับ เช่น "Existing"
<script>
var checkError = false;
function check(){
$('.PagePanel input').each(function(){
var getvalid = $(this).attr('id');
var getvalues = $('#'+getvalid).val();
if(getvalues == ""){
checkError |= true;
}else{
$.get('checkEmailUsed.php',{email:getvalues},function(data){
if(data == "Existing"){
checkError |= true;
}else{
checkError |= false;
}
return checkError;
});
}
});
if(checkError == false){
alert('?????????');
}else{
alert('????????????????');
}
</script>
|
|
|
|
|
Date :
2013-02-13 16:24:45 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.each() ใช้สำหรับค้นหา element ที่อยู่ในขอบเขตที่เราระบุเอาไว้ เช่น
<script src="http://code.jquery.com/jquery-latest.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
<div id="line1">
A:<input type="text" value="AA" /> <br />
B:<input type="text" value="BB" /> <br />
C:<input type="text" value="CC" /> <br />
D:<input type="text" value="DD" /> <br />
<div>
<script>
$("div#line1 input").each(function(){
alert($(this).val());
});
</script>
|
|
|
|
|
Date :
2013-02-13 16:36:06 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมก็นะ อยู่ในวงการนี้มานานพอควร แต่ไม่เคยเห็น |= ครับ
เคยเห็นแต่
!= ไม่เท่ากับ
= กำหนดค่า
+= กำหนดค่าแบบต่อสตริง
|
|
|
|
|
Date :
2013-02-13 16:37:08 |
By :
triplea |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
และลักษณะโค้ดเช่นนี้ ไม่เรียกว่าการ return ค่าครับ
เหมือนผมเห็นหลายๆคน
ทั้งเด็ก จบใหม่ จบเก่า หรือผู้ใหญ่บางคน
เรียก
java แทนความหมาย javascript
|
|
|
|
|
Date :
2013-02-13 16:42:27 |
By :
triplea |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมว่า จขกท. เข้าใจถูกแล้วครับ แต่อาจปรับแก้นิดหน่อย
ถามเรื่องการ return ค่าจาก Callback function ครับ
สรุปแล้วได้ลองเปลี่ยนค่าที่ return กลับมาจากไฟล์ checkEmailUsed.php .ให้เป็น echo "Existing"; แทน 0 | 1 หรือยังครับ
|
ประวัติการแก้ไข 2013-02-13 16:55:59
|
|
|
|
Date :
2013-02-13 16:52:50 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอบความคิดเห็นที่ : 10 เขียนโดย : sirbabank เมื่อวันที่ 2013-02-13 16:50:22
รายละเอียดของการตอบ ::
ขออภัยครับ
ผมลืมว่า จขกท ใช้ logical operand
ผมขออภัยจริงๆ ที่บอกว่าไม่เคยเห็น
เอาเป็นว่า |= ผมขออภัย
แต่เรื่องการ return ค่า
จขกท ยังเข้าใจไม่ถูกต้อง
จะให้บอกทั้งหมดก็ใช่ที่
แต่แนะนำ จขกท ไว้ว่า
ที่ จขกท ทำอยู่ มันเป็นเรื่อง ของ scope variable ครับ
ซึ่งคำสั่ง return อะไรนั่น ไม่ได้สำคัญอะไรเลย (ตามโค้ดที่ให้มา)
ลองดูอีกทีครับ ถ้าไม่ได้จริงๆ มาใหม่ แล้วจะแนะนำอีกที
|
|
|
|
|
Date :
2013-02-13 16:56:30 |
By :
triplea |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เส้นผมบังภูเขา
ผิดที่ |= นั่นแหละครับ
เป็น bitwise or assignment
เพราะถ้าเราใช้ |=
หากมีการเซ็ตค่า checkError ให้เป็นจริงไปแล้วครั้งนึง
มันจะไม่มีทางกลับมาเป็น false ได้เลยครับ
ให้ใช้ = ปกติครับ
checkError = true;
|
|
|
|
|
Date :
2013-02-13 17:03:59 |
By :
cookiephp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ทำไมไม่ปรับแนวคิดเสียใหม่ ทำให้ยุ่งยากน้อยลงดีกว่า
<script>
function check(){
$('.PagePanel input').each(function(){
var getvalid = $(this).attr('id');
var getvalues = $('#'+getvalid).val();
if(getvalues == ""){
alert('คุณป้อนข้อมูลไม่ครบทุกช่อง!!!');
}else{
$.get('checkEmailUsed.php',{email:getvalues},function(data){
if(data == "Existing"){
alert('อีเมล์นี้มีอยู่ในฐานข้อมูลแล้ว กรุณาตรวจสอบอีกครั้งครับ');
}else{
alert('คุณสามารถใช้อีเมล์นี้ได้ '+getvalues );
}
});
}
});
</script>
|
|
|
|
|
Date :
2013-02-13 17:04:34 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ครับ เอาจริงๆ ผมไม่ได้มองขนาดนั้น
เพราะผมเห็น |= ก่อนอย่างอื่น เพราะมันเบสิคสุด
|
|
|
|
|
Date :
2013-02-13 17:25:03 |
By :
cookiephp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ดูหมดแล้วครับ
จะเฉลยให้ครับ ว่าทำไม
จริงๆ มันเป็นเรื่องของ "เวลาที่ตรวจสอบ" ค่า checkError ครับ
ดูตรงนี้ดีๆ นะครับ
Code (JavaScript)
$.get('checkEmailUsed.php',{email:getvalues}, function(data) {
if(data == 1) {
checkError |= true;
} else {
checkError |= false;
}
return checkError;
});
callback นี้จะถูกทำงานก็ต่อเมื่อ มีการติดต่อไปยังเซิร์ฟเวอร์ และรัน checkEmailUsed.php เรียบร้อย
"ซึ่ง" กว่าจะถึงตอนนั้น เราก็ได้เสร็จสิ้นการทำงานของ ฟังก์ชั่น check() ไปแล้วครับ
Code (JavaScript)
function check() {
var checkError = false;
$('.PagePanel :input').each(function() {
var getvalid = $(this).attr('id');
var getvalues = $('#'+getvalid).val();
if(getvalues == "") {
// เงือนไข #1
checkError |= true;
} else {
// เงือนไข #2
// ตรงนี้จะทำงานท้ายสุด หลังจบฟังก์ชั่น check() ไปแล้ว
// เพราะมันเป็น async function
$.get('checkEmailUsed.php',{email:getvalues}, function(data) {
if(data == 1) {
checkError |= true;
} else {
checkError |= false;
}
return checkError;
});
}
});
// ดังนั้นเมื่อมาตรวจสอบตรงนี้ จะเป็นจริงได้ในเงื่อนไข #1 เท่านั้น
// แต่เงื่อนไข #2 จะไม่มีวันเป็นจริงเลย
if(checkError == false) {
alert('เรียบร้อย');
} else {
alert('กรอกข้อมูลไม่ครบ');
}
}
get กันมั้ยครับ
|
|
|
|
|
Date :
2013-02-13 17:40:52 |
By :
cookiephp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Date :
2013-02-13 17:45:12 |
By :
sakuraei |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Date :
2013-02-13 17:48:32 |
By :
weaned |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ดังนั้นแนวคิดในการแก้คือ
ตอน submit ฟอร์มเนี่ย
ก็ให้เราตรวจสอบเบื้องต้นก่อน ว่ากรอกข้อมูลครบยัง ถ้ายังไม่ครบ ก็แสดงเลยว่ากรอกไม่ครบ และไม่ให้ผ่าน
แต่ถ้ากรอกครบแล้วทั้งหมด ก็ให้เริ่มตรวจสอบข้อมูลที่จำเป็นต้องตรวจสอบระยะไกล
โดยให้ส่งข้อมูล "ทั้งหมด" ไปตรวจ ไม่ใช่ส่งไปตรวจทีละอัน เสียเวลาเปล่า
ระหว่างนั้นก็ให้ disabled ปุ่ม submit ของฟอร์ม
และค่อย enable มันกลับหลังจากได้ผลกลับมาจาก server แล้ว
Code (JavaScript)
// สมมติมีตัวแปรที่อ้างถึงฟอร์มชื่อ form
// สมมติมีตัวแปรที่อ้างถึงปุ่ม submit ชื่อ form.submitButton
function check() {
var emails = []; // Array ของอีเมล์ทั้งหมด
var inputs = $('.PagePanel :input');
// ลูป jquery object ทั้งหมด สังเกตว่าเราเรียก $() แค่ครั้งเดียว เร็วกว่ามาก
for (var i = 0; i < inputs.length; i++) {
var email = inputs[i].val();
if(email == "") { // ถ้ามีอันหนึ่งอันใดไม่ได้กรอก
alert("กรอกข้อมูลไม่ครบ");
return; // ออกเลย ไม่ต้องเสียเวลามาเช็คอีกครั้ง
}
emails.push(email);
});
form.submitButton.disabled = true; // ทำให้ปุ่ม submit ใช้งานไม่ได้
// เราเรียก get แค่ครั้งเดียว โดยส่งข้อมูลทั้งหมดไปตรวจ แทนที่จะส่งไปตรวจหลายๆ ครั้ง
$.get(
"checkEmailUsed.php",
// ส่ง email ทั้งหมดไปตรวจ โดยรวมกันด้วย \n ซึ่งทางฝั่งเซิร์ฟเวอร์ก็ใช้ explode() แยกเอา
{ email: emails.join("\n") },
function (data) {
form.submitButton.disabled = false; // ทำให้ปุ่ม submit ใช้งานได้อีกครั้ง
if (data != "1") {
alert("มีอีเมล์ที่ใช้งานไม่ได้");
return;
}
// ทำการ submit ฟอร์มตรงนี้
form.submit();
}
);
}
|
|
|
|
|
Date :
2013-02-13 18:05:50 |
By :
cookiephp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
โค้ดให้เป็นแนวคิดนะครับ คงเอาไปใช้เลยไม่ได้
|
|
|
|
|
Date :
2013-02-13 18:06:48 |
By :
cookiephp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่แนะนำให้ใช้ sync นะครับ อาจจะทำให้เพจค้างหากเซิร์ฟเวอร์ไม่ตอบกลับเป็นเวลานานๆ (กรณีเซิร์ฟเวอร์ทำงานช้า หรือล่ม)
|
|
|
|
|
Date :
2013-02-13 18:16:32 |
By :
cookiephp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณพี่น้องเปรม มากๆครับ
อุตส่าสละเวลาไปเทสมาให้ ^^
|
|
|
|
|
Date :
2013-02-13 18:17:55 |
By :
sirbabank |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่ได้เทสต์ครับ แค่อ่านและวิเคราะห์เฉยๆ ผมไม่ทุ่มเทขนาดนั้นหรอกครับ 555
|
|
|
|
|
Date :
2013-02-13 18:29:25 |
By :
cookiephp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 01
|