>  기사  >  웹 프론트엔드  >  자바스크립트 공개 스크립트 라이브러리 시리즈(1): 팝업 레이어 스크립트_javascript 기술

자바스크립트 공개 스크립트 라이브러리 시리즈(1): 팝업 레이어 스크립트_javascript 기술

WBOY
WBOY원래의
2016-05-16 18:10:20861검색
1. 요약
이 기사 시리즈는 일반적인 크로스 브라우저 스크립팅 방법을 추상화하기 위한 것입니다.

이 기사에서는 플로팅 레이어를 팝업하는 자바스크립트 기능과 함수의 원리와 기능.

2. 효과 얻기
스크립트를 사용하여 플로팅 레이어를 팝업하는 것은 가장 일반적으로 사용되는 스크립팅 방법 중 하나입니다. 렌더링은 다음과 같습니다.

image
사진에서 '항공사'를 클릭하면 '항공사' 아래에 플로팅 레이어가 나타납니다.

팝용 스크립트가 꽤 많이 있습니다. -up 상자가 있으며 우리가 사용할 수 있는 다양한 타사 JS 프레임워크가 있습니다. 그러나 일부 스크립트는 너무 단순하여 팝업 효과를 대략적으로만 달성하고 유연성, 다양성 및 크로스 브라우저 기능을 무시합니다. .JS 프레임워크를 사용하는 것은 약간의 낭비입니다. 그래서 몇 가지 정보를 수집하고 정리한 후 아래에 ScriptHelper 클래스의 팝업 레이어 방법을 작성했습니다.
다중 브라우저 지원
객체지향 메소드 캡슐화 사용
사용이 간편하고 활용도가 높습니다.
위치 계산 등 추출 기능을 모두 별도로 호출할 수 있으며 그에 따라 2차 개발을 계속할 수 있습니다.

3. 스크립트 방법
아래에서는 먼저 스크립트 방법을 설명하고 마지막으로 스크립트의 원리를 설명하겠습니다.


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

/* ==================== ScriptHelper 开始 ==================== */
/* scriptHelper 脚本帮助对象.
创建人: ziqiu.zhang 2008.3.5
添加函数:
getScroll():得到鼠标滚过的距离-兼容XHTML
getClient():得到浏览器当前显示区域的大小-兼容XHTML
showDivCommon():显示图层.
使用举例:


*/
function scriptHelper()
{
}

// 得到鼠标滚过的距离 scrollTop 与 scrollLeft
/* 用法与测试:
var myScroll = getScroll();
alert("myScroll.scrollTop:" + myScroll.scrollTop);
alert("myScroll.scrollLeft:" + myScroll.scrollLeft);
*/
scriptHelper.prototype.getScroll = function ()
{
var scrollTop = 0, scrollLeft = 0;
scrollTop = (document.body.scrollTop > document.documentElement.scrollTop)? document.body.scrollTop:document.documentElement.scrollTop;
if( isNaN(scrollTop) || scrollTop <0 ){ scrollTop = 0 ;}
scrollLeft = (document.body.scrollLeft > document.documentElement.scrollLeft )? document.body.scrollLeft:document.documentElement.scrollLeft;
if( isNaN(scrollLeft) || scrollLeft <0 ){ scrollLeft = 0 ;}
return { scrollTop:scrollTop, scrollLeft: scrollLeft};
}
// 得到浏览器当前显示区域的大小 clientHeight 与 clientWidth
/* 用法与测试:
var myScroll = getScroll();
alert("myScroll.sTop:" + myScroll.sTop);
alert("myScroll.sLeft:" + myScroll.sLeft);
*/
scriptHelper.prototype.getClient = function ()
{
//判断页面是否符合XHTML标准
var isXhtml = true;
if( document.documentElement == null || document.documentElement.clientHeight <= 0)
{
if( document.body.clientHeight>0 )
{
isXhtml = false;
}
}
this.clientHeight = isXhtml?document.documentElement.clientHeight:document.body.clientHeight;
this.clientWidth = isXhtml?document.documentElement.clientWidth:document.body.clientWidth;
return {clientHeight:this.clientHeight,clientWidth:this.clientWidth};
}

