html ashx development_jquery의 여러 문제에 대한 솔루션

WBOY
풀어 주다: 2016-05-16 18:04:42
원래의
1077명이 탐색했습니다.

질문 1: switch...case 대신 대리자 사전을 사용하세요.

이 문제는 요청을 처리할 때 발견되었습니다. 너무 많은 요청을 처리하기 위해 자신의 프로젝트에 많은 핸들러를 구축할 의향이 없기 때문에 하나의 핸들러인 ajax에서 여러 요청을 처리하려고 생각했습니다. 액션 매개변수가 추가되었습니다. 요청에 응답하고 핸들러는 이 작업을 기반으로 해당 처리를 수행하거나 해당 데이터를 반환합니다. 여기서는 작업을 판단하기 위해 if...else를 사용하지 않습니다. 대부분의 사람들은 switch...case 를 사용한다고 생각합니다. 처음에는 각 사례가 코드 블록과 같지 않으며 그 안에 있는 변수에 대해 독립적인 범위를 제공할 수 없다는 것을 점차적으로 발견했습니다! Dragon Ball의 Sun Wukong은 "정말 긴장됩니다."라고 말했습니다.

온라인에서 검색해 보니 많은 분들이 이런 문제를 겪고 계시더군요. 한 가지 해결책은 각 프로세스를 처리기의 메서드로 분리하는 것입니다. 이는 명확하고 간결하지만 ProcessRequest 메서드에서는 리플렉션을 사용하여 해당 메서드를 호출해야 합니다! 저는 이 솔루션이 별로 만족스럽지 않았기 때문에 위임과 사전을 생각하고 리플렉션 호출 방법을 사전에서 대리자를 인덱싱하는 방식으로 전환했습니다.

먼저 핸들러에서 개인 정적 대리자 사전을 선언합니다.

static Dictionary> 그런 다음 핸들러(일반 핸들러 클래스)를 사용합니다. 정적 생성자, 그리고 더 중요한 것은 정적 생성자에 처리 방법을 추가하는 것입니다:

