<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jQuery, Ajax, PHP, JSON, XML, Web Technologies &#187; jQuery</title>
	<atom:link href="http://blog.chonla.com/category/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chonla.com</link>
	<description>คุยกันเรื่อง jQuery, Ajax, PHP, JSON, XML และ Web Technologies เป็นภาษาไทยกันดีกว่า</description>
	<lastBuildDate>Thu, 02 Sep 2010 18:43:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>ปลั๊กอิน BBCode สำหรับ jQuery</title>
		<link>http://blog.chonla.com/2009/11/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-bbcode-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/</link>
		<comments>http://blog.chonla.com/2009/11/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-bbcode-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 10:33:23 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Homemade Plugin]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Souce Code]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[BBCode]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Regular Expression]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=245</guid>
		<description><![CDATA[วันนี้ผมลองเขียน plugin แก้ขัดที่หายหน้าหายตาไปนานมาให้ลองกันครับ นั่นก็คือปลั๊กอินที่ใช้ render BBCode ครับ ใครที่เป็นนักโพสเว็บบอร์ดคงจะรู้จักกันดีว่า BBCode คืออะไร สำหรับใครที่ยังไม่รู้จักก็อ่านย่อหน้าถัดไปได้เลยครับ BBCode เราเรียกได้ว่าเป็น lightweighted markup language ใช้สำหรับจัดรูปแบบข้อความตามเว็บบอร์ดต่าง ๆ ครับ มีลักษณะของแท็กอยู่ในเครื่องหมายก้ามปู เช่น [b]ตัวหนา[/b] ครับ เจ้าตัว BBCode นี่เว็บบราวเซอร์มันไม่รู้จักครับ ต้องทำการแปลไปเป็น markup language ที่ใช้ทั่ว ๆ ไปก่อนครับ นั่นก็คือ HTML หรือ XHTML ครับ เช่น จาก [b]ตัวหนา[/b] จะถูกแปลงไปเป็น &#60;b&#62;ตัวหนา&#60;/b&#62; แล้วค่อยนำไปแสดงผลครับ จุดประสงค์หลัก ๆ ของ BBCode คือ เพื่อให้ผู้ใช้สามารถจัดรูปแบบข้อความได้ง่ายขึ้น รวมไปถึงเพื่อความปลอดภัยของการแสดงผลข้อความที่โพสโดยผู้ใช้ด้วยครับ เช่น การควบคุมการใช้งาน javascript การควบคุมให้ใช้ tag [...]]]></description>
			<content:encoded><![CDATA[<p>วันนี้ผมลองเขียน plugin แก้ขัดที่หายหน้าหายตาไปนานมาให้ลองกันครับ นั่นก็คือปลั๊กอินที่ใช้ render BBCode ครับ ใครที่เป็นนักโพสเว็บบอร์ดคงจะรู้จักกันดีว่า BBCode คืออะไร สำหรับใครที่ยังไม่รู้จักก็อ่านย่อหน้าถัดไปได้เลยครับ</p>
<p>BBCode เราเรียกได้ว่าเป็น lightweighted markup language ใช้สำหรับจัดรูปแบบข้อความตามเว็บบอร์ดต่าง ๆ ครับ มีลักษณะของแท็กอยู่ในเครื่องหมายก้ามปู เช่น [b]ตัวหนา[/b] ครับ เจ้าตัว BBCode นี่เว็บบราวเซอร์มันไม่รู้จักครับ ต้องทำการแปลไปเป็น markup language ที่ใช้ทั่ว ๆ ไปก่อนครับ นั่นก็คือ HTML หรือ XHTML ครับ เช่น จาก [b]ตัวหนา[/b] จะถูกแปลงไปเป็น &lt;b&gt;ตัวหนา&lt;/b&gt; แล้วค่อยนำไปแสดงผลครับ<br />
<span id="more-245"></span><br />
จุดประสงค์หลัก ๆ ของ BBCode คือ เพื่อให้ผู้ใช้สามารถจัดรูปแบบข้อความได้ง่ายขึ้น รวมไปถึงเพื่อความปลอดภัยของการแสดงผลข้อความที่โพสโดยผู้ใช้ด้วยครับ เช่น การควบคุมการใช้งาน javascript การควบคุมให้ใช้ tag ภายในข้อกำหนด เป็นต้น</p>
<p>เจ้าตัว BBCode เนี่ย มันไม่มีข้อกำหนดเป็นมาตรฐาน เพียงแค่มีการใช้งานโดยทั่วไปตามเว็บบอร์ดเวอร์ชั่นใหม่ ๆ ทั่วไปครับ รายละเอียดรูปแบบคำสั่ง สามารถตามไปดูในหัวข้ออ้างอิงท้ายบทความได้เลยครับ</p>
<p>ทีนี้มาดูกันว่าปลั๊กอินตัวนี้จะทำงานยังไงครับ</p>
<p>ง่าย ๆ ครับ แค่เรียก $(&lt;selector&gt;).bbcode(); เท่านั้นครับ เช่น</p>
<pre class="js">$("div").bbcode();</pre>
<p>ไอเดียของปลั๊กอินตัวนี้ผมได้มาจากตอนเขียนแก้บักการแสดงผล BBCode ให้เก็บเว็บไซต์หนึ่งครับ ปกติแล้วการ render จาก BBCode ไปเป็น HTML นั้น มักจะทำที่ Server และส่ง HTML ที่ได้มาให้บราวเซอร์แสดงผล แต่ผมต้องการที่จะลดโหลดฝั่ง Server ลง โดยจะย้ายการทำงานจากฝั่ง Server มาทำที่บราวเซอร์แทน</p>
<p>หลักการทำงานก็ไม่มีอะไรมากครับ ผมใช้วิธีการกำหนดค่า Pattern ในรูปแบบ Regular Expression และใช้ Regular Expression Engine ของ JavaScript ในการแสดงผลให้ถูกต้องเท่านั้นครับ</p>
<p>ลองไปดูที่ <a title="BBCode Plugin for jQuery" href="http://sandbox.chonla.com/bbcode/" target="_blank">LIVE DEMO</a> กันเลยครับ</p>
<p><span style="text-decoration: underline;">อ้างอิง</span></p>
<ul>
<li><span style="background-color: #ffffff;"><a title="BBCode" href="http://en.wikipedia.org/wiki/BBCode" target="_blank">http://en.wikipedia.org/wiki/BBCode</a></span></li>
</ul>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/11/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-bbcode-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Method Chaining ใน PHP ทำเองก็ได้ง่ายจัง</title>
		<link>http://blog.chonla.com/2009/09/method-chaining-%e0%b9%83%e0%b8%99-php-%e0%b8%97%e0%b8%b3%e0%b9%80%e0%b8%ad%e0%b8%87%e0%b8%81%e0%b9%87%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%87%e0%b9%88%e0%b8%b2%e0%b8%a2%e0%b8%88%e0%b8%b1%e0%b8%87/</link>
		<comments>http://blog.chonla.com/2009/09/method-chaining-%e0%b9%83%e0%b8%99-php-%e0%b8%97%e0%b8%b3%e0%b9%80%e0%b8%ad%e0%b8%87%e0%b8%81%e0%b9%87%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%87%e0%b9%88%e0%b8%b2%e0%b8%a2%e0%b8%88%e0%b8%b1%e0%b8%87/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 19:03:09 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Object Oriented]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Chainability]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=228</guid>
		<description><![CDATA[บทความนี้ได้แรงบันดาลใจมาจาก chainability ของ jQuery และ query builder ของ kohana (จริง ๆ ผมเข้าใจว่า query builder มีอยู่ใน php framework ตัวอื่นด้วย แต่พอดีท่านรุ่งจากบ้าน PHP.DeeServer.net ซึ่งแนะนำให้ผมรู้จักกับ kohana เค้าแนะนำตัวที่อยู่ใน kohana มาครับ) ไอเดียหลัก ๆ ของการทำ chaining ก็คือ การทำให้มันสามารถเรียกต่อกันได้เป็นทอด ๆ นั่นเอง ยกตัวอย่างใน jQuery ซึ่งมีคุณสมบัติที่เรียกว่า chainability อยู่ ทำให้เราสามารถเรียกคำสั่งได้แบบนี้ $("#submenu").addClass("whitemenu").show("slow"); จะเห็นได้ว่า เราสามารถเรียก .show ต่อเนื่องได้เลย นี่เองที่ทำให้เกิดการเรียกอย่างต่อเนื่อง หรือ การทำ Method chaining นั่นเอง ใน PHP เราสามารถทำให้ object มีคุณสมบัติเดียวกันนี้ได้เช่นกัน [...]]]></description>
			<content:encoded><![CDATA[<p>บทความนี้ได้แรงบันดาลใจมาจาก <a href="http://blog.chonla.com/2008/11/เมื่อฟ้าส่ง-chainability-มาให้กับ-jquery/" target="_blank" title="เมื่อฟ้าส่ง Chainability มาให้กับ jQuery">chainability</a> ของ <a href="http://www.jquery.com" target="_blank" title="jQuery - The Write Less, Do More, JavaScript Library">jQuery</a> และ query builder ของ <a href="http://www.kohanaphp.com/" target="_blank" title="Kohana - The swift PHP Framework">kohana</a> (จริง ๆ ผมเข้าใจว่า query builder มีอยู่ใน php framework ตัวอื่นด้วย แต่พอดีท่านรุ่งจากบ้าน <a href="http://php.deeserver.net" target="_blank" title="PHP.DeeServer.Net">PHP.DeeServer.net</a> ซึ่งแนะนำให้ผมรู้จักกับ kohana เค้าแนะนำตัวที่อยู่ใน kohana มาครับ)</p>
<p>ไอเดียหลัก ๆ ของการทำ chaining ก็คือ การทำให้มันสามารถเรียกต่อกันได้เป็นทอด ๆ นั่นเอง ยกตัวอย่างใน jQuery ซึ่งมีคุณสมบัติที่เรียกว่า chainability อยู่ ทำให้เราสามารถเรียกคำสั่งได้แบบนี้</p>
<pre name="code" class="js">
$("#submenu").addClass("whitemenu").show("slow");
</pre>
<p>จะเห็นได้ว่า เราสามารถเรียก .show ต่อเนื่องได้เลย นี่เองที่ทำให้เกิดการเรียกอย่างต่อเนื่อง หรือ การทำ Method chaining นั่นเอง<br />
<span id="more-228"></span></p>
<p>ใน PHP เราสามารถทำให้ object มีคุณสมบัติเดียวกันนี้ได้เช่นกัน เพียงแต่น่าเสียดายที่คุณสมบัตินี้ มีอยู่ใน PHP ตั้งแต่เวอร์ชั่น 5 ขึ้นไปเท่านั้น สำหรับคนที่ยังใช้ PHP4 อยู่ ผมต้องขอแสดงความเสียใจด้วยครับ ฮ่า ๆ และคาดว่าเหตุนี้เองที่ทำให้ kohana สามารถใช้งานได้กับ PHP5 ขึ้นไปเท่านั้น</p>
<p>หลักการง่าย ๆ ที่ทำให้เราสามารถทำ Method chaining ได้ก็คือ การเขียน class และทำการคืนค่าของ object มันเองกลับออกมาหลังจากที่จบ method ทำนองเดียวกับใน jQuery ตอนที่เขียน plugin </p>
<p>ตอนจบ เราก็จะทำการ return jQuery object กลับออกมาให้เช่นเดียวกัน</p>
<p>ลองมาดูตัวอย่างใน PHP กันดีกว่าครับ</p>
<pre name="code" class="js">
// php5 only
class Database
{
	private $link;

	private $table;
	private $field;
	private $condition;
	private $order;
	private $result;

	// connection functions
	function __construct($config)
	{
		$this->flush();
		$this->link = null;
		$this->connect($config["hostname"],
				$config["username"],
				$config["password"],
				$config["database"]);
	}

	function __destruct()
	{
		$this->disconnect();
	}

	function connect($host = "",
				$user = "",
				$password = "",
				$db = "")
	{
		if ($this->link !== null)
			$this->disconnect();

		$this->link = mysql_connect($host, $user, $password);

		if ($this->link === FALSE)
		{
			echo $this->err();
		}
		else
		{
			if ($db !== "")
			{
				return $this->db($db);
			}
		}
		return $this;
	}

	function disconnect()
	{	// break chain
		if ($this->link !== null)
			mysql_close($this->link);
		$this->link = null;
	}

	function db($db)
	{
		if (mysql_select_db($db, $this->link) === FALSE)
			echo $this->err();
		return $this;
	}

	function errno()
	{
		return mysql_errno($this->link);
	}

	function ok()
	{
		return ($this->errno() == 0);
	}

	function err()
	{	// break chain
		return mysql_error($this->link);
	}

	function execute($sql)
	{
		$this->result = mysql_query($sql, $this->link);
		return $this;
	}

	function records()
	{
		$result = array();
		if ($this->result !== FALSE)
		{
			while (($row = mysql_fetch_assoc($this->result)) !== FALSE)
			{
				$result[] = $row;
			}
		}
		return $result;
	}

	function flush()
	{
		$this->table = "";
		$this->field = "";
		$this->condition = "";
		$this->order = "";
		$this->result = null;
		return $this;
	}

	function safe($value)
	{
		if (!get_magic_quotes_gpc())
		{
			$value = addslashes($value);
		}
		return "'$value'";
	}

	function table($table)
	{
		$this->table = $table;
		return $this;
	}

	function field($field)
	{
		$this->field = $field;
		return $this;
	}

	function condition($condition)
	{
		if (is_array($condition))
		{
			$cond = array();
			foreach ($condition as $f => $v)
			{
				$cond[] = "($f = " . $this->safe($v) . ")";
			}
			$condition = implode(" AND ", $cond);
		}
		$this->condition = $condition;
		return $this;
	}

	function top($num = 1)
	{
		$field = $this->field;
		if ($field == "") $field = "*";
		$sql = "SELECT {$field} FROM {$this->table}";
		if ($this->condition !== "")
			$sql .= " WHERE {$this->condition}";
		if ($this->order !== "")
			$sql .= " ORDER BY {$this->order}";
		$sql .= " LIMIT 0, {$num}";
		return $this->execute($sql)->records();
	}

	function all()
	{
		$field = $this->field;
		if ($field == "") $field = "*";
		$sql = "SELECT {$field} FROM {$this->table}";
		if ($this->condition !== "")
			$sql .= " WHERE {$this->condition}";
		if ($this->order !== "")
			$sql .= " ORDER BY {$this->order}";
		return $this->execute($sql)->records();
	}

	function order($order)
	{
		$this->order = $order;
		return $this;
	}
}
</pre>
<p>code ด้านบนนี้ เป็น code ที่ผมทดสอบ โดยทำเป็นไอเดียเริ่มต้นง่าย ๆ สำหรับการทำ query builder จะเห็นได้ว่า หลาย ๆ method จะมีการ return ตัว object มันเอง ($this) ไอเดียหลักในการกำหนดว่า method ไหนที่ผม return หรือไม่ return $this ก็คือ มีความจำเป็นในการเรียก method ต่อจากนี้หรือไม่นั่นเอง</p>
<p>การใช้งานก็ไม่ได้ยุ่งยากอะไร</p>
<pre name="code" class="js">
$dbconf = array(
	"hostname" => "localhost",
	"username" => "root",
	"password" => "123456",
	"database" => "test"
);
$db = new Database($dbconf);
$rows = $db->table("products")
		->field("product_id, product_name")
		->condition(array(
				"product_group"=>"tyre",
				"product_model"=>"Eagle"))
		->top();
print_r($rows);
</pre>
<p>จากตัวอย่างด้านบน เป็นการ select หา product จาก table products โดยกำหนด criteria ในการค้นหาเป็น product_group = &#8216;tyre&#8217; และ product_model = &#8216;Eagle&#8217; โดยจะเลือกเอาเฉพาะ record แรกสุดเท่านั้น</p>
<p>เห็นมั๊ยครับ หลักการง่าย ๆ แค่ return $this เองครับ ที่สำคัญ อย่าลืมนะครับ PHP5 ขึ้นไปนะครับ</p>
<p>ขอให้สนุกกับการเขียนโปรแกรมครับ</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/09/method-chaining-%e0%b9%83%e0%b8%99-php-%e0%b8%97%e0%b8%b3%e0%b9%80%e0%b8%ad%e0%b8%87%e0%b8%81%e0%b9%87%e0%b9%84%e0%b8%94%e0%b9%89%e0%b8%87%e0%b9%88%e0%b8%b2%e0%b8%a2%e0%b8%88%e0%b8%b1%e0%b8%87/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>ปลั๊กอิน Image rescale สำหรับ jQuery</title>
		<link>http://blog.chonla.com/2009/08/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-image-rescale-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/</link>
		<comments>http://blog.chonla.com/2009/08/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-image-rescale-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 19:49:08 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Homemade Plugin]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Rescale]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=207</guid>
		<description><![CDATA[ช่วงนี้มีโอกาสได้ลองทำ plugin มาใช้กับ jQuery หลายตัวครับ Image rescale plugin นี่เป็นตัวหนึ่งครับ จริง ๆ แล้ว rescale image ด้วย jQuery มันไม่ใช่เรื่องใหญ่โต หรือยุ่งยากมากมายอะไร เพียงแค่ว่า ผมอยากได้แบบที่เป็น plugin ครับ และผมหามันไม่เจอ แค่นั้นเองครับ เลยบ้าพลัง เขียนเองซะเลยครับ หลักการง่าย ๆ กับการทำ rescale กับรูปภาพคือ การคง aspect ratio ของภาพไว้ นั่นคือ ถ้าภาพขนาด 4:3 หมายถึง กว้าง 800 pixels สูง 600 pixels เมื่อย่อลงไปเหลือขนาด กว้าง 200 pixels แล้ว จะต้องได้ความสูง 150 pixels (อัตราส่วนเดิมคือ 4:3 [...]]]></description>
			<content:encoded><![CDATA[<p>ช่วงนี้มีโอกาสได้ลองทำ plugin มาใช้กับ jQuery หลายตัวครับ Image rescale plugin นี่เป็นตัวหนึ่งครับ จริง ๆ แล้ว rescale image ด้วย jQuery มันไม่ใช่เรื่องใหญ่โต หรือยุ่งยากมากมายอะไร เพียงแค่ว่า ผมอยากได้แบบที่เป็น plugin ครับ และผมหามันไม่เจอ แค่นั้นเองครับ เลยบ้าพลัง เขียนเองซะเลยครับ<br />
<span id="more-207"></span><br />
หลักการง่าย ๆ กับการทำ rescale กับรูปภาพคือ การคง aspect ratio ของภาพไว้ นั่นคือ ถ้าภาพขนาด 4:3 หมายถึง กว้าง 800 pixels สูง 600 pixels เมื่อย่อลงไปเหลือขนาด กว้าง 200 pixels แล้ว จะต้องได้ความสูง 150 pixels (อัตราส่วนเดิมคือ 4:3 นั่นเอง)</p>
<p>หลังจากนั้น ก็มาถึงสิ่งที่ผมอยากให้ plugin ตัวนี้มี นั่นก็คือ การกำหนดความกว้าง หรือความสูงสูงสุด นั่นคือ ถ้าผมกำหนดให้ความกว้างที่มากที่สุดมีค่าเป็น 200 pixels และภาพต้นฉบับมีความกว้างเป็น 1024 pixels ภาพที่ย่อแล้ว จะเหลือความกว้างเป็น 200 pixels นั่นเอง</p>
<p>รูปแบบการใช้งาน</p>
<pre class="js">$.imgrescale(options);</pre>
<p>โดยที่ options ในตอนนี้มีแค่ตัวเดียวครับ คือ maxsize ดังนั้นถ้าต้องการกำหนดค่า maxsize ก็จะเรียกแบบนี้ครับ</p>
<pre class="js">$.imgrescale({maxsize:200});</pre>
<p>ลองดูตัวอย่างที่ <a title="LIVE DEMO: jQuery Image Rescale Plugin" href="http://sandbox.chonla.com/imgrescale" target="_blank">LIVE DEMO</a> ได้เลยครับ</p>
<p>สำหรับ source code ที่เป็น minified ก็<a title="jQuery Plugin : MINIFIED IMAGE RESCALE JS" href="http://sandbox.chonla.com/imgrescale/js/jquery.imgrescale.min.js" target="_blank">ดาวน์โหลดได้จากที่นี่เลยครับ</a></p>
<p>ใช้ดีอย่าลืม feedback แล้วบอกต่อนะครับ <img src='http://blog.chonla.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>อ้างอิง</p>
<ul>
<li>Aspect Ratio: <a href="http://en.wikipedia.org/wiki/Aspect_ratio_(image)">http://en.wikipedia.org/wiki/Aspect_ratio_(image)</a></li>
</ul>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/08/%e0%b8%9b%e0%b8%a5%e0%b8%b1%e0%b9%8a%e0%b8%81%e0%b8%ad%e0%b8%b4%e0%b8%99-image-rescale-%e0%b8%aa%e0%b8%b3%e0%b8%ab%e0%b8%a3%e0%b8%b1%e0%b8%9a-jquery/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ทำ floating ads ไว้ใช้เอง</title>
		<link>http://blog.chonla.com/2009/07/%e0%b8%97%e0%b8%b3-scroll-ads-%e0%b9%84%e0%b8%a7%e0%b9%89%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b9%80%e0%b8%ad%e0%b8%87/</link>
		<comments>http://blog.chonla.com/2009/07/%e0%b8%97%e0%b8%b3-scroll-ads-%e0%b9%84%e0%b8%a7%e0%b9%89%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b9%80%e0%b8%ad%e0%b8%87/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 17:13:37 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Homemade Plugin]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Souce Code]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[floating layers]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=201</guid>
		<description><![CDATA[เดิมที ผมได้โปรเจคจากผู้ว่าจ้างให้ทำ floating video เหมือนในเว็บ http://www.radiopublicity.com/ พอได้ลองเข้าไปดู code ที่เค้าเขียน รู้สึกว่ามันช่างซับซ้อนซ่อนเงื่อนเหลือเกิน ไม่ต้องพูดถึงเรื่อง reusability ครับ ยุ่งยากชิบ(หรือความจริงแล้ว ผมอาจจะโง่เกินกว่าจะเข้าใจ code อัน advanced ของมันก็ได้ครับ) พอนึกออกแล้วใช่มั๊ยครับ ว่าผมจะทำอะไรต่อไป&#8230; ใช่ครับ ทำเองครับ ส่วนผสมของผม หลีกหนีไม่พ้น jQuery ครับ ร่วมกับการเขียน plugin โดยมีคอนเซปท์ว่า จับอะไรก็ได้ บนเว็บ เอามาทำเป็น  floating layer ได้หมด แล้วก็เลื่อนตาม scrollbar ได้ด้วย คิดไปคิดมาต่อยอดได้อีกว่า จะให้มันอยู่ตรงไหนของหน้าจอก็ได้ snap ซ้าย snap ขวา หรือจะอยู่มันตรงกลาง บนล่าง ได้หมด โอ้ว ชักน่าตื่นเต้นแล้วสิ ในที่สุด ผมก็ลองทดสอบตัว prototype ของผมกับเว็บของผู้ว่าจ้างทันทีครับ (http://www.brendabence.com/media-room/) เออ พอใช้ได้แฮะ หลังจากนั้นก็เอามานั่งพัฒนาต่อยอดตามที่ตั้งใจไว้จนออกมาให้ได้ใช้งานกัน [...]]]></description>
			<content:encoded><![CDATA[<p>เดิมที ผมได้โปรเจคจากผู้ว่าจ้างให้ทำ floating video เหมือนในเว็บ <a href="http://www.radiopublicity.com/">http://www.radiopublicity.com/</a> พอได้ลองเข้าไปดู code ที่เค้าเขียน รู้สึกว่ามันช่างซับซ้อนซ่อนเงื่อนเหลือเกิน ไม่ต้องพูดถึงเรื่อง reusability ครับ ยุ่งยากชิบ(หรือความจริงแล้ว ผมอาจจะโง่เกินกว่าจะเข้าใจ code อัน advanced ของมันก็ได้ครับ) พอนึกออกแล้วใช่มั๊ยครับ ว่าผมจะทำอะไรต่อไป&#8230; ใช่ครับ ทำเองครับ</p>
<p>ส่วนผสมของผม หลีกหนีไม่พ้น jQuery ครับ ร่วมกับการเขียน plugin โดยมีคอนเซปท์ว่า จับอะไรก็ได้ บนเว็บ เอามาทำเป็น  floating layer ได้หมด แล้วก็เลื่อนตาม scrollbar ได้ด้วย คิดไปคิดมาต่อยอดได้อีกว่า จะให้มันอยู่ตรงไหนของหน้าจอก็ได้ snap ซ้าย snap ขวา หรือจะอยู่มันตรงกลาง บนล่าง ได้หมด โอ้ว ชักน่าตื่นเต้นแล้วสิ</p>
<p><span id="more-201"></span>ในที่สุด ผมก็ลองทดสอบตัว prototype ของผมกับเว็บของผู้ว่าจ้างทันทีครับ (<a href="http://www.brendabence.com/media-room/">http://www.brendabence.com/media-room/</a>) เออ พอใช้ได้แฮะ หลังจากนั้นก็เอามานั่งพัฒนาต่อยอดตามที่ตั้งใจไว้จนออกมาให้ได้ใช้งานกัน เสร็จแล้วก็ตั้งชื่อให้มันว่า scrollads plugin สำหรับ jQuery ครับ</p>
<p>รูปแบบการใช้งาน</p>
<pre name="code" class="js">
$.scrollads(options);
</pre>
<p>โดยที่ options เนี่ย จะใส่หรือไม่ใส่ก็ได้ครับ ถ้าใส่ก็จะเขียนอยู่ในรูปแบบ JSON โดยที่มี key ตามนี้เลยครับ</p>
<p>closer เป็น selector ที่ระบุปุ่มที่ใช้ปิดตัว layer นี้<br />
hsnap เป็นตัวบอกว่า layer จะอยู่ตำแหน่งไหนในแนวนอน มีค่าเป็น</p>
<ul>
<li>left ชิดซ้าย</li>
<li>center อยู่ตรงกลาง</li>
<li>right ชิดขวา</li>
<li>custom อยู่ตำแหน่งที่ระบุไว้ใน left</li>
<li>none อยู่ตำแหน่งตาม html</li>
</ul>
<p>vsnap เป็นตัวบอกว่า layer จะอยู่ตำแหน่งไหนในแนวตั้ง มีค่าเป็น</p>
<ul>
<li>top ชิดด้านบน</li>
<li>middle อยู่ตรงกลาง</li>
<li>bottom ชิดด้านล่าง</li>
<li>custom อยู่ตำแหน่งที่ระบุไว้ใน top</li>
<li>none อยู่ตำแหน่งตาม html</li>
</ul>
<p>เช่น</p>
<pre name="code" class="js">
$("#floatme").scrollads();
$("#floatme").scrollads({closer:".close"});
$("#floatme").scrollads({closer:".close",hsnap:"center"});
</pre>
<p>ลองไปดู <a title="LIVE DEMO: Floating Layer" href="http://sandbox.chonla.com/scrollads/" target="_blank">LIVE DEMO</a> กันดีกว่าครับ</p>
<p>สำหรับ source code ตัวที่เป็น minified <a title="jQuery Plugin : MINIFIED FLOATING LAYER JS" href="http://sandbox.chonla.com/scrollads/jquery.scrollads.min.js" target="_blank">สามารถดาวน์โหลดได้จากที่นี่ครับ</a></p>
<p>ใช้ดีอย่าลืมมา feedback แล้วบอกต่อนะครับ <img src='http://blog.chonla.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>อัพเดท วันที่ 6 สิงหาคม 2552<br />
+ ผมได้เพิ่ม option smooth ลงไปครับ เพื่อให้ scroll ได้ smooth ขึ้นครับ ถ้าไม่ใส่มันก็จะเลื่อนปึ๊ด ๆ แบบเดิม แต่ถ้าใส่ แล้วกำหนดเป็น &#8220;true&#8221; มันก็จะหยอด effect ลงไปหน่อย ทำให้เลื่อนแล้วดูเนียน ๆ ครับ ลองดูได้ครับ ขอบคุณครับ</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/07/%e0%b8%97%e0%b8%b3-scroll-ads-%e0%b9%84%e0%b8%a7%e0%b9%89%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b9%80%e0%b8%ad%e0%b8%87/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>jTemplates, Template Engine ของ jQuery</title>
		<link>http://blog.chonla.com/2009/05/jtemplates-template-engine-%e0%b8%82%e0%b8%ad%e0%b8%87-jquery/</link>
		<comments>http://blog.chonla.com/2009/05/jtemplates-template-engine-%e0%b8%82%e0%b8%ad%e0%b8%87-jquery/#comments</comments>
		<pubDate>Tue, 19 May 2009 17:10:30 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[JSON]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Souce Code]]></category>
		<category><![CDATA[Template Engine]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jTemplate]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Template]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=149</guid>
		<description><![CDATA[ได้ไปอ่านบทความเกี่ยวกับ Template Engine ที่เว็บ jquerytips เป็น Template Engine ที่เป็น plugin ของ jQuery น่าสนใจดีครับ เลยเอามาแบ่งปันกัน jTemplate เป็น Template Engine ที่มีลักษณะการเขียน (Syntax) ที่เรียกได้ว่าลอกแบบกันมาจาก Smarty เลยทีเดียว ทำให้คนที่มีพื้นฐานของ Smarty อยู่แล้ว สามารถเรียนรู้ jTemplate ได้โดยง่าย ส่วนรูปแบบของข้อมูลที่รองรับก็จะอยู่ในรูปแบบของ JSON มาดูตัวอย่างการเขียนกันครับ ขั้นแรก ผมจะกำหนด data ที่จะใช้งานก่อนครับ var data = { id: 4, name: "User List", table: [ {id: 1, name: 'Anne', age: 22, mail: 'anne@domain.com'}, [...]]]></description>
			<content:encoded><![CDATA[<p>ได้ไปอ่านบทความเกี่ยวกับ Template Engine ที่เว็บ <a href="http://www.jquerytips.com" target="_blank">jquerytips</a> เป็น Template Engine ที่เป็น plugin ของ jQuery น่าสนใจดีครับ เลยเอามาแบ่งปันกัน<br />
<span id="more-149"></span><br />
jTemplate เป็น Template Engine ที่มีลักษณะการเขียน (Syntax) ที่เรียกได้ว่าลอกแบบกันมาจาก Smarty เลยทีเดียว ทำให้คนที่มีพื้นฐานของ Smarty อยู่แล้ว สามารถเรียนรู้ jTemplate ได้โดยง่าย ส่วนรูปแบบของข้อมูลที่รองรับก็จะอยู่ในรูปแบบของ JSON มาดูตัวอย่างการเขียนกันครับ</p>
<p>ขั้นแรก ผมจะกำหนด data ที่จะใช้งานก่อนครับ</p>
<pre class="js">var data = {
    id: 4,
    name: "User List",
    table: [
        {id: 1, name: 'Anne', age: 22, mail: 'anne@domain.com'},
        {id: 2, name: 'Amelie', age: 24, mail: 'amelie@domain.com'},
        {id: 3, name: 'Polly', age: 18, mail: 'polly@domain.com'},
        {id: 4, name: 'Alice', age: 26, mail: 'alice@domain.com'},
        {id: 5, name: 'Martha', age: 25, mail: 'martha@domain.com'}
    ],
    toString: function() {
        return this.name.bold() + ' (count: ' + this.table.length + ')';
    }
};</pre>
<p>เสร็จแล้วก็มากำหนด Template</p>
<pre class="js">{#template MAIN}
&lt;div id="header"&gt;{$T.name}&lt;/div&gt;
&lt;table&gt;
{#foreach $T.table as r}
    {#include row root=$T.r}
{#/for}
&lt;/table&gt;
{#/template MAIN}

{#template row}
&lt;tr bgcolor="{#cycle values=['#AAAAEE','#CCCCFF']}"&gt;
    &lt;td&gt;{$T.name.bold()}&lt;/td&gt;
    &lt;td&gt;{$T.age}&lt;/td&gt;
    &lt;td&gt;{$T.mail.link('mailto:'+$T.mail)}&lt;/td&gt;
&lt;/tr&gt;
{#/template row}</pre>
<p>ที่เหลือก็แค่เรียกใช้งาน plugin ตัวนี้เท่านั้นเองครับ ง่าย ๆ</p>
<pre class="js">$("#result").setTemplate($("textarea").text()).processTemplate(data);</pre>
<p>ลองไปดูตัวอย่างที่ <a title="LIVE DEMO : jTemplate for jQuery" href="http://sandbox.chonla.com/jtemplate" target="_blank">LIVE DEMO</a> ได้เลยครับ</p>
<p>แหล่งอ้างอิงและ API</p>
<ul>
<li><a href="http://jtemplates.tpython.com/">http://jtemplates.tpython.com/</a></li>
<li><a href="http://www.jquerytips.com/2008/12/07/jtemplate-template-engine-in-javascript/">http://www.jquerytips.com/2008/12/07/jtemplate-template-engine-in-javascript/</a></li>
</ul>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/05/jtemplates-template-engine-%e0%b8%82%e0%b8%ad%e0%b8%87-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upload progress อัพไปเท่าไหร่แล้ว บอกหน่อยซิ</title>
		<link>http://blog.chonla.com/2009/04/upload-progress-%e0%b8%ad%e0%b8%b1%e0%b8%9e%e0%b9%84%e0%b8%9b%e0%b9%80%e0%b8%97%e0%b9%88%e0%b8%b2%e0%b9%84%e0%b8%ab%e0%b8%a3%e0%b9%88%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7-%e0%b8%9a%e0%b8%ad%e0%b8%81/</link>
		<comments>http://blog.chonla.com/2009/04/upload-progress-%e0%b8%ad%e0%b8%b1%e0%b8%9e%e0%b9%84%e0%b8%9b%e0%b9%80%e0%b8%97%e0%b9%88%e0%b8%b2%e0%b9%84%e0%b8%ab%e0%b8%a3%e0%b9%88%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7-%e0%b8%9a%e0%b8%ad%e0%b8%81/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 18:35:26 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[APC]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Souce Code]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Progress]]></category>
		<category><![CDATA[Upload]]></category>
		<category><![CDATA[อัพโหลด]]></category>
		<category><![CDATA[เปอร์เซนต์]]></category>
		<category><![CDATA[แถบ]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=163</guid>
		<description><![CDATA[ลองแวะไปดูที่ http://www.zidoupload.com แล้วลองอัพโหลดไฟล์อะไรก็ได้ซักไฟล์นึง จะเห็นว่าระหว่างที่รอ มันจะมีการแสดงผลเป็นแถบว่าตอนนี้เราอัพโหลดไปแล้วกี่เปอร์เซนต์ รวมถึงยังบอกอีกว่า Transfer rate เป็นเท่าไหร่ ตรงนี้แหละครับที่ผมจะมาพูดถึงในวันนี้ การจะทำ Upload progress ด้วย PHP นั้น ส่วนประกอบที่ผมเลือกใช้จะประกอบด้วยส่วนหลัก ๆ อยู่ 3 ส่วนครับ คือ APC ย่อมาจาก Alternative PHP Cache ครับ ซึ่งจะมี library ที่ผมต้องการ นั่นคือ apc_fetch() ครับ Server ที่เราใช้จะต้องสนับสนุน APC ครับ ซึ่งเป็น PECL เข้าไปดาวน์โหลดได้จาก http://pecl.php.net/package/apc ครับ Ajax ในที่นี้ ผมใช้ Ajax ควบคู่กับ JSON ครับ Upload form ก็จะเป็น Form Upload ธรรมดานี่แหละครับ [...]]]></description>
			<content:encoded><![CDATA[<p>ลองแวะไปดูที่ <a title="ZidoUpload.com สุดยอดสังคมเพื่อการแบ่งปัน" href="http://www.zidoupload.com" target="_blank">http://www.zidoupload.co</a>m แล้วลองอัพโหลดไฟล์อะไรก็ได้ซักไฟล์นึง จะเห็นว่าระหว่างที่รอ มันจะมีการแสดงผลเป็นแถบว่าตอนนี้เราอัพโหลดไปแล้วกี่เปอร์เซนต์ รวมถึงยังบอกอีกว่า Transfer rate เป็นเท่าไหร่ ตรงนี้แหละครับที่ผมจะมาพูดถึงในวันนี้<br />
<span id="more-163"></span><br />
การจะทำ Upload progress ด้วย PHP นั้น ส่วนประกอบที่ผมเลือกใช้จะประกอบด้วยส่วนหลัก ๆ อยู่ 3 ส่วนครับ คือ</p>
<ol>
<li>APC ย่อมาจาก Alternative PHP Cache ครับ ซึ่งจะมี library ที่ผมต้องการ นั่นคือ apc_fetch() ครับ Server ที่เราใช้จะต้องสนับสนุน APC ครับ ซึ่งเป็น PECL เข้าไปดาวน์โหลดได้จาก <a title="APC Information" href="http://pecl.php.net/package/apc" target="_blank">http://pecl.php.net/package/apc</a> ครับ</li>
<li>Ajax ในที่นี้ ผมใช้ Ajax ควบคู่กับ JSON ครับ</li>
<li>Upload form ก็จะเป็น Form Upload ธรรมดานี่แหละครับ กำหนด enctypemultipart/form-data ให้เรียบร้อย และ method เป็น POST ให้เรียบร้อยเช่นกันครับ</li>
</ol>
<p>สำหรับไฟล์ที่จำเป็นในการทำ Upload Progress ด้วยวิธีนี้ ก็จะมี 3 ส่วนเช่นกัน ง่าย ๆ ตามนี้เลยครับ</p>
<ol>
<li>Upload Form จะเป็นหน้า Page ที่ User เห็นครับ เอาไว้สำหรับให้ User Browse File และกด Submit ครับ</li>
<li>Upload จะเป็นหน้า Page ที่เอาไว้สำหรับ Upload เลยครับ ในหน้านี้ ให้ทำการอัพโหลดเหมือนปกติครับ คือมีการ move_uploaded_file() อะไรเหมือนปกติืืทุกอย่างครับ</li>
<li>Progress จะเป็นส่วนที่เอาไว้สำหรับให้หน้า Form Upload มา poll ค่า status ของการ Upload ครับ ส่วนนี้แหละครับ ที่จะเป็นตัว return กลับไปว่า อัพโหลดอะไรได้ยังไงเท่าไหร่แล้วครับ</li>
</ol>
<p> </p>
<p><strong>Upload Form</strong></p>
<p>ทีนี้ เมื่อเรามีทุกอย่างพร้อม เราก็จะทำการกำหนด key สำหรับ Upload session เพื่อให้การ Poll ถามข้อมูลนั้นทำได้ถูกต้องครับ การกำหนดเราทำได้โดยการใส่ input hidden ที่ชื่อ APC_UPLOAD_PROGRESS ให้มีค่าเป็น key ที่เราต้องการครับ ผมสมมติให้มีค่าเป็น &#8220;abcd&#8221; ดังนั้น form ที่เราได้ควรจะมีหน้าตาประมาณแบบนี้ครับ (ชื่อ APC_UPLOAD_PROGRESS เราสามารถเปลี่ยนได้ใน php.ini ครับ)</p>
<p> </p>
<pre class="html" name="code">&lt;form enctype="multipart/form-data" action="upload.php" method="post"&gt;
    &lt;input type="hidden" name="APC_UPLOAD_PROGRESS" value="abcd"&gt;
    &lt;input name="upfile" type="file"&gt;&lt;/span&gt;
    &lt;input type="submit" value="Upload"&gt;
&lt;/form&gt;</pre>
<p> </p>
<p><strong>Upload</strong></p>
<p>ในส่วนนี้ผมไม่พูดถึงนะครับ ทำการอัพโหลดไฟล์ตามปกติเลยครับ ในกรณีที่ไฟล์ใหญ่มาก อย่าลืม set ให้ไม่ต้องมี timeout ด้วย function set_time_limit(0) ด้วยนะครับ</p>
<p> </p>
<p><strong>Progress</strong></p>
<p>สำหรับ Progress ไฟล์นั้น จะมีหน้าตาประมาณนี้ครับ</p>
<pre class="php" name="code">&lt;?php
header("content-type:application/json");
$stat = apc_fetch('upload_abcd');
if ($stat)
{
    if (!isset($stat["total"])) $stat["total"] = 0;
    if (!isset($stat["current"])) $stat["current"] = 0;
    if (!isset($stat["rate"])) $stat["rate"] = 0;
    if (!isset($stat["cancel_upload"])) $stat["cancel_upload"] = 0;
    if (!isset($stat["done"])) $stat["done"] = 0;
    f (!isset($stat["filename"])) $stat["filename"] = "";
    printf("[%0d,%0d,%0d,%0d,%0d,\"%s\"]",
    $stat["total"] ,
    $stat["current"] ,
    $stat["rate"] ,
    $stat["cancel_upload"] ,
    $stat["done"],
    addslashes($stat["filename"]));
}
else
{
    echo "null";
}
?&gt;</pre>
<p> </p>
<p>สิ่งที่เราต้องทำคือ ทำการ poll ข้อมูลการอัพโหลดของ key &#8220;abcd&#8221; จาก server เราก็ทำได้โดยเรียก function apc_fetch และกำหนด parameter เป็น string ขึ้นต้นด้วย &#8220;upload_&#8221; และตามด้วย key ของเรา คือ &#8220;abcd&#8221;</p>
<p>ค่าที่ return มาจาก apc_fetch จะได้เป็น associative array โดยมี key ที่เราจะเอามาใช้งานคือ</p>
<ul>
<li>total เป็นขนาดไฟล์</li>
<li>current เป็นขนาดไฟล์ที่อัพโหลดได้แล้ว</li>
<li>rate คือความเร็วในการอัพโหลดครับ</li>
<li>filename เป็นชื่อไฟล์ในเครื่องเราครับ (เช่น C:\Download\file.txt)</li>
</ul>
<p>คราวนี้ เราก็แค่ใช้ ajax มา poll ค่าเหล่านี้ออกไปแสดงเท่านั้นเองครับ ทีนี้ต้องพึ่งฝีมือ dhtml กับ graphic ของคุณเองแล้วล่ะครับ ว่าจะทำ progress bar ออกมาได้สวยแค่ไหน</p>
<p> </p>
<p>บทความนี้ ผมไม่มี LIVE DEMO แต่มีตัวอย่างให้ลองดาวน์โหลดไปทดสอบกันได้ครับ <a href="http://sandbox.chonla.com/uploadprogress/" title="SAMPLE DOWNLOAD : Download Progress">ดาวน์โหลด</a> กับเว็บที่ผมทำให้เอาไปใช้งานจริงครับ แวะลองไปทดสอบและใช้บริการกันได้ที่ <a title="ZidoUpload.com สุดยอดสังคมเพื่อการแบ่งปัน" href="http://www.zidoupload.com" target="_blank">http://www.zidoupload.com</a> ครับ</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/04/upload-progress-%e0%b8%ad%e0%b8%b1%e0%b8%9e%e0%b9%84%e0%b8%9b%e0%b9%80%e0%b8%97%e0%b9%88%e0%b8%b2%e0%b9%84%e0%b8%ab%e0%b8%a3%e0%b9%88%e0%b9%81%e0%b8%a5%e0%b9%89%e0%b8%a7-%e0%b8%9a%e0%b8%ad%e0%b8%81/feed/</wfw:commentRss>
		<slash:comments>49</slash:comments>
		</item>
		<item>
		<title>jQuery Documentation ภาษาชาวบ้านเรียกว่า &#8220;เฮ๊ลป์&#8221; (Help)</title>
		<link>http://blog.chonla.com/2009/03/jquery-documentation-%e0%b8%a0%e0%b8%b2%e0%b8%a9%e0%b8%b2%e0%b8%8a%e0%b8%b2%e0%b8%a7%e0%b8%9a%e0%b9%89%e0%b8%b2%e0%b8%99%e0%b9%80%e0%b8%a3%e0%b8%b5%e0%b8%a2%e0%b8%81%e0%b8%a7%e0%b9%88%e0%b8%b2/</link>
		<comments>http://blog.chonla.com/2009/03/jquery-documentation-%e0%b8%a0%e0%b8%b2%e0%b8%a9%e0%b8%b2%e0%b8%8a%e0%b8%b2%e0%b8%a7%e0%b8%9a%e0%b9%89%e0%b8%b2%e0%b8%99%e0%b9%80%e0%b8%a3%e0%b8%b5%e0%b8%a2%e0%b8%81%e0%b8%a7%e0%b9%88%e0%b8%b2/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 05:13:53 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[Documentation]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[CHM]]></category>
		<category><![CDATA[Help]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=153</guid>
		<description><![CDATA[ใช่ครับ เรียกง่าย ๆ ว่า Help นั่นเอง เวลาเราถามเพื่อนว่ามี Documentation ของ jQuery หรือเปล่า เราก็มักจะถามว่า &#8220;เฮ้ย มี Help ของ jQuery ป่าววะ ขอหน่อย&#8221; แบบนี้ แต่ตามหลักสากลแล้ว เขาเรียกว่า Documentation ครับ รู้เอาไว้ เวลาเอาไป Search จะได้หาเจอครับ ทีนี้เราจะมาดู Document ของ jQuery กันครับ ผมจะอ้างเฉพาะเวอร์ชั่น 1.3.x นะครับ จะได้ทันสมัยหน่อย Windows Help File (CHM): http://charupload.wordpress.com/2007/12/07/jquery-documentation-chm/ API Browser: http://api.jquery.com/ Official Documentation: http://docs.jquery.com/Main_Page เท่าที่แสดงในเว็บของ jQuery เองมีเท่านี้ครับ ผมเพิ่งโหลด CHM มาใช้คู่กับ Cheat Sheet (jQuery 1.2) [...]]]></description>
			<content:encoded><![CDATA[<p>ใช่ครับ เรียกง่าย ๆ ว่า Help นั่นเอง เวลาเราถามเพื่อนว่ามี Documentation ของ jQuery หรือเปล่า เราก็มักจะถามว่า &#8220;เฮ้ย มี Help ของ jQuery ป่าววะ ขอหน่อย&#8221; แบบนี้ แต่ตามหลักสากลแล้ว เขาเรียกว่า Documentation ครับ รู้เอาไว้ เวลาเอาไป Search จะได้หาเจอครับ</p>
<p><span id="more-153"></span>ทีนี้เราจะมาดู Document ของ jQuery กันครับ ผมจะอ้างเฉพาะเวอร์ชั่น 1.3.x นะครับ จะได้ทันสมัยหน่อย</p>
<ul>
<li>Windows Help File (CHM): <a title="jQuery Documentation - CHM" href="http://charupload.wordpress.com/2007/12/07/jquery-documentation-chm/" target="_blank">http://charupload.wordpress.com/2007/12/07/jquery-documentation-chm/</a></li>
<li>API Browser: <a title="jQuery Documentation: API Browser" href="http://api.jquery.com/" target="_blank">http://api.jquery.com/</a></li>
<li>Official Documentation: <a href="http://docs.jquery.com/Main_Page">http://docs.jquery.com/Main_Page</a></li>
</ul>
<p>เท่าที่แสดงในเว็บของ jQuery เองมีเท่านี้ครับ ผมเพิ่งโหลด CHM มาใช้คู่กับ <a title="jQuery Documentation: Cheat Sheet 1.2" href="http://colorcharge.com/wp-content/uploads/2007/12/jquery12_colorcharge.png" target="_blank">Cheat Sheet (jQuery 1.2)</a> สะดวกอยู่ไม่น้อยเลยทีเดียวครับ</p>
<p>ใครมีที่อื่นแนะนำก็บอกกันได้ครับ</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/03/jquery-documentation-%e0%b8%a0%e0%b8%b2%e0%b8%a9%e0%b8%b2%e0%b8%8a%e0%b8%b2%e0%b8%a7%e0%b8%9a%e0%b9%89%e0%b8%b2%e0%b8%99%e0%b9%80%e0%b8%a3%e0%b8%b5%e0%b8%a2%e0%b8%81%e0%b8%a7%e0%b9%88%e0%b8%b2/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>jQuery 1.3.2 ติดเทอร์โบ</title>
		<link>http://blog.chonla.com/2009/03/jquery-132-%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b9%80%e0%b8%97%e0%b8%ad%e0%b8%a3%e0%b9%8c%e0%b9%82%e0%b8%9a/</link>
		<comments>http://blog.chonla.com/2009/03/jquery-132-%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b9%80%e0%b8%97%e0%b8%ad%e0%b8%a3%e0%b9%8c%e0%b9%82%e0%b8%9a/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 04:55:07 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=151</guid>
		<description><![CDATA[ไม่ได้เข้ามาอัพเดทตั้งนาน มัวแต่ไปจัดการธุระส่วนตัวอยู่ เลยหาเวลาเข้ามาอัพเดทไม่ได้ วันนี้พอมีเวลาเลยเข้ามาอัพเดทซะหน่อยครับ หลาย ๆ คนคงรู้แล้วว่า jQuery ออกเวอร์ัชั่นใหม่มาเป็น 1.3.2 แล้ว วันนี้เราถือโอกาสมาคุยส่วนที่ปรับปรุงเพิ่มขึ้นจากเวอร์ชั่นในซีรี่ส์ 1.2.x กันดีกว่าครับ จากเวอร์ชั่น 1.2.6 เปลี่ยนมาเป็นเวอร์ชั่นในซีรี่ส์ใหม่ คือ 1.3.x มีการเปลี่ยนแปลงที่โดดเด่นตามนี้เลยครับ 1. ความเร็วหยั่งกับติดเทอร์โบของ Selector ทางทีมพัฒนา jQuery อ้างว่า Selector ของ jQuery ในเวอร์ชั่นนี้ เร็วขึ้นกว่าเดิมถึง 49% นับว่าเป็นการพัฒนาที่น่าชื่นใจจริง ๆ ครับ แหม่&#8230;ประทับใจ ๆ [อ้างอิง:http://docs.jquery.com/Release:jQuery_1.3#Sizzle_Selector_Engine]   2. Live Events การเปลี่ยนแปลงนี้ก็ยอดเยี่ยมครับ live() เป็นเทคนิคการ bind event ที่ไม่ได้แค่ bind กับ element ที่มีอยู่ในเว็บเราตอนนี้เท่านั้น แต่ยังสามารถ auto bind [...]]]></description>
			<content:encoded><![CDATA[<p>ไม่ได้เข้ามาอัพเดทตั้งนาน มัวแต่ไปจัดการธุระส่วนตัวอยู่ เลยหาเวลาเข้ามาอัพเดทไม่ได้ วันนี้พอมีเวลาเลยเข้ามาอัพเดทซะหน่อยครับ</p>
<p>หลาย ๆ คนคงรู้แล้วว่า jQuery ออกเวอร์ัชั่นใหม่มาเป็น 1.3.2 แล้ว วันนี้เราถือโอกาสมาคุยส่วนที่ปรับปรุงเพิ่มขึ้นจากเวอร์ชั่นในซีรี่ส์ 1.2.x กันดีกว่าครับ</p>
<p><span id="more-151"></span>จากเวอร์ชั่น 1.2.6 เปลี่ยนมาเป็นเวอร์ชั่นในซีรี่ส์ใหม่ คือ 1.3.x มีการเปลี่ยนแปลงที่โดดเด่นตามนี้เลยครับ</p>
<p><strong>1. ความเร็วหยั่งกับติดเทอร์โบของ Selector</strong></p>
<p>ทางทีมพัฒนา jQuery อ้างว่า Selector ของ jQuery ในเวอร์ชั่นนี้ เร็วขึ้นกว่าเดิมถึง 49% นับว่าเป็นการพัฒนาที่น่าชื่นใจจริง ๆ ครับ แหม่&#8230;ประทับใจ ๆ [อ้างอิง:<a href="http://docs.jquery.com/Release:jQuery_1.3#Sizzle_Selector_Engine">http://docs.jquery.com/Release:jQuery_1.3#Sizzle_Selector_Engine</a>]</p>
<p><img class="aligncenter" title="jQuery 1.3 Selector Performance" src="http://farm4.static.flickr.com/3399/3196296260_c7a0be70be.jpg" alt="" width="500" height="375" /></p>
<p> </p>
<p><strong>2. Live Events</strong></p>
<p>การเปลี่ยนแปลงนี้ก็ยอดเยี่ยมครับ live() เป็นเทคนิคการ bind event ที่ไม่ได้แค่ bind กับ element ที่มีอยู่ในเว็บเราตอนนี้เท่านั้น แต่ยังสามารถ auto bind event กับ element ที่จะเกิดขึ้นใหม่ได้อีกด้วย สุดยอดมาก ๆ ครับ ผมยกตัวอย่างว่าเว็บของผมมีการกำหนดให้ &lt;span name=&#8217;myspan&#8217;&gt; มี class เป็น hoverme เมื่อตอนผมเอา mouseover และให้เอา hoverme ออกตอน mouseout ตาม code ด้านล่างนี้</p>
<p>$(&#8220;span[name=myspan]&#8220;).mouseover(function(){ $(this).addClass(&#8220;hoverme&#8221;); }).mouseout(function(){ $(this).removeClass(&#8220;hoverme&#8221;); });</p>
<p>เดิมทีในเวอร์ชั่นก่อน ๆ นี้ ถ้าเรามีการเพิ่ม &lt;span name=&#8221;myspan&#8221;&gt; เข้าไปทีหลังจากที่เราเรียกคำสั่งด้านบน มันจะมีปัญหาว่า &lt;span name=&#8221;myspan&#8221;&gt; อันใหม่จะไม่ bind event ที่เราระบุ ทำให้เราต้องเรียกใหม่ทุกครั้ง</p>
<p>และ live นี่เอง ที่เป็นตัวเปลี่ยนแปลงทุกอย่างครับ ดู code ด้านล่างนี้นะครับ</p>
<p>$(&#8220;span[name=myspan]&#8220;).live(&#8220;mouseover&#8221;,function(){ $(this).addClass(&#8220;hoverme&#8221;); }).live(&#8220;mouseout&#8221;,function(){ $(this).removeClass(&#8220;hoverme&#8221;); });</p>
<p>คำัสั่งด้านบนนี้สั่งแค่ครั้งเดียวครับ ถึงแม้ว่าเราจะมี &lt;span name=&#8221;myspan&#8221;&gt; เพิ่มขึ้นมาใหม่ ๆ ในอนาคต เราก็ไม่ต้อง bind ใหม่แ้ล้วครับ สบ๊ายสบาย&#8230;</p>
<p> </p>
<p>3. ยกเครื่องการทำ HTML Injection ใหม่</p>
<p>คำสั่งพวก append, prepend, before และ after มีการรื้อเขียนใหม่ เร็วขึ้นโคตร ๆ ครับ 6 เท่า!! ใช่ครับ 6 เท่า หรือ 600% นั่นเอง [อ้างอิง: <a href="http://docs.jquery.com/Release:jQuery_1.3#HTML_Injection_Rewrite">http://docs.jquery.com/Release:jQuery_1.3#HTML_Injection_Rewrite</a>]</p>
<p><img class="aligncenter" title="HTML Injection Performance" src="http://farm4.static.flickr.com/3422/3196296910_6d385bd9df.jpg" alt="" width="500" height="375" /></p>
<p> </p>
<p>จริง ๆ แล้วมีเยอะกว่านี้อีกเยอะ ใครสนใจเข้าไปติดตามอ่านได้ที่ <a title="jQuery 1.3 Release Note" href="http://docs.jquery.com/Release:jQuery_1.3" target="_blank">http://docs.jquery.com/Release:jQuery_1.3</a> ได้เลยครับ</p>
<p> </p>
<p><strong>นอกเหนือจากนั้น</strong></p>
<p>ในการอัพเดทครั้งนี้ ยังมีการเปลี่ยนแปลงที่ก่อให้เกิด Backward Incompatibility นั่นหมายถึงว่า เราไม่สามารถใช้ code เก่าที่เราเขียนไว้แล้วกับ jQuery 1.3.x ได้นี่เองครับ</p>
<p>ยกตัวอย่างเช่น การใช้ @ ในส่วนของ Selector ครับ เช่น $(&#8220;[@name=color]&#8220;) ที่หมายถึง attribute ชื่อว่า name มีค่าเป็น color ใน 1.3.x เราต้องไม่ใส่ @ แล้วครับ (ถ้าใส่แล้วจะใช้ไม่ได้ ซึ่งต่างจาก 1.2.6 ที่ใส่หรือไม่ใส่ก็ได้) หรือ jQuery.browser ที่ไม่สามารถใช้กับ Safari 2 ได้อีกต่อไป คุณสามารถอ่านรายละเอียดเพิ่มเติมได้จาก <a title="jQuery 1.3.x Changes Note" href="http://docs.jquery.com/Release:jQuery_1.3#Performance" target="_blank">http://docs.jquery.com/Release:jQuery_1.3#Performance</a></p>
<p> </p>
<p>วันนี้ไว้เท่านี้ก่อนครับ ว่าง ๆ จะเข้ามาอัพเดทใหม่ครับ</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/03/jquery-132-%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b9%80%e0%b8%97%e0%b8%ad%e0%b8%a3%e0%b9%8c%e0%b9%82%e0%b8%9a/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>jQuery กับ Select Box</title>
		<link>http://blog.chonla.com/2009/01/jquery-%e0%b8%81%e0%b8%b1%e0%b8%9a-select-box/</link>
		<comments>http://blog.chonla.com/2009/01/jquery-%e0%b8%81%e0%b8%b1%e0%b8%9a-select-box/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 16:34:14 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[SELECT]]></category>
		<category><![CDATA[Selector]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=140</guid>
		<description><![CDATA[jQuery เองมี function ต่าง ๆ รวมถึง Selector มากมายที่ทำให้เราสามารถจัดการกับ select box (หรือ combo box) ได้ง่ายขึ้น เราจะลองมาดูตัวอย่างการนำไปใช้ที่พบได้่บ่อยของ jQuery กับ select box กัน function get_selected(path) { return $(path + " option:selected"); } function remove_selected(path) { $(path + " option:selected").remove(); } function append_item(path, value, text) { $(path).append("&#60;option value='" + value + "'&#62;" + text + "&#60;/option&#62;"); } function select_first(path) [...]]]></description>
			<content:encoded><![CDATA[<p>jQuery เองมี function ต่าง ๆ รวมถึง Selector มากมายที่ทำให้เราสามารถจัดการกับ select box (หรือ combo box) ได้ง่ายขึ้น เราจะลองมาดูตัวอย่างการนำไปใช้ที่พบได้่บ่อยของ jQuery กับ select box กัน</p>
<p><span id="more-140"></span></p>
<pre name="code" class="js">
function get_selected(path)
{
    return $(path + " option:selected");
}

function remove_selected(path)
{
    $(path + " option:selected").remove();
}

function append_item(path, value, text)
{
    $(path).append("&lt;option value='" + value + "'&gt;" + text + "&lt;/option&gt;");
}

function select_first(path)
{
    $(path + " option:first-child").attr("selected","selected");
}

function select_last(path)
{
    $(path + " option:last-child").attr("selected","selected");
}

function remove_all(path)
{
    $(path).empty();
}

function select_by_value(path, value)
{
    $(path + " option[value=" + value + "]").attr("selected","selected");
}

function remove_by_value(path, value)
{
    $(path + " option[value=" + value + "]").remove();
}
</pre>
<p>Code ของตัวอย่างด้านบน จะใช้สำหรับการทำงานที่พบได้บ่อย ไม่ว่าจะเป็นการเพิ่ม element OPTION ลงใน select หรือการกำหนดค่า select box ให้เลือกไปที่ option ใด ๆ</p>
<p>ตัวอย่างการนำไปใช้ดูได้ที่ <a title="LIVE DEMO : Select Box with jQuery" href="http://sandbox.chonla.com/selectbox" target="_blank">LIVE DEMO</a> ได้เลยครับ</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2009/01/jquery-%e0%b8%81%e0%b8%b1%e0%b8%9a-select-box/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>jQuery กับ JavaScript Framework อื่น ๆ ในถ้ำเดียวกัน</title>
		<link>http://blog.chonla.com/2008/11/jquery-%e0%b8%81%e0%b8%b1%e0%b8%9a-javascript-framework-%e0%b8%ad%e0%b8%b7%e0%b9%88%e0%b8%99-%e0%b9%86-%e0%b9%83%e0%b8%99%e0%b8%96%e0%b9%89%e0%b8%b3%e0%b9%80%e0%b8%94%e0%b8%b5%e0%b8%a2%e0%b8%a7/</link>
		<comments>http://blog.chonla.com/2008/11/jquery-%e0%b8%81%e0%b8%b1%e0%b8%9a-javascript-framework-%e0%b8%ad%e0%b8%b7%e0%b9%88%e0%b8%99-%e0%b9%86-%e0%b9%83%e0%b8%99%e0%b8%96%e0%b9%89%e0%b8%b3%e0%b9%80%e0%b8%94%e0%b8%b5%e0%b8%a2%e0%b8%a7/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 03:41:05 +0000</pubDate>
		<dc:creator>chonla</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JavaScript Framework]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://blog.chonla.com/?p=127</guid>
		<description><![CDATA[ใน jQuery นั้น จะมีการประกาศใช้ Global Object (Object ที่สามารถเข้าถึงได้จากทุก ๆ Function จากทุก ๆ ที่) โดยที่ถ้าเรานำเอา jQuery ไปใช้กับ JavaScript Framework อื่น ๆ หรือ Library อื่น ๆ ที่มีการประกาศ Global Object ชื่อเหมือนกัน อาจจะทำให้เกิดปัญหาได้ และวันนี้เราจะมาคุยเรื่องการเอา jQuery มาใช้ร่วมกับ JavaScript Framework ตัวอื่น ๆ ยกตัวอย่างที่เห็นได้ชัด สำหรับคนที่เคยใช้ prototype.js มาก่อน คงจะเคยเห็น function $() ที่เอาไว้สำหรับดึง Element ที่มี id ตามที่ระบุ และ jQuery ก็เช่นกัน มีการกำหนดให้ $ เป็นการเรียก jQuery [...]]]></description>
			<content:encoded><![CDATA[<p>ใน jQuery นั้น จะมีการประกาศใช้ Global Object (Object ที่สามารถเข้าถึงได้จากทุก ๆ Function จากทุก ๆ ที่) โดยที่ถ้าเรานำเอา jQuery ไปใช้กับ JavaScript Framework อื่น ๆ หรือ Library อื่น ๆ ที่มีการประกาศ Global Object ชื่อเหมือนกัน อาจจะทำให้เกิดปัญหาได้</p>
<p>และวันนี้เราจะมาคุยเรื่องการเอา jQuery มาใช้ร่วมกับ JavaScript Framework ตัวอื่น ๆ</p>
<p><span id="more-127"></span></p>
<p>ยกตัวอย่างที่เห็นได้ชัด สำหรับคนที่เคยใช้ prototype.js มาก่อน คงจะเคยเห็น function $() ที่เอาไว้สำหรับดึง Element ที่มี id ตามที่ระบุ และ jQuery ก็เช่นกัน มีการกำหนดให้ $ เป็นการเรียก jQuery Object อย่างย่อ ๆ ทำให้ถ้าเราประกาศใช้ prototype.js และ jQuery พร้อม ๆ กันอาจจะเกิดปัญหาได้</p>
<p>วิธีการแก้ไขทางหนึ่งคือ การเรียกฟังก์ชั่น jQuery.noConflict() ให้ทำงานหลังจาก Framework ของ jQuery และ Framework ที่เราจะนำมาใช้ร่วมกันโหลดเสร็จแล้ว วิธีนี้จะทำให้ $ ไม่เป็นการเรียก jQuery Object อย่างย่ออีกต่อไป เวลาเราจะเรียกใช้ jQuery Object เราก็จะต้องเรียกเป็น jQuery แล้วตามด้วยเครื่องหมายจุด (.) และตามด้วย Method หรือ Attribute ที่ต้องการเรียกใช้ เช่น</p>
<pre name="code" class="js">
&lt;script type="text/javascript" src="prototype.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="jquery.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  jQuery.noConflict();
  jQuery(document).ready(function()
    {
      jQuery("span").html("Hello world");
    }
  );

  $("myid").hide(); // เรียกใช้ $ ของ prototype.js
&lt;/script&gt;
</pre>
<p>หรือถ้าเรายังต้องการให้เรียก jQuery Object แบบสั้น ๆ อยู่ เราก็ยังสามารถกำหนด jQuery Object ให้กับตัวแปรชื่อสั้น ๆ ได้ เช่น</p>
<pre name="code" class="js">
&lt;script type="text/javascript" src="prototype.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="jquery.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  $j = jQuery.noConflict();
  $j(document).ready(function()
    {
      $j("span").html("Hello world");
    }
  );

  $("myid").hide(); // เรียกใช้ $ ของ prototype.js
&lt;/script&gt;
</pre>
<p>นอกจากนี้แล้ว เรายังสามารถใช้ $ แทน jQuery Object ได้โดยการรับพารามิเตอร์ jQuery Object เข้ามาด้วยในฟังก์ชั่นครับ เช่น</p>
<pre name="code" class="js">
&lt;script type="text/javascript" src="prototype.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="jquery.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
  jQuery.noConflict();
  jQuery(document).ready(function($)
    {
      $("span").html("Hello world");
    }
  );

  $("myid").hide(); // เรียกใช้ $ ของ prototype.js
&lt;/script&gt;
</pre>
<p>แต่วิธีนี้จะทำให้เราไม่สามารถเรียก $ ของ prototype ในนั้นได้ครับ เพราะว่ามันชนกันครับ</p>
<p><span style="text-decoration: underline;"><strong>Tips!</strong></span></p>
<p>ถ้าไม่อยากใส่ jQuery.noConflict() ให้ทำการ include jquery.js ก่อน Framework ตัวอื่นครับ</p>
<p><strong>แหล่งอ้างอิง</strong></p>
<ul>
<li><a href="http://docs.jquery.com/Using_jQuery_with_Other_Libraries" target="_blank" title="Using jQuery with Other Libraries - jQuery JavaScript Library">http://docs.jquery.com/Using_jQuery_with_Other_Libraries</a>
</ul>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://blog.chonla.com/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://blog.chonla.com/2008/11/jquery-%e0%b8%81%e0%b8%b1%e0%b8%9a-javascript-framework-%e0%b8%ad%e0%b8%b7%e0%b9%88%e0%b8%99-%e0%b9%86-%e0%b9%83%e0%b8%99%e0%b8%96%e0%b9%89%e0%b8%b3%e0%b9%80%e0%b8%94%e0%b8%b5%e0%b8%a2%e0%b8%a7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