// 显示图层,再次调用则隐藏
/* 参数说明:
sObj : 要弹出图层的事件源
divId : 要显示的图层ID
sObjHeight : 事件源的高度,默认为20.需要手工传入是因为对于由于事件源对象可能是各种HTML元素,有些元素高度的计算无法跨浏览器通用.
moveLeft : 手工向左移动的距离.不移动则为0(默认).
divObjHeight: 弹出层的高度.如果传入大于0的此参数, 则当事件源下方空间不足时,在事件源上方弹出层.如果不传此参数则一直在事件源下方弹出.
用法与测试:

*/
scriptHelper.prototype.showDivCommon = function (sObj,divId, sObjHeight, moveLeft, divObjHeight)
{
//버블링 이벤트 취소
if( typeof(window)! ='정의되지 않음' && window != null && window.event != null )
{
window.event.cancelBubble = true
}
else if( ScriptHelper.showDivCommon.caller.arguments[ 0] != null )
{
ScriptHelper.showDivCommon.caller.arguments[0].cancelBubble = true;
}
//매개변수 감지가 전달되지 않은 경우 기본값을 설정합니다. value
if( moveLeft == null )
{
moveLeft = 0
}
if( sObjHeight == null )
{
sObjHeight = 20; }
if(divObjHeight == null)
{
divObjHeight = 0;
}

var divObj = document.getElementById(divId); >var sObjOffsetTop = 0; //이벤트 소스의 수직 거리
var sObjOffsetLeft = 0; //이벤트 소스의 수평 거리
var myClient = this.getClient()
var myScroll = this.getScroll( ); var sWidth = sObj.width; //이벤트 소스 객체의 너비
var sHeight = sObjHeight; //이벤트 소스 객체의 높이
var BottomSpace; >/* 이벤트 소스 컨트롤의 높이와 너비를 가져옵니다.*/
if( sWidth == null )
{
sWidth = 100;//얻을 수 없는 경우 100입니다.
}
else
{
sWidth = sWidth 1; //1px 거리 유지
}

if( divObj.style.display.toLowerCase() != "none" )
{
/ /레이어 숨기기
divObj.style.display = "none"
}
else
{
if( sObj == null )
{
alert("이벤트 소스 개체가 null입니다.");
return false
}
/* 이벤트 소스 개체의 오프셋 가져오기*/
var tempObj = sObj; 이벤트 소스 좌표를 계산하는 데 사용되는 임시 Object
while( tempObj && tempObj.tagName.toUpperCase() != "BODY" )
{
sObjOffsetTop = tempObj.offsetTop
sObjOffsetLeft = tempObj.offsetLeft; ;
tempObj.offsetParent;
}
tempObj = null;

/* 바닥으로부터의 거리 가져오기*/
bottomSpace =parseInt(myClient.clientHeight) parseInt(sObjOffsetTop) -parseInt(myScroll.scrollTop)) -parseInt(sHeight);
/* 레이어 표시 위치 설정*/
//이벤트 소스 아래 공간이 부족하고 상단 컨트롤이 충분한 경우 팝업 레이어를 수용하기 위해 위에 표시됩니다.
if( divObjHeight>0 && BottomSpace < divObjHeight && sObjOffsetTop >divObjHeight )
{
divObj.style .top = (parseInt(sObjOffsetTop) -parseInt(divObjHeight) - 10).toString() "p x ";
}
else
{
divObj.style.top = (parseInt( sObjOffsetTop ) parseInt( sHeight ) ).toString() "px";
}
divObj.style.left = (parseInt( sObjOffsetLeft ) -parseInt( moveLeft ) ).toString()
divObj. style.display="block";
}
}

// 레이어 닫기
/* 매개변수 설명:
divId: 숨길 레이어의 ID
사용법 및 테스트:
ScriptHelper.closeDivCommon('testDiv');
*/
scriptHelper.prototype.closeDivCommon = function (divId)
{
//
var divObj = document .getElementById(divId); //레이어 객체 가져오기
if( divObj != null )
{
divObj.style.display = "none"
}
}
//scriptHelper 클래스의 인스턴스 객체를 생성합니다.
var ScriptHelper = new scriptHelper()
/* ================ = ScriptHelper end ==================== */



4. 사용 예
다음으로 만듭니다. 이 스크립트를 사용하는 방법을 보여주는 HTML 페이지입니다.
1. 스크립트 파일 참조 위 코드를 ScriptHelper.js 파일에 저장합니다. 페이지로:
>2. 하위 메뉴 작성
먼저 하위 메뉴 레이어 2개를 작성합니다.

코드 복사


코드는 다음과 같습니다.

코드 복사


코드는 다음과 같습니다.

