jQuery 학습 제6 과 Ajax 의 TreeView 실현

5666 단어 AjaxTreeView
최종 구현 효 과 는 디 렉 터 리 파일 뷰 어 입 니 다.그림 참조:   사용자 가 디 렉 터 리 를 눌 렀 을 때 이 디 렉 터 리 의 경 로 를 서버 측 에 보 내 고 서버 측은 이 디 렉 터 리 의 파일 과 디 렉 터 리 정 보 를 되 돌려 주 는 원리 다.서버 에서 전달 할 파일 정 보 를 다음 과 같이 정의 합 니 다
 
public class FileInformation
{
public string FullPath
{
get; set;
}
public string Name
{
get; set;
}
public string Info
{
get; set;
}
public bool IsFolder
{
get; set;
}
}
그 중에서 FullPath 는 파일 의 전체 경로 입 니 다.하위 폴 더/파일 을 가 져 오 는 데 사 용 됩 니 다.Name 은 파일 의 이름 입 니 다.IsFolder 는 이 데이터 가 파일 인지 폴 더 인지 구분 하여 다른 아이콘 으로 표시 할 수 있 습 니 다.마지막 인 포 는 추가 정보 로 이 예 에서 사용 되 지 않 았 다.디 렉 터 리 에 있 는 파일 정 보 를 한 경로 로 얻 을 수 있 는 C\#코드 는 간단 합 니 다.참고 로 여기에 붙 입 니 다
 
public class FileManager
{
public static List<FileInformation> GetFolderContent(string fullpath)
{
List<FileInformation> res = new List<FileInformation>();
DirectoryInfo info = new DirectoryInfo(fullpath);
if (info.Exists)
{
foreach (DirectoryInfo d in info.GetDirectories())
{
res.Add(new FileInformation
{
FullPath = d.FullName, Name = d.Name,IsFolder = true,
Info = "Any More Information goes here"
});
}
foreach (FileInfo f in info.GetFiles())
{
res.Add(new FileInformation
{
FullPath = f.FullName,Name = f.Name,IsFolder = false,
Info = "Any More Information goes here"
});
}
}
return res;
}
}
이 예 에서 JSON 데이터 형식 으로 이 정 보 를 전달 합 니 다.따라서 이 데 이 터 를 서열 화해 야 한다..Net 3.5 에서 기 존의 실체 류 를 JSON 데이터 로 서열 화 하 는 클래스 가 있 습 니 다.사용 방법 은 다음 과 같 습 니 다
 
public static string ToJson<T>(T obj)
{
DataContractJsonSerializer d = new DataContractJsonSerializer(typeof(T));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
d.WriteObject(ms, obj);
string strJSON = System.Text.Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return strJSON;
}
net 2.0 이 라면 제3자 구성 요 소 를 찾 을 수 있 고 자신 이 쓰 는 것 도 번 거 롭 지 않 습 니 다.이로써 서버 측의 주요 작업 이 완료 되 었 다.Genric Handler 파일 을 새로 만 듭 니 다.filelist.ashx,코드 는 다음 과 같 습 니 다.간단 한 응답 으로 데 이 터 를 출력 하면 됩 니 다
 
public class FileList : IHttpHandler {
public void ProcessRequest (HttpContext context) {
string path = context.Request.QueryString["path"];
string data = JsonHelper.ToJson<List<FileInformation>>(FileManager.GetFolderContent(path));
context.Response.Write(data);
}
public bool IsReusable {
get {
return false;
}
}
}
다음은 클 라 이언 트 html 코드 의 작성 을 고려 합 니 다.가장 중요 한 것 은 두 가지 이벤트 입 니 다.즉,마우스 클릭 으로 ajax 요청 을 보 내 고 돌아 온 json 데 이 터 를 처리 하여 html 코드 를 만 들 고 마 우 스 를 다시 클릭 하여 html 코드 를 비 우 는 것 입 니 다.여기 서 이 treeview 를 ulli 로 표시 합 니 다.li 에 보이 지 않 는 span 이 있 습 니 다.파일 의 완전한 경 로 를 포함 하고 있 습 니 다.ajax 요청 을 하 는 매개 변수 로 사용 되 지만 사용자 에 게 는 보이 지 않 습 니 다.HTML 코드 는 간단 합 니 다.바로 4 줄 입 니 다
 
<body>
<ul>
</ul>
</body>
먼저 루트 디 렉 터 리 를 초기 화 해 야 합 니 다.예 를 들 어 D:코드 는 다음 과 같 습 니 다
 
$(function() {
$('<li class="folder">D:\\<span class="fullpath">D:\\</span></li>').appendTo('ul');
$('li').hover(function() {
$(this).css('cursor', 'pointer');
},
function() { $(this).css('cursor', 'default'); });
$('li.folder').toggle(LoadFile, CloseFolder);
});
li 노드 를 구성 하여 ul 에 추가 한 다음 에 마우스 동작 스타일 을 설정 하고 마지막 으로 이벤트 처리 프로그램,LoadFile 과 CloseFolder 를 연결 합 니 다
 
function LoadFile(event) {
if (this == event.target) {
var path = $(this).find('span').html();
var node = $('<ul>');
$(this).append(node);
$.getJSON('filelist.ashx', { path: path }, function(data) {
$.each(data, function() {
if (this.IsFolder) {
node.append($('<li>').addClass('folder').html(this.Name).append($('<span>').addClass('fullpath').html(this.FullPath)));
}
else {
node.append($('<li>').addClass('file').html(this.Name).append($('<span>').addClass('fullpath').html(this.FullPath)));
}
});
node.find('li.folder').toggle(LoadFile, CloseFolder);
});
}
}
먼저 이벤트 의 target 과 this 가 같은 대상 인지 판단 하여 하위 노드 이벤트 가 떠 오 를 때 여러 번 촉발 되 지 않도록 해 야 합 니 다.우선 find 와 html 함 수 를 이용 하여 완전한 경 로 를 얻 습 니 다.l 노드 를 만 들 고 현재 li 에 추가 합 니 다.이 때 얼 은 비어 있 습 니 다.다음 에 ajax 요청 을 해서 서버 쪽 의 데 이 터 를 얻 습 니 다.모든 데이터 에 li 를 생 성 합 니 다.그 중에서 디 렉 터 리 인지 여 부 를 판단 하고 서로 다른 class 를 가 진 li 를 생 성 한 다음 node 에 추가 합 니 다.마지막 으로 새로 추 가 된 노드 에 도 이벤트 처리 프로그램 을 연결 하 는 것 을 잊 지 마 세 요.코드 는 비교적 간단 하 다.디 렉 터 리 노드 를 닫 는 코드 는 더욱 간단 하 다
 
function CloseFolder(event) {
if (this == event.target)
$(this).find('ul').remove();
}
이로써 이 범례 는 이미 완성 되 었 다.css 가 몇 마디 더 없어 서 더 이상 열거 하지 않 습 니 다.이 예 는 실현 되 는 기능 과 스타일 이 비교적 거 칠 지만 이 를 바탕 으로 더 많은 확장 과 미 화 를 하 는 것 은 이미 어 려 운 일이 아니다.예 를 들 어 기 존의 애니메이션 효 과 를 추가 할 수 있 습 니 다
 
function CloseFolder(event) {
if (this == event.target) {
var node = $(this).find('ul');
node.hide('slow', function() { $(this).find('ul').remove(); });
}
}
먼저 숨 기 고 삭제 합 니 다.유사 하 게 불 러 온 후 바로 숨 기 고 페 이 드 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기