前面兩篇教程中,我們已經新增了多個圖片上傳表單,然後還缺了個圖片上傳即時預覽功能,有時候這個功能很有必要,比如圖片插入是否成功?插入是否正確?
所以今天這篇教程我們給上一篇教程中新增的圖片上傳項新增一個圖片預覽。本篇教程沿用的程式碼還是前兩篇的程式碼,請先參考前兩篇教程:WordPress 主題後臺教程 (九): 多個圖片上傳表單 WordPress 主題後臺製作 (八): 圖片上傳
首先我們給表單新增一個圖片顯示的 div 容器。修改類的 display() 函式為 (我是寫這個教程也是同時測試程式碼的可用性,所以有些地方不完美,這裡又給所有上傳圖片的 url 文字框加了一個 class 屬性,以便後面 js 獲取改物件,同時預覽圖片的 span 標籤中的 class 屬性值為對應的文字框 name 值後面加上_img):
- function display() {
- //載入 upload.js 檔案
- wp_enqueue_script('my-upload', get_bloginfo( 'stylesheet_directory' ) . '/js/upload.js');
- //載入上傳圖片的 js(wp 自帶)
- wp_enqueue_script('thickbox');
- //載入 css(wp 自帶)
- wp_enqueue_style('thickbox');
- $options = ClassicOptions::getOptions(); ?>
- <form method="post" enctype="multipart/form-data" name="classic_form" id="classic_form">
- <div class="wrap">
- <h2><?php _e('阿樹工作室主題設定'); ?></h2>
- <p>
- <?php //新增預覽圖片程式碼
- if($options['ashu_logo'] != ''){
- echo '<span class="ashu_logo_img"><img src='.$options['ashu_logo'].' alt="" /></span>';
- }
- ?>
- <label>
- <input type="text" size="80" class="ashu_upload_input" name="ashu_logo" id="ashu_logo" value="<?php echo($options['ashu_logo']); ?>"/>
- <input type="button" value="上傳" class="ashu_bottom"/>
- </label>
- </p>
- <p>
- <?php //新增預覽圖片程式碼
- if($options['ashu_ico'] != ''){
- echo '<span class="ashu_ico_img"><img src='.$options['ashu_ico'].' alt="" /></span>';
- }
- ?>
- <label>
- <input type="text" size="80" class="ashu_upload_input" name="ashu_ico" id="ashu_ico" value="<?php echo($options['ashu_ico']); ?>"/>
- <input type="button" value="上傳" class="ashu_bottom"/>
- </label>
- </p>
- <p class="submit">
- <input type="submit" name="classic_save" value="<?php _e('儲存設定'); ?>" />
- </p>
- </div>
- </form>
- <?php
- }
此時請參考效果 (途中下載速度是浮雲。。):

不過這裡還有個不完美的地方,就是不能即時更新預覽圖,比如上傳了新圖片,或者手動修改了 url 地址,預覽圖並不會改變,我們透過我們的 js 程式碼來監控文字框中 url 值的變化。然後即時改變預覽圖片。修改後的 js 程式碼為:
- jQuery(document).ready(function() {
- //查詢 class 為 ashu_bottom 的物件
- jQuery('input.ashu_bottom').click(function() {
- //獲取它前面的一個兄弟元素
- targetfield = jQuery(this).prev('input');
- tb_show('', 'media-upload.php?type=image&TB_iframe=true');
- return false;
- });
- window.send_to_editor = function(html) {
- imgurl = jQuery('img',html).attr('src');
- jQuery(targetfield).val(imgurl).focus(); //新增獲得焦點函式
- tb_remove();
- }
- //圖片即時預覽 ashu_upload_input 為圖片 url 文字框的 class 屬性
- jQuery('input.ashu_upload_input').each(function()
- {
- jQuery(this).bind('change focus blur', function()
- {
- //獲取改文字框的 name 屬性後面
- $select = '#' + jQuery(this).attr('name') + '_img';
- $value = jQuery(this).val();
- $image = '<img src ="'+$value+'" />';
- var $image = jQuery($select).html('').append($image).find('img');
- //set timeout because of safari
- window.setTimeout(function()
- {
- if(parseInt($image.attr('width')) < 20)
- {
- jQuery($select).html('');
- }
- },500);
- });
- });
- });
注意:預覽圖片的 span 標籤中的 class 屬性值為對應的文字框 name 值後面加上_img
就這樣,完工了