그 중 Menu1과 Menu2가 있습니다. 하위 메뉴, NoSubMenu에는 하위 메뉴가 없습니다.
메뉴 객체를 생성하기 위해 a 요소를 사용했지만 여기에 추가된 href 속성이 없기 때문에 기본적으로 마우스를 올려도 손그림으로 바뀌지 않습니다. 여기에 CursorHand 스타일을 추가해야 하며 하위 스타일의 코드는 다음과 같습니다.

가장 중요한 것은 메뉴에 추가된 onclick 이벤트입니다. 이 이벤트는 ScriptHelper.showDivCommon 메소드를 호출하여 레이어를 표시합니다.
메서드의 첫 번째 매개변수 값은 다음과 같습니다. 이벤트 소스 객체가 전달되고, 함수 내 이벤트 소스를 기준으로 표시 위치가 계산됩니다.
메서드의 두 번째 매개변수는 팝업 이미지의 ID를 나타냅니다.
세 번째 매개변수는 method는 아래쪽 오프셋을 설정하는 데 사용되는 선택적 매개변수입니다. 우리가 계산하는 위치는 "Menu1"이므로 일반적으로 이 요소의 왼쪽 상단 좌표를 설정해야 합니다. 이벤트 소스의 높이로 설정하면 기본값은 20px입니다.
메소드의 네 번째 매개변수는 왼쪽 오프셋을 설정하는 데 사용되는 매개변수입니다. 기본값은 0px입니다. ;
메소드의 다섯 번째 매개변수는 선택 매개변수로 팝업 레이어 높이에 전달되어야 합니다. 이 속성을 사용하면 팝업 레이어가 이벤트 소스 위에 나타날 수 있습니다. 이 속성을 전달합니다. 레이어는 항상 이벤트 소스 아래에 나타납니다.
4. 효과 및 전체 코드

image
전체 예제 코드는 다음과 같습니다.

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