코드 복사 코드는 다음과 같습니다. 🎜>
static Handler()
 {
hs = new Dictionary>()
hs.Add("add", Delegate()
  {
  int id = int.Parse(req("id"));
  string title = req("title")
   return "add"); > hs.Add("update", Delegate()
int id = int.Parse(req("id")); string title = req("title");
   return "update"; 코드


코드는 다음과 같습니다.


context.Response.ContentType = "text/plain";
HttpRequest req = context.Request
string action; = req["action"].ToLower();
string result = hs[action]();
context.Response.Write(result)

이렇게 하면 전환이 방지됩니다. ...케이스 변수 범위 문제 및 반영 효율성 문제. 위에 사용된 req() 메서드와 관련하여 내 생각은 다음과 같은 정적 메서드를 사용하여 공개 항목을 제공하는 것입니다. 코드 복사
코드는 다음과 같습니다:


static string req(string key)
{
return HttpContext.Current.Request[key];
}
static string jss(object obj )
 {
  JavaScriptSerializer JSS = new JavaScriptSerializer()
return JSS.Serialize(obj);
문제 2: 권한 문제.

사용자가 로그인하지 않았거나 로그인이 만료된 경우 데이터에 계속 액세스하는 것을 원하지 않을 것입니다. 여기서는 로그인한 사용자가 Session["user"]에 저장되어 있다고 가정합니다. 물론 핸들러에서 Session["user"]를 판단하는 것은 매우 간단하지만 문제는 다음과 같은 경우에 사용자를 어떻게 만들 것인가입니다. 세션["user"]가 null입니까? 지정된 페이지로 이동합니다(여기서는 로그인 페이지 login.html이라고 가정). ㅎㅎ 이때쯤이면 context.Response.Redirect("login.html")를 이용해서 해결해보시는 건 어떨까요? 내 첫 번째 반응은 이것이었지만 분석 후 ajax가 login.html 페이지를 요청하도록 하여 수행됩니다. 분석은 다음과 같습니다. 예, 하지만 여전히 수행하지 않았습니다. 포기하지 말고 테스트해 보니 ajax 요청 결과로 login.html 소스 코드가 반환되었습니다!
이 방법은 매우 간단하고 안정적이지만, 서투르고 번거로우며 실현 가능성이 낮습니다. 그래서 jquery.ajaxSuccess() 를 다시 생각해서 통합 처리에 사용하고 싶었는데, 생각해보니 jquery가 특정 요청의 콜백 함수를 먼저 호출한 다음 전역 콜백을 호출할지 조금 걱정이 되었습니다. 기능에 대해? 이 질문으로 테스트를 해보니 예상한 대로 특정 요청에 대한 콜백이 먼저 실행되고 그다음에 전역 콜백이 실행되었습니다! 어쩔 수 없이 jquery의 소스코드를 확인해 봤습니다~. 압축되지 않은 jquery-1.4.2.js에서 Success() 메소드를 찾았는데, 당연히 순서를 변경하고 나면 다음과 같습니다.


function Success() {
if ( s.global ) {
Trigger( "ajaxSuccess", [xhr, s]
}
   // 로컬 콜백을 실행하고 데이터를 전달합니다.
  if ( s.success && xhr.responseText!="unlogin" ) {
   s .success.call( callbackContext, data, status, xhr );
  }
 }


  점프 가능한 코드는 어디에 작성해야 하나요? 각 페이지? 아니요, 아니요, 이것은 우리의 프로그램 작성 스타일이 아닙니다. 생각해 본 후 jquery 파일(하단)에 작성하는 것이 가능한 방법입니다.


$(document).ajaxSuccess(function(event,xhr,settings){
if(xhr.responseText= ="unlogin"){
window.top.location.href="/login.html";
}
})


모든 Ajax가 아니라는 것은 매우 분명합니다. login.html 페이지와 같이 페이지 요청의 경우 로그인이 필요하므로 로그인이 필요하지 않은 페이지는 심사 시 제외되어야 합니다.


 if (HttpContext.Current.Request.UrlReferrer.ToString().ToLower().IndexOf("login .html") < 0)
 {
 if (HttpContext.Current.Session[ "user"] == null)
  {
   HttpContext.Current.Response.Write("unlogin") ;
   HttpContext.Current.Response.End() 🎜>

질문 3: 데이터 템플릿.

필요한 것은 무엇이든지 이루어진다! 이 에세이를 쓰기 전, 우연히 정원에서 jquery.tmpl에 대한 글을 보게 되었습니다! tmpl을 만드는 것이 바로 이 문제에 대한 해결책입니다! 이 방법은 tmpl만큼 강력하지 않다는 것을 알고 있지만 tmpl에는 해결되지 않은 문제가 있습니다. 실제로 템플릿에는 두 가지 주요 문제가 있습니다. 1. 템플릿을 js에 저장하면 편집이 어렵습니다. , 2. 디자인 시간 보기를 용이하게 하려면 템플릿을 어디에 저장해야 합니까? tmpl은 태그에 템플릿을 저장합니다. 첫 번째 문제는 해결되었다고 해야 하지만 두 번째 문제도 매우 어렵다고 생각합니다. 중요한. ! 많은 고민 끝에 템플릿을 데이터의 컨테이너 태그에만 직접 저장할 수 있습니다.



코드 복사
코드는 다음과 같습니다. 다음:


데이터처럼 템플릿을 대상 컨테이너에 직접 작성하는 것은 아티스트가 스타일을 조정하는 것은 문제가 되지 않으며, 프로그램이 메소드를 추가하는 것은 문제가 되지 않을 것이라고 생각합니다. 일하다! 하지만 js는 이 템플릿을 직접 운영하지 않을 것입니다. 지금 해야 할 일은 이 템플릿을 실제 템플릿으로 바꾸는 것입니다:
코드 복사 코드는 다음과 같습니다.

$(function() {
var ulList = $("#ulList");
ulList.data("tpl",ulList. html()) .empty();
 }

컨테이너의 데이터에 템플릿을 저장하고 페이지가 로드된 후 즉시 수행하는 것이 가장 적합합니다! 배경은 나중에 로드되는 실제 데이터에 대한 json 데이터를 제공합니다.
코드 복사 코드는 다음과 같습니다.

public class News
{
public int ID { get; set; }
public string Title { get; string Content { get; }
}
//위의 첫 번째 문제에 대한 해결책은 핸들러에서 사용됩니다
hs.Add("getNews", Delegate()
 {
List< ;뉴스> 목록 = 새 목록()
  {
   새 뉴스(){ ID=1,Title="title1",Content="Content1"},
,Content="Content2" },
  new News(){ ID=3,Title="title3",Content="Content3"},
  }
 return jss(list)


프론트 데스크에서 데이터를 얻는 것에 대해 말할 것도 없습니다. 이것은 매우 기본입니다.

코드 복사 코드는 다음과 같습니다:
$.get("Handler.ashx?n=" Math.random(), { action: "getNews" }, function(data) {
var list = $.parseJSON(data);
var ul = $("#ulList")
var html = ""
for (var i = 0; i < list.length; i )
html = ul.data("tpl").format(list[i])
}
ul.html(html)
})

데이터를 생성할 때 string.format 메서드를 사용했습니다. 제
js의 string.format 에세이에 기록되어 있습니다. ㅎㅎ 포맷을 작성할 때는 이런 내용이 있을 줄은 몰랐습니다. json 객체를 지원하도록 만드는 목적은 읽기 쉽지만 사용하기에 매우 적합합니다! 여기 도착했을 때 테스트 결과는 다음과 같습니다.

그런데 이벤트를 추가하고 보니 부족하더군요. Li 템플릿에 onclick="show({ID},'{Title}')"을 추가하면 IE에서 페이지를 처음 열 때 js 오류가 발생합니다. 이유는 무엇입니까? 문제는 ID 매개변수에 있습니다. 왜냐하면 {ID}가 json 객체로 간주되지만 잘못된 형식의 json이기 때문입니다! js 오류 프롬프트도 정상이므로 오류가 없습니다. 문자열 매개변수로 간주됩니다. 이 js 오류는 프로그램에 영향을 미치지 않지만 js 오류 없이 작성한 코드를 좋아하는 사람은 아무도 없습니다! 해결책은 매우 간단합니다. Title 매개변수와 같은 따옴표를 추가하면 됩니다. show 메소드에 숫자 유형이 정말로 필요한 경우, 그곳에서 변환해야 합니다. 그러나 변환할 필요가 없으며 심지어 문자열 유형이기를 원하는 경우도 많다는 사실을 확실히 알게 될 것입니다!


이렇게 진지하게 에세이를 써본 적이 없어요. 오늘 오후에는 여자친구랑 같이 자지도, 친구와 술 마시지도 않고 솔직하게 끝냈습니다!
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!