澳门新葡萄京官网首页 7

结合AJAX进行PHP开发之入门

导航的贯彻固然表格列出了目录中的一些图像,但客商还亟需生龙活虎种查看表格中未现身的图样的主意。要确实得以实现分页器的导行,则供给风流倜傥套标准的链接:首页、、和尾页。
项目清单 3. 分页器导航// Append navigation$output = ‘h4Showing items ‘ .
$limit_start . ‘-‘ .min($limit_start $limit_step – 1, count($images))
.’ of ‘ . count($images) . ‘br /’;$prev_start = max(0, $limit_start –
$limit_step);if ( $limit_start 0 ) { $output .= get_table_link(”,
0, $limit_step); $output .= ‘ | ‘ . get_table_link(‘Prev’,
$prev_start, $limit_step);} else { $output .= ‘ | Prev’;}// Append
next button$next_start = min($limit_start $limit_step,
count($images));if ( $limit_start $limit_step count($images) ) {
$output .= ‘ | ‘ . get_table_link(‘Next’,$next_start, $limit_step);
$output .= ‘ | ‘ . get_table_link(”,(count($images) – $limit_step),
$limit_stepState of Qatar;} else { $output .= ‘ | Next | ‘;}$output .= ‘/h4’;
最后还要编写 get_image_link() 和 get_table_link(卡塔尔国函数,让客商将缩略图张开成完全的图像。重视,脚本
index.php只在此五个函数中调用。那样就比较轻巧更换链接的遵循。事实上在上边与
Sajax 举行集成时,独有那多个函数须要矫正。 项目清单 4.
get_image_link、get_table_link 实现function get_table_link (
$title, $start, $step ) { $link = index.php?start=$startstep=$step;
return ‘a href=’%20.%20$link%20.%20” . $title .’/a’;}function get_image_link
( $title, $index 卡塔尔 { $link = expand.php?index=$index; return ‘a href=’ .
$link . ” . $title . ‘/a’;} 放大图片
今后有了多个可用的分页器为客户提供部分缩略图。相册的第二项意义是承诺客户单击缩略图来查阅全图。get_image_link(卡塔尔函数调用了 expand.php
脚本,大家后天就来编排它。该脚本传递顾客期待举行的公文的目录,由此必需在这里列出目录并获得确切的文件名。随后的操作就非常轻巧了,只需创设病输出
image 标识就能够。 项目清单 5. get_image 函数function get_image ( $index ) {
$images = get_image_list ( ‘images’ ); // Generate navigation $output
.= ‘img src=images/’%20.%20$images[$index]%20.%20′ /’; return $output;}

  结束语

  OpenAjax Alliance 主要关怀多少个方面:通过提供互操作性收缩利用 Ajax
的高危害,保险 Ajax 解决方案坚持不渝走开放规范路径和动用开放源码本事,保持 Web
的开放性。小组的率先项职责便是谋求创建和维持 Ajax
工具间互操作性的艺术。

  为了形花销毁文件的剩余部分,前边假若照片保存在 /images
子目录中,缩略图则放在 /images/thumbnails
中。能够在代码中做适度的退换。别的,大家还假定缩略图和呼应的图像使用相像的名目。

</script>
</head>

  并在相应的函数中做相符改过:get_image_link() 和
get_table_link(卡塔尔(قطر‎。那样向 Sajax 的倒车就成功了(如图 6
所示)。全部链接都成为了与长途 PHP 调用对应的 JavaScript 调用,PHP 使用
JavaScript 响应处理程序 to_window(卡塔尔 直接出口到页面。

  重新张开页面将看见服务器恳求的结果。图 7
展现了满含元数据的松手的图像。

  清单 11. 轻巧易行的头

  分页器应该传递八个参数:start
是遵照字母逐豆蔻年华突显的首先幅照片的索引号,step 是显得的相片数。

  清单 2. get_file_list 实现

  使用 Sajax 把大家的相册形成活动的 Web
应用程序如此轻松,大家要再花点时间累积一些效应,进一层求证 Sajax
怎么着使从服务器检索数据变得精光透明。大家将为相册添新币数据功用,那样客商就能够为他们的图样增添表达。

  要留神的是,get_meta_data(卡塔尔(قطر‎ 函数中还运用 getimagesize(卡塔尔(五个主导
PHP 函数,不须要 GD)计算图像的尺寸。

  小组做了几项决定,个中最令人瞩目标便是给谐和取了个名字:OpenAjax
Alliance。它还调控不把自身团队成七个正规的科班组织,只怕 Eclipse
Foundation
那样的开放源码主导的集体,由此小组本身的款式这几天也是业余的。小组同意大概周周举行二遍网络会议。

 

  清单 8. Sajax 的应用

  清单 9. Sajax 相册的底部

  假若打开清单 8 中的页面,在输入框中输入一些内容然后单击
Enter,那么输入内容就能够在一个警报框中展现出来。但在那一个就如轻便的网页背后,x_foo_bar(卡塔尔国JavaScript 函数将长途调用 foo_bar(卡塔尔国 函数,并把响应传递给 JavaScript
内置函数 alert(State of Qatar。每一个 Sajax
导出函数的结尾一个参数都以一个响应管理程序,肩负处理 foo_bar()
的输出。

  首先要访问最少 20 幅 .jpg
图片,并将它们放到三个文书夹中。每一种图片还要有两个封存在单身缩略图像和文字件夹中的缩略图。即便可使用
GD 软件包生成缩略图(请参阅
参谋资料),但本文假使已经计划好了缩略图。也可选择本文提供的肖像和缩略图(请参阅
下载)。

?>
</body>
</html>

</head>
<body>

function get_meta_data ( $file ) {

  Sajax、Ajax 与古板 Web 应用程序
 
  今后大家早就应用规范的 Web
开垦模型开辟了应用程序。两项主要功能是分页器和图像查看器,它们分别对应分化的
PHP 文件。参数作为 HTTP GET 必要传递给脚本,脚本直接向 Web
顾客机重临页面。

<head>
<title>Creating a Sajax photo album</title>
<style type=”text/css”>
body { text-align: center }
div#window { margin: 0 auto 0 auto; width: 700px;
padding: 10px; border: 1px solid #ccc; background: #eee; }
table.image_table { margin: 0 auto 0 auto; }
table.image_table td { padding: 5px }
table.image_table a { display: block; }
table.image_table img { display: block; width: 120px
padding: 2px; border: 1px solid #ccc; }
img.full { display: block; margin: 0 auto 0 auto;
width: 300px; border: 1px solid #000 }
</style>

  今后有了一个可用的分页器为客户提供部分缩略图。相册的第二项成效是同意客户单击缩略图来查看全图。get_image_link()函数调用了 expand.php
脚本,大家明日就来编排它。该脚本传递顾客期望实行的文件的目录,由此必须在这里列出目录并得到适当的文本名。随后的操作就很简短了,只需创制病输出
image 标志就能够。

  触类旁通相册

  Web 开辟社区的人都知情,Ajax
允许向服务器发出异步的帮忙央求,并直接在网页中显得结果(如图 4
所示)。不幸的是,就算最简易的 Ajax 应用程序达成起来也是一项大职务。因为
Ajax 不是条件的技能,Internet Explorer 和别的浏览器(如
Firefox、Safari)的落到实处是例外的。其它,程序员最少要编写八个函数技巧兑现二个职能,这多少个函数是:发送
HTTP 需要的上马 JavaScript,重返响应的 PHP
脚本,以至另贰个甩卖那几个响应的 JavaScript 函数。

function get_image ( $index ) {
 $images = get_澳门新葡萄京官网首页 ,image_list ( ‘images’ );

$output .= ‘</h4>’;

  注意:本文前面还要接受 get_file_list(卡塔尔(قطر‎函数。有有些很珍视,无论哪天调用该函数,再次来到的数组都以不改变的。因为提供的完成要开展目录寻找,必需确定保障目录中的钦定文件不会转移,每便都要按字母顺序排序。

  今后相册提供了着力的导航作用,目录中的图像增加了目录。上边您将看到增多Sajax 能够修改编制程序和客商体验。

  您将学习怎么将 Sajax 库应用于相册,通晓怎么采纳 Sajax
能够加快应用程序的支出。

  本文将应用二种办法创造一个简约的相册:古板的 Web 应用程序和基于
Sajax 的应用程序。我们将用 PHP
编写三个相册,读取某一目录中的内容,突显缩略图组成的报表。假使客商单击三个缩略图,就能够全盘张开该图像。因为编写的是观念应用程序,所以每一次单击都会是三个新的
HTTP 乞请,而参数则作为 UEnclaveL 的风姿浪漫局地传递。

  再回到 get_image(卡塔尔国 函数,它包含由 get_image_list()生成的文件名的列表。查找元数据只须要将文件名传递给该函数就可以。

  项目清单 12. 包罗元数据的 XML 文件

  // Begin column
  if ( $index – $limit_start % $columns == 0 ) {
   $output .= ‘<tr>’;
  }

<?xml version=”1.0″?>
<gallery>
 <photo file=”image01.jpg”>
  <date>August 6, 2006</date>
  <locale>Los Angeles, CA</locale>
  <comment>Here’s a photo of my favorite celebrity</comment>
 </photo>
 <photo file=”image02.jpg”>
  <date>August 7, 2006</date>
  <locale>San Francisco, CA</locale>
  <comment>In SF, we got to ride the street cars</comment>
 </photo>
 <photo file=”image03.jpg”>
  <date>August 8, 2006</date>
  <locale>Portland, OR</locale>
  <comment>Time to end our road trip!</comment>
 </photo>
</gallery>

if ( $index > 0 ) {
 $output .= get_image_link(‘<<’, 0);
 $output .= ‘ | ‘ . get_image_link(‘Prev’, $index-1);
} else {
 $output .= ‘<< | Prev’;
}

  接下去还要提供与分页器形似的领航机制。“上一张” 导航到编号为 $index-1
的图像,“下一张” 导航到编号为 $index+1 的图像,“再次回到” 则赶回分页器。

$output .= ‘</h4>’;

  添加 Sajax

  最终还要编写 get_image_link() 和 get_table_link(State of Qatar函数,让客商将缩略图张开成完全的图像(参见清单 4)。注意,脚本
index.php(甚至背后要创立的
expand.php)只在此多少个函数中调用。那样就非常轻便退换链接的服从。事实上在底下与
Sajax 实行集成时,独有那七个函数须要更改。

  大家看来,使用 Sajax
能够裁撤客商机和服务器之间的拦Land Rover,工程师能够举行无缝远程函数调用而不用思念传输层、HTTP
GET 和 POST 乞请。我们得以花更加多日子编排提供数据的 PHP
脚本甚至表示层和调控层的
JavaScript。在这里个相册例子中,大家让顾客机直接连接到图像数据库。通过抬高轻巧的元数据,我们看来让顾客平昔访谈服务器上的消息是多么轻易,无需顾忌左券的标题。

 return $nav . $output;
}

$sajax_request_type = “GET”; // Set HTTP request type to GET
sajax_init(); // Prepare Sajax
sajax_export(“foo_bar”); // foo_bar can now be called by client
sajax_handle_client_request(); // Discussed below
?>
<html>
<head>
<script language=”javascript”>
<? sajax_show_javascript(); ?>
</script>
</head>
<body>
<form onSubmit=”x_foo_bar(this.input.value, alert);return false;”>
<input type=”text” name=”input” />
</form>
</body>
</html>

  二〇〇六 年 5 月 JavaOne Conference 开始前,29 家公司的代表在 Adobe
Systems 的会议场所里碰头,打算大意上规定 Ajax 的前程,这几个小组就称为
OpenAjax Alliance。

 // Use SimpleXML package in PHP_v5:
 //
 $xml = simplexml_load_file(“gallery.xml”);

  对于本文来讲,文书档案主体部分不会细小略。大家将运用 div 和 window 的 id
来体现服务器的出口。

function get_image_list ( $image_dir ) {
 $d = dir($image_dir);
 $files = array();
 if ( !$d ) return null;

  能够看来 UKoleosL 依旧保持不改变,并带动了越多欢娱的客商体验。window div
显示在一个樱草黄的框中,通过 Sajax
生成的剧情十二分明白。脚本不自然要明了小编或许它在服务器上的岗位,因为具有的链接最后都改为直接对页面自己的
JavaScript 调用。由此我们的代码能够很好的模块化。大家只须要保持
JavaScript 和 PHP
函数在同八个页面上就能够,即便页面地方爆发了变化也不曾关系。

if ( $index < count($images) ) {
 $output .= ‘ | ‘ . get_image_link(‘Next’, $index+1);
 $output .= ‘ | ‘ . get_image_link(‘>>’, count($images));
} else {
 $output .= ‘ | Next | >>’;
}

  文件的拆解深入分析不在本文商量范围之列。大家要是您可以纯熟运用 PHP 中有的是
XML 深入分析方法中的意气风发种。倘若面生的话,建议阅读 参谋资料
中的篇章。大家不再浪费时间解释什么将该文件转载成
HTML,作为三个操演,读者能够团结询问下边包车型地铁代码怎么着利用 XML 文件并生成
HTML。事项清单 13 中的代码应用了 PHP V5 中自带的 SimpleXML 包。

澳门新葡萄京官网首页 1
图 6. 做到的基于 Sajax 的相册(缩略图)

  那么些表非常粗大略,它从索引号 $limit_start
开首遍历图片列表。然后放上每一种图片的缩略图,每五张图片作为意气风发行。达到$limit_start + $limit_step 的时候循环结束。

window.onload = function() {
 x get table to window);
};

// Append next button
$next_start = min($limit_start + $limit_step, count($images));
if ( $limit_start + $limit_step < count($images) ) {
 $output .= ‘ | ‘ . get_table_link(‘Next’,$next_start,
$limit_step);
 $output .= ‘ | ‘ . get_table_link(‘>>’,(count($images) –
$limit_step), $limit_step);
} else {
 $output .= ‘ | Next | >>’;
}

 foreach ( $xml as $photo ) {
  if ($photo[‘id’] == $file) {
   $output .= !empty($photo->date) ? “<p>Date
taken:{$photo->date}</p>” : ”;
   $output .= !empty($photo->locale) ?
“<p>Location:{$photo->locale}>/p>” : ”;
   $output .= !empty($photo->comment) ?
“<p>Comment:{$photo->comment}</p>” : ”;
  }
 }
 return $output;

 // Using getimagesize, the server calculates the dimensions
 list($width, $height) = @getimagesize(“images/$file”);
 $output = “<p>Width: {$width}px, Height: {$height}px</p>”;

  OpenAjax Alliance 包蕴 31 家手艺公司,此中有 IBM?、Adobe
Systems、Eclipse Foundation、谷歌(Google卡塔尔国、Laszlo Systems Inc.、Oracle、Red
Hat Inc. 和 Zend Technologies Ltd.。

  整个应用程序都富含在多个页面中,还足以把别的作用(get_table()、get_image(卡塔尔等)放在不可能从 Web 访谈的独自的库文件中。在大多 Ajax
应用程序中,各样发往服务器的央浼都亟需由独立的脚本管理,或起码要求编写制定叁个百般宏大的管理程序脚本来重定向央浼。将具有那几个文件都集聚到一块儿只怕极度艰巨。使用
Sajax 长久只要求贰个文本,在该公文中只需定义大家接收的函数就可以。Sajax
替代了处理程序脚本。

  利用刚刚成立的代码,大家将用 Sajax
快速把相册从多页面应用程序转产生活动的 Ajax 应用程序。

<style type=”text/css”>
body { text-align: center }
table.image_table { margin: 0 auto 0 auto; width: 700px;
padding:10px; border: 1px solid #ccc; background: #eee; }
table.image_table td { padding: 5px }
table.image_table a { display: block; }
table.image_table img { display: block; width: 120px;
padding: 2px; border: 1px solid #ccc; }
</style>

<?php
require(“Sajax.php”);

<body>
<h1>Sajax photo album</h1>
<div id=”window”></div>
</body>

澳门新葡萄京官网首页 2
图 4. Ajax 应用程序担任全体的 HTTP 央求

澳门新葡萄京官网首页 3
图 5. 应用 Sajax 客户机可通过一个页面访问服务器端的七个函数

  项目清单 13. 元数据函数

  清单 14. 添欧元数据

function get_image () { } // Defined later
function get_thumbs_table () { } // Defined later

异步 JavaScript 和 XML(Asynchronous JavaScript and
XML,Ajax)无疑是最盛行的新 Web 本事。本文中大家将完全接收 PHP 和 Simple
Ajax Toolkit (Sajax卡塔尔 创制四个简便的相册作为在线 Web
应用程序。大家先是用标准的 PHP 开采方法编写轻便的相册,然后再用 Sajax
将其成为活动的 Web 应用程序。

澳门新葡萄京官网首页 4 
图 1. 分页器提供了展现客商照片的朝气蓬勃种办法

  // Close column
  if ( $index – $limit_start % $columns == $columns – 1 ) {
   $output .= ‘</tr>’;
  }
 }

  访谈相册的顾客要求某种连忙查看照片的主意。因为众多大照片不便于在黄金时代页上展现,所以供给创制一个分页器
——
每一回展现少些缩略图的轻巧表格。还要编写导航,援救客户在图像列表中来回移动。

 $output .= ‘<table class=”image_table”>’;
 $columns = 5;
 foreach ($images as $index => $image) {

  创立在 Ajax 库之上的 Sajax
通过行使轻便的启迪式方法大大简化了那黄金时代经过:Web 客商机供给拜候的每种 PHP
函数都由 Sajax “导出”。假设有三个名字为 foo_bar(卡塔尔(قطر‎ 的 PHP 函数,那么 Sajax
会把该函数导出为 JavaScript 函数 x_foo_bar(State of Qatar。客商机对 x_foo_bar()的任何调用都会自行转载给服务器上的 foo_bar(卡塔尔国,输出则传递给另二个JavaScript 函数。项目清单 8 中的简短页面示范了这种效果与利益。运营那么些事例必要下载
Sajax 库(请参阅 参照他事他说加以考查资料)。

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”

<html xmlns=”
<head>
<title>Creating a simple picture album viewer</title>

  元数据

<?php
require(“Sajax.php”);

 $output .= ‘</table>’;

澳门新葡萄京官网首页 5 
图 7. 行使元数据的相册

 // …

  那些事例还表明了 Sajax
连忙支付的另四个主要特征:没有供给种种函数都有一个单独的文本,页面实际上调用的是其本人,因而更便于追踪函数的调用(如图
5 所示)。x_foo_bar(State of Qatar 函数直接向页面发回 Ajax
恳求,在伸手中带有函数名和参数。关键是 sajax_handle_client_request(卡塔尔(قطر‎函数,它截获全部的 Sajax 调用并活动对它们进行拍卖。

 // Generate navigation for Previous and Next buttons
 // Code given below

$prev_start = max(0, $limit_start – $limit_step);
if ( $limit_start > 0 ) {
 $output .= get_table_link(‘<<’, 0, $limit_step);
 $output .= ‘ | ‘ . get_table_link(‘Prev’,
 $prev_start, $limit_step);
} else {
 $output .= ‘<< | Prev’;
}

  // Generate link to blown up image (see below)
  $thumbnail = ‘<img src=”thumbnails/’%20.%20$image%20.%20′” />’;
  $output .= ‘<td>’ . get_image_link($thumbnail, $index) .
‘</td>’;

 while (false !== ($file = $d->read())) {
  // getimagesize returns true only on valid images
  if ( @getimagesize( $image_dir . ‘/’ . $file ) ) {
   $files[] = $file;
  }
 }
 $d->close();
 return $files;
}

  清单 3. 分页器导航

// Outputs directly to the “window” div
function to_window(output) {
 document.getElementById(“window”).innerHTML = output;
}

  将 Sajax 连接到相册

  清单 6. get_image 导航

  清单 7. get_image 导航

function get_table_link ( $title, $start, $step ) {
 $link = “index.php?start=$start&step=$step”;
 return ‘<a href=”‘%20.%20$link%20.%20′”>’ . $title .’</a>’;
}

  最终创设一个粗略的 HTML 容器,将其命名称为 expand.php。

  清单 10. 出示服务器输出的 div 和 window id

/*
* Find a list of images in /images and provide thumbnails
*/
function get_table ( $limit_start = 0, $limit_step = 5 ) {
 $images = get_image_list(‘images’);

 $output .= ‘<img src=”images/’%20.%20$images[$index]%20.%20′” />’;
 $output .= ‘<div id=”meta_data”>’ .
 get_meta_data( $images[$index] ) . ‘</div>’;
 return $output;
}

澳门新葡萄京官网首页 6
图 3. 在观念的 Web 应用程序中,多少个不等的呼吁调用了七个页面

$output .= ‘ | ‘ . get_table_link(‘Up’, $index, 5);

  导航的完结

function foo_bar ( $param ) {
 return “You typed: $param”;
}

 $output .= ‘<img src=”images/’%20.%20$images[$index]%20.%20′” />’;
 return $output;
}

澳门新葡萄京官网首页 7 
图 2. 实现的相册

  // End directory listing at item number $limit_end
  if ( $index >= $limit_start + $limit_step ) continue;

  未有上下文表达的相册是残缺的,比如照片的来自、我等。为此大家要将图像集中起来创制叁个回顾的
XML 文件。根节点是 gallery,它包罗自由多少个 photo 节点。每一种 photo
节点都经过其 file 属性来编号。在 photo
节点中得以行使大肆七个标记来陈说照片,但本例中只使用了 date、locale 和
comment。

 // Generate navigation

  // Begin directory listing at item number $limit_start
  if ( $index < $limit_start ) continue;

  拓展图片

  纵然表格列出了目录中的一些图像,但客户还索要后生可畏种查看表格中未现身的图形的办法。要实在达成分页器的导行,则需求生龙活虎套规范的链接:首页、上风华正茂页、下生龙活虎页和尾页。

  与持有的 Ajax
应用程序一样,我们的相册也许有一个沉重的弱项:未有接纳浏览器的
“访谈历史”,因为破坏了后退按键的成效。在 “利用 PHP 开拓 Ajax 应用程序”
种类的第 2
片段中,大家将通过完结历史记录缓冲和意况追踪机制来解决那些标题。

  该表是目录列表的可视化表示,由此须求叁个函数列出目录中的全体图像。项目清单1 中的 get_file_list(卡塔尔(قطر‎ 函数用索引数组重回 /images
目录中的全数图片列表。上面是一个示范完成。

  清单 4. get_image_link、get_table_link 实现

  最终一步是保险应用程序中的全部链接都以自定义的 Sajax
调用。只要求取上大器晚成节中的代码并作如下替换:href=”index.php?start=0&step=5″
变为 onclick=”x_get_table(0, 5,
to_window)”,href=”expand.php?index=0″ 变为 onclick=”x_get_image(0,
to_window)”。

<script language=”javascript”>
<? sajax_show_javascript(); ?>

  加上一个分页器表

  这里若是你对 Ajax 有基本的理解,最佳还熟知 Sajax 的底子知识(请参阅
参考资料 中的学科)。

  因为相册首要有多少个函数,get_table() 和 get_image(卡塔尔,那也是供给用
Sajax 导出的漫天函数。事实上,为了通过 Sajax
调用那个函数,这一个函数自己基本上没有必要纠正,相当慢大家就拜会到,大家只须求改良生成的链接即可。

// Standard Sajax stuff. Use Get, and export two
// main functions to javascript
$sajax_request_type = “GET”;
sajax_init();
sajax_export(“get_thumbs_table”, “get_image”);
sajax_handle_client_request();
?>

  那样大家就完了了相册。顾客能够看出全数的图片,何况超级轻松导航。自然,客商能够来回切换,以致能通过书签作用重返中意的图样。

$output .= ‘<h4>Viewing image ‘ . $index .’ of ‘ . count($images) .
‘<br />’;

  什么是 OpenAjax Alliance?

  最终还要编写 JavaScript
回调函数。该例中,因为具有的服务器输出都间接出口到 window div
标志,所以能够重复使用轻易的回调函数。将回调函数加多到 Sajax
函数调用中,就足以获取头(head)。

<h1>Creating a simple picture album viewer</h1>
<?php

function get_image ( $index ) {
 $images = get_image_list ( ‘images’ );

$index = isset($_REQUEST[‘index’]) ? $_REQUEST[‘index’] : 0;
echo get_image($index);

function get_image_link ( $title, $index ) {
 $link = “expand.php?index=$index”;
 return ‘<a href=”‘%20.%20$link%20.%20′”>’ . $title . ‘</a>’;
}

  清单 5. get_image 函数

// Append navigation
$output = ‘<h4>Showing items ‘ . $limit_start . ‘-‘ .
min($limit_start + $limit_step – 1, count($images)) .
‘ of ‘ . count($images) . ‘<br />’;

 

  创办四个轻易的相册

  清单 1. 相册查看器

发表评论

电子邮件地址不会被公开。 必填项已用*标注