"그녀는 과거에 쓸모가 있었다!"이번 주에 해결된 웹 개발 문제 검토
26103 단어 webdevjavascript
디테일
아름다운 강아지 협회(PPA)*는 회원과 다른 강아지 애호가들에게 사이트를 제공한다.이것은 내장된 표현식 엔진으로, 그들은 낮은 순서의 플러그인 (기타 플러그인) 과 jQuery를 사용합니다.
그들의 채널 중 하나는 국가 강아지 채널이다.그것은 미국 각 주의 공식 강아지 (푸에르토리코 한 마리) 가 참가한 51개의 작품을 가지고 있다.항목마다 사진 한 장, 품종 명칭, 강아지 품종에 대한 기본 정보가 있다.
* 이는 완전히 조작된 것이지만 최종 사이트의 주제는 이 글에 중요하지 않다.
그것은 일찍이 기능상에서 작용한 적이 있다
PPA 사이트 홈페이지에는 이 특색 있는 강아지의 그림과 품종명을 보여주는 스포트라이트 코너가 있다.이곳에서 사용자는 밑에 있는 메뉴에서 그들이 있는 주의 공식 강아지를 선택할 수 있다.그들이 선택을 할 때, 스포트라이트 구역의 사진과 품종 이름이 그들의 선택과 일치하도록 변화할 것이다.사용자가 장래에 이 사이트를 방문할 때, 그들이 마지막으로 선택한 강아지는 스포트라이트 기능에 나타나야 한다.
비밀 번호
홈 템플릿에 select 요소만 있는 폼을 포함하여spotlight 부분 자체가 있습니다.당신은 어느 곳에서든 강아지의 특정한 정보(품종, 이미지 URL)가 있다는 것을 알게 될 것입니다.아무것도 아니에요.이러한 정보는 JavaScript를 통해 읽어들여 DOM에 배치됩니다.
select 요소 자체는 저중 정렬 플러그인의 도움말 아래 표현식 엔진을 통해 채워집니다.
<div class="section-4 puppysection">
<div class="row">
<div class="container">
<h2 class="col-md-12 spotlighthdr"><i class="fa fa-chevron-circle-right" aria-hidden="true"></i> Spotlight On Spot</span></h2>
<div class="col-md-4">
<div class="homefeatured">
<a class="puppylink" href="URL"><div id="divFeaturedPuppyBreed" class="featuredbreed">Breed</div></a>
<a id="aFeaturedPuppy" href="URL"><img id="imgFeaturedPuppy" src="IMG" class="img-responsive puppy-photo" alt="BREED" width="326" height="336" /></a>
</div>
</div>
<div class="col-md-8">
{exp:channel:entries channel="new_home_page" dynamic="off" limit="1"}
{spotlight_text}
{/exp:channel:entries}
<div class="col-md-8">
<form class="connectform">
<div class="col-md-8 nopadding">
<label title="Pick a state to see that state's official state puppy and get a link to read more." for="drpPuppies" class="hiddenLabel2">Pick a state to see that state's official state puppy and get a link to read more.</label>
<select id="drpPuppies" name="puppylist" form="puppyform">
{exp:low_reorder:entries set="puppies" dynamic="no" disable="member_data|category_fields"}
<option value="{entry_id}">{state}</option>
{/exp:low_reorder:entries}
</select>
</div>
</form>
<div style="clear:both;padding-top:20px;">
<a id="aFeaturedPuppyLink" href="URL">Read more about the <span class="sbreed"></span></a>
</div>
</div>
</div>
</div>
</div>
</div>
홈 템플릿에 내장된 JavaScript도 있습니다.상태 선택에 변경 이벤트 탐지기가 설정되어 있습니다.변경 이벤트를 트리거하면/site/puppy info/VALUE OF SELECTION에서 JSON 데이터를 읽어들입니다.만약 우리가 성공적인 GET 요청을 한다면, 이 정보는 우리의 스포트라이트 부분에서 선택한 강아지의 정보를 채우는 데 사용될 것이다.스크립트의 맨 밑에 있는 것을 우리는 보았다
$('#drpPuppies').change();
.이 코드는 변경 이벤트를 터치하고 있지만 사용자가 실제로 선택하지 않았습니다.이것은 다음 달에 중요해질 것이다.function jqExt() {
$('#drpPuppies').on('change', function () {
$.getJSON("/site/puppy-info/" + this.value, function (result, status) {
if (status == "success") {
$('#divFeaturedPuppyName').text(result.name);
$('.sname').text(result.name);
$('.puppylink').attr("href", result.bio_url);
$('#aFeaturedPuppy').attr("href", result.bio_url);
$('#aFeaturedPuppyLink').attr("href", result.bio_url);
$('#imgFeaturedPuppy').attr("alt", result.name);
$('#imgFeaturedPuppy').attr("width", result.image_width);
$('#imgFeaturedPuppy').attr("height", result.image_height);
$('#imgFeaturedPuppy').attr("src", result.image_url);
}
});
});
$('#drpPuppies').change();
}
"/site/puppy info/" {exp:low_reorder:entries set="puppies" entry_id="{segment_3}" }
{exp:ce_img:pair src="{puppy_picture}" width="300" height="340" crop="yes|center,top|0,0|yes" allow_scale_larger="yes"}
<?php
setcookie("exp_custom_default-puppy-id", {entry_id}, time() + (86400 * 365), "/", $_SERVER['SERVER_NAME']);
header("Content-Type: application/json");
$data = array( 'id' => '{entry_id}', 'breed' => '{breed}', 'image_url' => '{made}', 'image_width' => {width}, 'image_height' => {height}, 'puppy_url' => '{url_title_path="puppies/bio"}' );
echo json_encode($data);
?>
{/exp:ce_img:pair}
{/exp:low_reorder:entries}
눈을 깜빡이면 setcookie () 함수를 놓칠 수 있습니다.사용자가 선택 드롭다운 목록을 변경하면 GET 요청이/site/puppy info/VALUE SELECTED 로 전송됩니다.이 값이 선택되었거나 항목 id가 쿠키로 설정되었습니다.사용자가 홈페이지를 떠나 돌아올 때 그들이 마지막으로 선택한 강아지가 스포트라이트 부분에 나타날 것이라고 상상할 수 있습니까?그건 없었어.
문제의 소재
Spotlight on Spot 섹션에는 사용자가 마지막으로 선택한 강아지가 표시되지 않고 기본적으로 드롭다운 메뉴의 첫 번째 상태인 앨라배마주-블랙독이 표시됩니다.(이 예도 만들었어요. 알라바마에는 공식 개 품종이 없어요.)
왜?우선 과자는 다 만들었지만 이렇게.
쿠키는 읽히지 않았고 쿠키의 가치를 처리한 적이 없습니다.
그 밖에 select 요소의 작업 방식 때문에 변경 사건을 촉발하여 특색 있는 강아지가 항상 알라바마 주에 위치하게 되었다.선택 요소의 첫 번째 옵션은 항상 기본값입니다.따라서 페이지를 불러오고 변경 이벤트가 터치됩니다.기본값은 Alabama이고 쿠키 값은 Alabama입니다.한 번 또 한 번...
솔루션
이 문제를 해결하는 데는 네 가지 주요 부분이 있다. 창이 불러올 때 쿠키를 읽기;이 값은 GET 요청에 사용됩니다.변경 이벤트가 자동으로 트리거되지 않습니다.
<script>
function getCookie(key) {
var keyValue = document.cookie.match('(^|;) ?' + key + '=([^;]*)(;|$)');
return keyValue ? keyValue[2] : null;
}
function setPuppy(result) {
$('#divFeaturedPuppyName').text(result.name);
$('.sname').text(result.name);
$('.puppylink').attr("href", result.bio_url);
$('#aFeaturedPuppy').attr("href", result.bio_url);
$('#aFeaturedPuppyLink').attr("href", result.bio_url);
$('#imgFeaturedPuppy').attr("alt", result.name); $('#imgFeaturedPuppy').attr("width", result.image_width);
$('#imgFeaturedPuppy').attr("height", result.image_height);
$('#imgFeaturedPuppy').attr("src", result.image_url);
}
window.onload = (event) => {
puppySelect = document.getElementById('drpPuppies');
let myPuppy = getCookie("exp_custom_default-puppy-id");
if(myPuppy == "" || myPuppy == null){
myPuppy = "27";
}
puppySelect.value = myPuppy;
$.getJSON("/site/puppy-info/" + myPuppy, function (result, status) {
if (status == "success") {
setPuppy(result)
}
});
};
function jqExt() {
$('#drpPuppies').on('change', function () {
$.getJSON("/site/puppy-info/" + this.value, function (result, status) {
if (status == "success") {
setPuppy(result)
}
});
});
}
</script>
우선 함수 getCookie()
가 있습니다. 이 함수는 주어진 이름의 쿠키를 검색합니다.다음에 나는 spotlight 부분에서 강아지의 특정 정보를 새로운 함수
setPuppy()
로 설정했다. 그러면 나는 다른 두 함수에서 강아지를 호출할 수 있고 자신의 조작을 반복하지 않아도 된다.GET 요청의 결과를 매개변수로 사용합니다.옆에는 창문이 하나 있다.onload 이벤트, "exp custom default-puppy-id"쿠키를 확인하고 변수 myPuppy에 저장합니다.설정하지 않으면 기본값(플로리다 27!)을 반환합니다.
myPuppy 값은 GET 요청에 사용됩니다.이런 방식을 통해 우리는 모든 사용자가 이전에 가 본 적이 있든 없든, 과자가 기한이 지났든 귀여운 강아지 한 마리를 받을 수 있다.GET 요청 결과에서 참조하는 요소의 값을 설정하려면
setPuppy()
도 사용합니다.마지막으로 우리trusty
jqExt()
함수입니다. 변경 이벤트 탐지기는 아직 완전무결합니다.사용자가 선택할 때, 이것은 정확한pup을 보여 줍니다.setPuppy () 함수도 호출합니다.사상
사실은 이런 유용했던 방식이 지금까지 효과가 없었다는 것을 증명한다.그것은 웹 사이트를 업데이트할 때 요청한 것이지만, 이 기능은 요청한 방식대로 작동하지 않았다.이 사이트의 이전 교체 중에는 메인 페이지를 불러올 때마다 스포트라이트 부분을 무작위로 채운다.
당신은 최근에'예전에 유용했다'는 프로젝트를 해 본 적이 있습니까?
Reference
이 문제에 관하여("그녀는 과거에 쓸모가 있었다!"이번 주에 해결된 웹 개발 문제 검토), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/lizlaffitte/it-used-to-work-reviewing-this-week-s-web-dev-problem-solved-2be4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)