ScriptHelper 수업 테스트 페이지</ title> <br><script src="http://files.cnblogs.com/zhangziqiu/ScriptHelper.js" type="text/javascript" defer="defer"></script> ; <BR>< ;style type="text/css"> <br>.cursorHand { 커서:포인터;} <br></style> <br></head> ="위치:상대적 ;"> <br><div style="height:200px;"></div> <br><!-- 메인 메뉴 --> > <br> <a class="cursorHand" onclick="ScriptHelper.showDivCommon(this,'subMenu1', 20, 0, 100)">Menu1</a> <br><a class="cursorHand " onclick="ScriptHelper .showDivCommon(this,'subMenu2', 20, 0)">Menu2</a> <br><a class="cursorHand" href="#">NoSubMenu</a> <br></ div> <br><!-- 하위 메뉴 1 --> <br><div id="subMenu1" style="position:absolute; display:none; background-color:#D7EFCD ; 테두리:단색 1px #000000; 여백: 0px; 높이:100px;"> <br><div>1-1</div> <br><div>1-2</div> ; <BR>< ;/div> <br><!-- 하위 메뉴 2 --> <br><div id="subMenu2" style="position:absolute; display:none; 배경색: #D7EFCD; 테두리: 단색 1px #000000; 패딩:5px;" > <br><div>2-1</div> <br><div>2-2</div> <br>< /div> <br></body> <br></html><br><strong>5. 참고</strong>: <br>1. Body 요소에 position:relative 스타일을 추가합니다. <br><body style="position:relative;"> , 때로는 IE6에서 이벤트 소스를 정확하게 찾을 수 없습니다. 예를 들어, 메뉴의 <div>에 여러 개의 <br/>가 추가되면 팝업 레이어의 위치가 잘못됩니다. Body 요소에 이 스타일을 추가했는데도 여전히 팝업 위치가 잘못된 경우 이벤트 소스 객체의 컨테이너 요소에 이 스타일을 추가하세요.<br>2. 마지막 매개변수가 전달되지 않으면 팝업이 발생합니다. 위쪽 레이어는 이벤트 소스 아래에만 팝업됩니다. 그렇지 않으면 이벤트가 계산됩니다. 예를 들어 소스 하단에서 아래쪽 컨트롤이 부족하고 위쪽 컨트롤이 충분하면 팝업 레이어가 위에 표시됩니다. <br>3. DOCTYPE 요소를 페이지에 추가합니다. 추가하지 않으면 일부 브라우저에서 오류가 발생할 수 있습니다. <br><br>DOCTYPE 문서를 참조하세요. 요소 분석<br><a href="http://www.jb51.net/web/34579.html" target="_blank">6. 요약</a><br>이 기능에는 여전히 문제가 있을 것 같아 여러 브라우저와의 호환성이 정말 골치 아픈 문제입니다. , 하지만 작성하는 동안 몇 가지 버그를 발견하고 수정했습니다. 호환성이 왔다 갔다 하다가 결국 호환성을 잃었습니다. 사실, 프로젝트가 가능하다면 이 시리즈의 기사는 빌드하는 것이 좋은 선택이 될 것입니다. 가벼운 스크립트 라이브러리입니다. 사용 중에 궁금한 점이 있으면 더 많이 소통하고 간단하고 사용하기 쉬운 스크립트 라이브러리를 함께 만들어 보세요!</div></div><div class="nphpQianMsg"><div class="clear"></div></div><div class="nphpQianSheng"><span>성명:</span><div>본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.</div></div></div><div class="nphpSytBox"><span>이전 기사:<a class="dBlack" title="JavaScript ( (__ = !$ $)[ $] ({} $)[_/_] ({} $)[_/_] )_javascript 기술" href="http://m.php.cn/ko/faq/20414.html">JavaScript ( (__ = !$ $)[ $] ({} $)[_/_] ({} $)[_/_] )_javascript 기술</a></span><span>다음 기사:<a class="dBlack" title="JavaScript ( (__ = !$ $)[ $] ({} $)[_/_] ({} $)[_/_] )_javascript 기술" href="http://m.php.cn/ko/faq/20416.html">JavaScript ( (__ = !$ $)[ $] ({} $)[_/_] ({} $)[_/_] )_javascript 기술</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>관련 기사</h2><em><a href="http://m.php.cn/ko/article.html" class="bBlack"><i>더보기</i><b></b></a></em><div class="clear"></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-6t+ed+2i-1n-4w" data-ad-client="ca-pub-5902227090019525" data-ad-slot="8966999616"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><ul class="nphpXgwzList"><li><b></b><a href="http://m.php.cn/ko/faq/1609.html" title="Bootstrap 목록 그룹 구성 요소에 대한 심층 분석" class="aBlack">Bootstrap 목록 그룹 구성 요소에 대한 심층 분석</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ko/faq/1640.html" title="JavaScript 함수 커링에 대한 자세한 설명" class="aBlack">JavaScript 함수 커링에 대한 자세한 설명</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ko/faq/1949.html" title="JS 비밀번호 생성 및 강도 감지의 전체 예(데모 소스 코드 다운로드 포함)" class="aBlack">JS 비밀번호 생성 및 강도 감지의 전체 예(데모 소스 코드 다운로드 포함)</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ko/faq/2248.html" title="Angularjs는 WeChat UI(weui)를 통합합니다." class="aBlack">Angularjs는 WeChat UI(weui)를 통합합니다.</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ko/faq/2351.html" title="JavaScript를 사용하여 중국어 번체와 중국어 간체 간을 빠르게 전환하는 방법과 중국어 간체와 중국어 번체 간 전환을 지원하는 웹사이트의 요령_javascript 기술" class="aBlack">JavaScript를 사용하여 중국어 번체와 중국어 간체 간을 빠르게 전환하는 방법과 중국어 간체와 중국어 번체 간 전환을 지원하는 웹사이트의 요령_javascript 기술</a><div class="clear"></div></li></ul></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="5027754603"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><div class="nphpFoot"><div class="nphpFootBg"><ul class="nphpFootMenu"><li><a href="http://m.php.cn/ko/"><b class="icon1"></b><p>집</p></a></li><li><a href="http://m.php.cn/ko/course.html"><b class="icon2"></b><p>강의</p></a></li><li><a href="http://m.php.cn/ko/wenda.html"><b class="icon4"></b><p>Q&A</p></a></li><li><a href="http://m.php.cn/ko/login"><b class="icon5"></b><p>나의</p></a></li><div class="clear"></div></ul></div></div><div class="nphpYouBox" style="display: none;"><div class="nphpYouBg"><div class="nphpYouTitle"><span onclick="$('.nphpYouBox').hide()"></span><a href="http://m.php.cn/ko/"></a><div class="clear"></div></div><ul class="nphpYouList"><li><a href="http://m.php.cn/ko/"><b class="icon1"></b><span>집</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ko/course.html"><b class="icon2"></b><span>강의</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ko/article.html"><b class="icon3"></b><span>기사</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ko/wenda.html"><b class="icon4"></b><span>Q&A</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ko/dic.html"><b class="icon6"></b><span>사전</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ko/course/type/99.html"><b class="icon7"></b><span>수동</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ko/xiazai/"><b class="icon8"></b><span>다운로드</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ko/faq/zt" title="주제"><b class="icon12"></b><span>주제</span><div class="clear"></div></a></li><div class="clear"></div></ul></div></div><div class="nphpDing" style="display: none;"><div class="nphpDinglogo"><a href="http://m.php.cn/ko/"></a></div><div class="nphpNavIn1"><div class="swiper-container nphpNavSwiper1"><div class="swiper-wrapper"><div class="swiper-slide"><a href="http://m.php.cn/ko/" >집</a></div><div class="swiper-slide"><a href="http://m.php.cn/ko/article.html" class="hover">기사</a></div><div class="swiper-slide"><a href="http://m.php.cn/ko/wenda.html" >Q&A</a></div><div class="swiper-slide"><a href="http://m.php.cn/ko/course.html" >강의</a></div><div class="swiper-slide"><a href="http://m.php.cn/ko/faq/zt" >주제</a></div><div class="swiper-slide"><a href="http://m.php.cn/ko/xiazai" >다운로드</a></div><div class="swiper-slide"><a href="http://m.php.cn/ko/game" >게임</a></div><div class="swiper-slide"><a href="http://m.php.cn/ko/dic.html" >사전</a></div><div class="clear"></div></div></div><div class="langadivs" ><a href="javascript:;" class="bg4 bglanguage"></a><div class="langadiv" ><a onclick="javascript:setlang('zh-cn');" class="language course-right-orders chooselan " href="javascript:;"><span>简体中文</span><span>(ZH-CN)</span></a><a onclick="javascript:setlang('en');" class="language course-right-orders chooselan " href="javascript:;"><span>English</span><span>(EN)</span></a><a onclick="javascript:setlang('zh-tw');" class="language course-right-orders chooselan " href="javascript:;"><span>繁体中文</span><span>(ZH-TW)</span></a><a onclick="javascript:setlang('ja');" class="language course-right-orders chooselan " href="javascript:;"><span>日本語</span><span>(JA)</span></a><a onclick="javascript:;" class="language course-right-orders chooselan chooselanguage" href="javascript:;"><span>한국어</span><span>(KO)</span></a><a onclick="javascript:setlang('ms');" class="language course-right-orders chooselan " href="javascript:;"><span>Melayu</span><span>(MS)</span></a><a onclick="javascript:setlang('fr');" class="language course-right-orders chooselan " href="javascript:;"><span>Français</span><span>(FR)</span></a><a onclick="javascript:setlang('de');" class="language course-right-orders chooselan " href="javascript:;"><span>Deutsch</span><span>(DE)</span></a></div></div><script> var swiper = new Swiper('.nphpNavSwiper1', { slidesPerView : 'auto', observer: true,//修改swiper自己或子元素时,自动初始化swiper observeParents: true,//修改swiper的父元素时,自动初始化swiper }); </script></div></div><!--顶部导航 end--><script>isLogin = 0;</script><script type="text/javascript" src="/static/layui/layui.js"></script><script type="text/javascript" src="/static/js/global.js?4.9.47"></script></div><script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script><link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css' type='text/css' media='all'/><script type='text/javascript' src='/static/js/viewer.min.js?1'></script><script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script><script>jQuery.fn.wait = function (func, times, interval) { var _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = this, _selector = this.selector, //选择器 _iIntervalID; //定时器id if( this.length ){ //如果已经获取到了,就直接执行函数 func && func.call(this); } else { _iIntervalID = setInterval(function() { if(!_times) { //是0就退出 clearInterval(_iIntervalID); } _times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 if( _self.length ) { //判断是否取到 func && func.call(_self); clearInterval(_iIntervalID); } }, _interval); } return this; } $("table.syntaxhighlighter").wait(function() { $('table.syntaxhighlighter').append("<p class='cnblogs_code_footer'><span class='cnblogs_code_footer_icon'></span></p>"); }); $(document).on("click", ".cnblogs_code_footer",function(){ $(this).parents('table.syntaxhighlighter').css('display','inline-table');$(this).hide(); }); $('.nphpQianCont').viewer({navbar:true,title:false,toolbar:false,movable:false,viewed:function(){$('img').click(function(){$('.viewer-close').trigger('click');});}}); </script></body></html>