>웹 프론트엔드 >JS 튜토리얼 >JavaScript 부동 위치 지정 프롬프트 효과 구현 code_javascript 기술

JavaScript 부동 위치 지정 프롬프트 효과 구현 code_javascript 기술

PHP中文网
PHP中文网원래의
2016-05-16 18:46:261215검색

원래는 부동 위치 지정과 마우스 따르기를 결합한 툴팁 효과를 만들고 싶었지만 위치 지정과 마우스 따르기가 일부 주요 위치에서 여전히 다르기 때문에 별도로 수행해야 합니다.

이 효과 자체는 그다지 어렵지 않습니다. 주로 프로그램 구조와 확장에 힘을 쏟고 있어 좀 더 편리하게, 더 많은 곳에서 사용할 수 있게 되었습니다.
프로그램 기능
1. 동일한 프롬프트 상자가 여러 트리거 요소에 사용되는 경우 하나의 인스턴스만 필요합니다.
2. 각각 표시 및 숨기기 중에서 선택할 수 있는 방법이 있습니다. 3. 지연된 표시 및 숨기기를 설정할 수 있습니다.
4, 사전 설정된 위치 지정이 25개 있습니다.
5, 사전 설정된 위치 지정을 기반으로 위치 지정을 사용자 정의할 수 있습니다.
6, 적응형 창 위치 지정을 설정할 수 있습니다. 🎜>프로그램 설명
[Tip 개체]
Tip 개체는 프롬프트 정보를 표시하는 데 사용되는 컨테이너이며, 프로그램은 Tip 속성으로 표시됩니다. 이에 대한 요구 사항은 없으며 프로그램이 초기화될 때 일부 설정이 지정됩니다.
먼저 다음 설정을 수행합니다.

프로그램이 팁의 offsetWidth 및 offsetHeight를 가져와야 하므로 표시 대신 숨기려면 여백을 0으로 설정합니다. 팁이 공간을 차지하기 때문에 왼쪽과 위쪽에 스크롤 막대가 표시되지 않도록 설정해야 합니다.
var css = this._cssTip; 
css.margin = 0; 
css.position = "absolute"; css.visibility = "hidden"; 
css.display = "block"; css.zIndex = 99; 
css.left = this._cssTip.top = "-9999px";
Tip이 다른 위치 지정 요소 안에 있을 수 있으므로 두 개의 오프셋 수정 매개변수를 설정해야 합니다.


마지막으로 Tip의 마우스 오버에 이벤트를 추가합니다. 이에 대해서는 나중에 설명하겠습니다.
var iLeft = 0, iTop = 0, p = this.Tip; 
while (p.offsetParent) { 
p = p.offsetParent; iLeft += p.offsetLeft; iTop += p.offsetTop; 
}; 
this._offsetleft = iLeft; 
this._offsettop = iTop;
[트리거 객체]

하나의 Tip이 여러 곳의 Tip에 해당하는 경우가 많기 때문에 프로그램은 Table 정렬 방식을 참조하여 Add 메소드를 추가합니다.
Tip이 인스턴스화되면 Add 메서드를 사용하여 여러 트리거 요소에 트리거 개체를 추가할 수 있습니다. _trigger 속성은 프로그램에서 현재 트리거 개체를 나타내는 데 사용됩니다.
Add 메소드의 필수 매개변수는 Tip 표시를 트리거하는 요소인 트리거 요소입니다.
필요한 경우 옵션 매개변수를 사용하여 다음을 포함하여 트리거 개체의 속성을 맞춤 설정할 수도 있습니다.
속성: 기본값//설명

구체적인 기능은 나중에 설명합니다. , 프로그램 초기화 중에 사용할 수 있습니다. 이러한 기본값을 수정하십시오.
ShowType: "both",//显示方式 
HideType: "both",//隐藏方式 
ShowDelayType: "touch",//显示延迟方式 
HideDelayType: "touch",//隐藏延迟方式 
ShowDelay: 300,//显示延时时间 
HideDelay: 300,//隐藏延时时间 
Fixed: {},//定位对象 
onShow: function(){},//显示时执行 
onHide: function(){}//隐藏时执行
클래식 응용 프로그램은 onShow의 팁을 각 트리거 개체에 해당하는 콘텐츠로 수정하는 것입니다.

추가로, 트리거 요소를 저장하는 Elem 속성이 있습니다.
【표시 및 숨기기】
프롬프트 효과의 핵심 포인트 중 하나는 프롬프트 정보를 표시하고 숨기는 것입니다. 프로그램은 팁의 가시성을 숨길지 여부를 설정하여 팁을 표시하고 숨깁니다.
특정 표시 및 숨기기 프로그램은 각각 표시 및 숨기기 프로그램과 지연을 처리하는 데 주로 사용되는 ReadyShow 및 ReadyHide 프로그램에 있습니다.
이 팁 효과의 특징 중 하나는 마우스를 팁 위에 올려도 계속 표시된다는 것입니다.
이 효과를 얻으려면 Tip의 마우스 오버를 위한 프로그램을 작성하세요.
this.Check(e.관련Target) &&clearTimeout(this._timer)
Check 프로그램은 관련 대상이 무엇인지 결정하는 데 사용됩니다. 외부 요소 , 즉 마우스가 떠난 요소가 외부 요소인지 여부입니다.
외부 요소라면 현재 숨김 지연 단계에 있다는 뜻이므로 타이머를 클리어하면 숨김이 해제됩니다.
여기서 외부 요소는 트리거 요소 이외의 요소와 Tip 개체 자체 및 내부 요소를 나타냅니다.
이것은 다소 혼란스럽습니다. Check 프로그램이 다음을 결정하는 방법을 살펴보면 이해할 수 있습니다.

먼저 _trigger가 존재하지 않는지 확인합니다. 트리거되기 시작했으며 이는 외부 트리거로도 간주됩니다.
return !this._trigger || 
!( 
this.Tip === elem || this._trigger.Elem === elem || 
Contains(this.Tip, elem) || Contains(this._trigger.Elem, elem) 
);
존재하는 경우 전달된 요소가 Tip인지 트리거 요소 자체인지 확인하고 마지막으로 Contains를 사용하여 Tip 또는 트리거 요소 내부에 있는지 확인합니다.

ps: 포함에 관해서는 여기에서 비교 문서 위치를 참조하세요.
이런 식으로 얻는 것은 내부 요소인지 여부를 판단하는 것이고, 최종 부정은 외부 요소인지 여부를 판단하는 것입니다.
[클릭 방식]
클릭 방식 표시는 트리거 요소를 클릭하면 팁이 표시된다는 의미입니다.
Add 프로그램에서 다음 프로그램은 트리거 요소의 클릭 이벤트에 바인딩됩니다.

먼저 ClickShow를 사용하여 클릭하여 표시할지 여부를 결정한 다음 CheckShow를 사용하여 감지합니다. 동일한 트리거 개체인지 여부입니다.
addEvent(elem, "click", BindAsEventListener(this, function(e){ 
if ( this.IsClick(trigger.ShowType) ) { 
if ( this.CheckShow(trigger) ) { 
this.ReadyShow(this.IsClick(trigger.ShowDelayType)); 
} else { 
clearTimeout(this._timer); 
}; 
}; 
}));
CheckShow 프로그램은 다음과 같습니다.


동일한 트리거 개체가 아닌 경우 먼저 Hide를 실행하여 이전 트리거 개체를 정리하여 충돌을 방지한 다음 ReadyShow를 실행하여 표시합니다.
if (trigger !== this._trigger) { 
this.Hide(); this._trigger = trigger; return true; 
} else { return false; };
동일한 트리거 객체라면 현재 지연된 히든 스테이지에 있다는 의미입니다. 타이머를 지우고 계속 표시하면 됩니다.

따라서 클릭하여 숨긴다는 것은 외부 요소를 클릭할 때 팁을 숨기는 것을 의미합니다.
ReadyShow에서 숨기기 위해 클릭 메서드를 사용하면 _fCH가 문서의 클릭 이벤트에 바인딩됩니다.
this.IsTouch(trigger.HideType) && addEvent(this._trigger.Elem, "mouseout ", this._fTH);
숨겨진 바인딩 이벤트는 Show 대신 ReadyShow에 배치되어야 합니다. 지연되는 동안 숨겨진 이벤트가 표시되기 전에 트리거될 수 있기 때문입니다.
여기서 _fCH는 초기화 중에 정의된 속성으로, 클릭하여 숨기기 이벤트를 추가하고 제거하는 데 사용됩니다.

클릭하여 표시와는 다릅니다. 문서인 경우 먼저 e.target이 외부 요소인지 확인하기 전에 숨겨야 합니다.
this._fCH = BindAsEventListener(this, function(e) { 
if (this.Check(e.target) && this.CheckHide()) { 
this.ReadyHide(this.IsClick(this._trigger.HideDelayType)); 
}; 
});
CheckHide는 팁이 현재 숨겨져 있는지 확인하는 데 사용됩니다.

if (this._cssTip.visibility === "hidden") { 
clearTimeout(this._timer); 
removeEvent(this._trigger.Elem, "mouseout", this._fTH); 
this._trigger = null; 
removeEvent(document, "click", this._fCH); 
return false; 
} else { return true; };

如果本来就是隐藏状态,清除定时器移除事件就行,不需要再执行Hide了。
【触发方式】
触发方式针对的是mouseover和mouseout,它的流程跟点击方式是差不多的。
触发方式显示是指鼠标从外部元素进入触发元素(触发mouseover)的时候显示Tip。
在Add程序中会给触发元素的mouseover事件绑定以下程序: 

addEvent(elem, "mouseover", BindAsEventListener(this, function(e){ 
if ( this.IsTouch(trigger.ShowType) ) { 
if (this.CheckShow(trigger)) { 
this.ReadyShow(this.IsTouch(trigger.ShowDelayType)); 
} else if (this.Check(e.relatedTarget)) { 
clearTimeout(this._timer); 
}; 
}; 
}));

跟点击方式类似,也需要执行一次CheckShow,但不同的是,还会用Check判断e.relatedTarget是不是外部对象。
这是因为mouseover可能是从触发元素的内部元素(包括Tip)进入或内部元素冒泡触发的,而这些情况不需要任何操作。
对应的,触发方式隐藏是指鼠标从触发元素或Tip离开时隐藏Tip。
当TouchHide为true时,在ReadyShow的时候会把_fTH绑定到触发元素的mouseout事件里:
this.IsTouch(trigger.HideType) && addEvent(this._trigger.Elem, "mouseout", this._fTH);
在Show的时候,再绑定到Tip的mouseout:
this.IsClick(trigger.HideType) && addEvent(document, "click", this._fCH);
在ReadyShow绑定的原因同上,而Tip只需显示时绑定。
其中_fTH跟_fCH类似,也是在初始化时定义的一个属性,用于添加和移除触发隐藏事件: 

this._fTH = BindAsEventListener(this, function(e) { 
if (this.Check(e.relatedTarget) && this.CheckHide()) { 
this.ReadyHide(this.IsTouch(this._trigger.HideDelayType)); 
}; 
});

不同的是mouseout在Check的时候是用e.relatedTarget。
【触发原理】
上面是从程序的角度说明了触发显示和隐藏的过程,但要真正理解的话还需要做一次细致的分析。
下面是以触发方式的显示隐藏为例做的流程图:

下面是文字说明:
1,等待触发显示;
2,进入触发元素,如果设置延时,跳到3,如果没有设置延时,跳到4;
3,延时时间内,离开到外部元素,清除定时器,返回1,超过延时时间,跳到4;
4,执行显示程序;
5,显示Tip状态;
6,离开触发元素,如果是进入到Tip,跳到7,如果是离开到外部元素,跳到9;
7,保持显示状态;
8,离开Tip,如果是进入触发元素,返回5,如果是离开到外部元素,跳到9;
9,如果设置延时,跳到10,如果没有设置延时,跳到11;
10,延时时间内,如果进入Tip,清除定时器,返回7,如果进入触发元素,清除定时器,返回5,超过延时时间,跳到11;
11,执行隐藏程序,返回1;
再对照程序,应该就能理解整个流程了,当然可能还不是那么好理解。
这个流程也只是单例的情况,多例的时候还要多加一些判断。
可以说这个流程看似不难,但如果想做一个最优化的流程,那要考虑的细节地方可能会让人受不了。
点击方式跟触发方式的流程是差不多的,而且更简单,这里就不重复了。
【元素定位】
完成了显示隐藏,就到本程序另一个重点,元素定位。
程序使用一个GetRelative函数,通过定位元素、参考元素和参数对象来获取形如{ Left: 100, Top: 200 }的定位参数结果。
计算结果结合了以下定位方式:预设定位,自定义定位,自适应定位。
触发对象的Fixed属性就是用来保存定位参数对象的,包括一下属性:
属性: 默认值//说明
Align: "clientleft",//水平方向定位
vAlign: "clienttop",//垂直方向定位
CustomLeft: 0,//自定义left定位
CustomTop: 0,//自定义top定位
PercentLeft: 0,//自定义left百分比定位
PercentTop: 0,//自定义top百分比定位
Adaptive: false,//是否自适应定位
Reset: false//自适应定位时是否重新定位
下面再看看如何通过这些属性设置定位。
【预设定位和自定义定位】
预设定位的意思是使用程序25个预设位置来定位。
25个位置是怎么来的呢?看下面的具体演示:

JavaScript 부동 위치 지정 프롬프트 효과 구현 code_javascript 기술

其中黑色框代表触发元素,红色框代表Tip。
一眼望去,要实现这么多的位置好像很复杂,这时要想找到最好的方法就要细心分析找出规律。
这25个位置其实都是由5个水平坐标和5个垂直坐标组合而来的,只要计算好这10个坐标,就能组合出这25个位置来了。
其中1,2,3,4,5代表的水平坐标,程序分别用left,clientleft,center,clientright,right来标识。
而1,6,11,16,21代表的垂直坐标,程序分别用top,clienttop,center,clientbottom,bottom来标识。
ps:词穷,只好加个client来充数。
下面说说如何获取这些坐标的值,首先通过getBoundingClientRect要获取触发元素的坐标对象。
ps:关于getBoundingClientRect的介绍请看这里的元素位置。
再利用这个坐标对像,通过GetRelative.Left和GetRelative.Top来获取水平和垂直坐标。
GetRelative.Left和GetRelative.Top里面都是些简单的获取坐标算法,具体请参考代码。
使用时,把水平坐标和垂直坐标的标识值(字符)分别赋给触发对象的Align和vAlign属性,系统就会自动设置对应的位置。
例如要设置位置14,那么Align设为"clientright",vAlign设为"center"就可以了。
至于自定义定位就是在预设定位得到的坐标基础上,根据CustomLeft和CustomTop的值再进行left和top的修正。
自定义百分比定位是以触发元素的宽和高为基准,根据PercentLeft和PercentTop取百分比:
if (options.PercentLeft) { iLeft += .01 * options.PercentLeft * relElem.offsetWidth; };
if (options.PercentTop) { iTop += .01 * options.PercentTop * relElem.offsetHeight; };
注意数值单位是0.01。
【自适应定位】
自适应定位的作用是当Tip显示的范围超过浏览器可视范围的时候,自动修正到可视范围里面。
因为上面通过getBoundingClientRect获取的定位是以视窗为准的,所以可以直接通过clientWidth/clientHeight来判断是否超过视窗范围。
首先获取最大left和top值:
var maxLeft = document.documentElement.clientWidth - fixedElem.offsetWidth,
maxTop = document.documentElement.clientHeight - fixedElem.offsetHeight;
最小值是0就不用计算了。
如果Reset属性是true会使用重新定位的方法。
理想的效果是能自动从25个预设定位中找到适合的定位位置。
但这个需求实在变化太多,要全部实现估计要长长的代码,程序仅仅做了简单的修正:
if (iLeft > maxLeft || iLeft 115542efc65a6ca5192610a3e7d52286 maxLeft ? "left" : "right") + options.CustomLeft;
};
if (iTop > maxTop || iTop 220985426cdf59b213fc3c3c466eefa9 maxTop ? "top" : "bottom") + options.CustomTop;
};
实际应用的话估计要按需求重写这部分才行。
如果不是用Reset重新定位,只需要根据这几个值获取适合的值就行了:
iLeft = Math.max(Math.min(iLeft, maxLeft), 0);
iTop = Math.max(Math.min(iTop, maxTop), 0);
【参数设计】
程序中用ShowType、HideType、ShowDelayType和HideDelayType这几个属性来设置执行方式的。
以ShowType显示方式属性为例,原来的方式是分两个bool属性ClickShowType和TouchShowType表示的。
这样的好处是程序判断方便,效率高,问题是使用不方便,感觉混乱。
为了减少参数数量,后来把属性值改成字符形式,可以是以下4个值:
"click":只用点击方式
"touch":只用触发方式
"both":两个都使用
"none":都不使用(其他字符值也当成是"none")
这样就可以把ClickShowType和TouchShowType合并成一个ShowType来表示了。
参数数量是减少了,但程序中就必须每次都要根据字符值判断一下属于哪个类型。
为了方便程序判断,添加了IsClick和IsTouch方法,参数是上面的执行方式属性,用来判断是否使用点击和触发方式。
例如IsClick是这样的:
type = type.toLowerCase();
return type === "both" || type === "click";
这样就间接把字符判断变成bool判断,只是代码比直接bool判断长了点。
【隐藏select】
又是ie6的隐藏select问题,这里用的是iframe遮盖法。
首先初始化时插入iframe: 

var iframe = document.createElement("<iframe style=&#39;position:absolute;filter:alpha(opacity=0);display:none;&#39;>"); 
document.body.insertBefore(iframe, document.body.childNodes[0]); 
this._cssiframe = iframe.style;

在Show的时候,参照Tip设置好样式,再显示: 

var css = this._cssiframe; css.width = this.Tip.offsetWidth + "px"; css.height = this.Tip.offsetHeight + "px"; css.left = iLeft + "px"; css.top = iTop + "px"; css.display = "";

其实就是要垫在Tip的下面。
在Hidde时隐藏就可以了。
使用说明
实例化时,第一个必要参数是Tip对象:
var ft = new FixedTips("idTip");
第二个可选参数用来设置触发对象属性的统一默认值。
然后用Add方法添加触发对象:
var trigger1 = ft.Add("idTrigger1");
第二个可选参数用来设置该触发对象属性。
要添加多个触发对象时只需继续用Add添加就行了。
程序源码 

var FixedTips = function(tip, options){ 
this.Tip = $$(tip);//提示框 
this._trigger = null;//触发对象 
this._timer = null;//定时器 
this._cssTip = this.Tip.style;//简化代码 
this._onshow = false;//记录当前显示状态 
this.SetOptions(options); 
//处理Tip对象 
var css = this._cssTip; 
css.margin = 0;//避免定位问题 
css.position = "absolute"; css.visibility = "hidden"; 
css.display = "block"; css.zIndex = 99; 
css.left = this._cssTip.top = "-9999px";//避免占位出现滚动条 
//offset修正参数 
var iLeft = 0, iTop = 0, p = this.Tip; 
while (p.offsetParent) { 
p = p.offsetParent; iLeft += p.offsetLeft; iTop += p.offsetTop; 
}; 
this._offsetleft = iLeft; 
this._offsettop = iTop; 
//移入Tip对象时保持显示状态 
addEvent(this.Tip, "mouseover", BindAsEventListener(this, function(e){ 
//如果是外部元素进入,说明当前是隐藏延时阶段,那么清除定时器取消隐藏 
this.Check(e.relatedTarget) && clearTimeout(this._timer); 
})); 
//ie6处理select 
if (isIE6) { 
var iframe = document.createElement("<iframe style=&#39;position:absolute;filter:alpha(opacity=0);display:none;&#39;>"); 
document.body.insertBefore(iframe, document.body.childNodes[0]); 
this._cssiframe = iframe.style; 
}; 
//用于点击方式隐藏 
this._fCH = BindAsEventListener(this, function(e) { 
if (this.Check(e.target) && this.CheckHide()) { 
this.ReadyHide(this.IsClick(this._trigger.HideDelayType)); 
}; 
}); 
//用于触发方式隐藏 
this._fTH = BindAsEventListener(this, function(e) { 
if (this.Check(e.relatedTarget) && this.CheckHide()) { 
this.ReadyHide(this.IsTouch(this._trigger.HideDelayType)); 
}; 
}); 
}; 
FixedTips.prototype = { 
//设置默认属性 
SetOptions: function(options) { 
this.options = {//默认值 
ShowType: "both",//显示方式 
HideType: "both",//隐藏方式 
ShowDelayType: "touch",//显示延迟方式 
HideDelayType: "touch",//隐藏延迟方式 
//"click":只用点击方式,"touch":只用触发方式,"both":两个都使用,"none":都不使用 
ShowDelay: 300,//显示延时时间 
HideDelay: 300,//隐藏延时时间 
Fixed: {},//定位对象 
onShow: function(){},//显示时执行 
onHide: function(){}//隐藏时执行 
}; 
Extend(this.options, options || {}); 
}, 
//检查触发元素 
Check: function(elem) { 
//返回是否外部元素(即触发元素和Tip对象本身及其内部元素以外的元素对象) 
return !this._trigger || 
!( 
this.Tip === elem || this._trigger.Elem === elem || 
Contains(this.Tip, elem) || Contains(this._trigger.Elem, elem) 
); 
}, 
//准备显示 
ReadyShow: function(delay) { 
clearTimeout(this._timer); 
var trigger = this._trigger; 
//触发方式隐藏 
this.IsTouch(trigger.HideType) && addEvent(this._trigger.Elem, "mouseout", this._fTH); 
//点击方式隐藏 
this.IsClick(trigger.HideType) && addEvent(document, "click", this._fCH); 
//显示 
if (delay) { 
this._timer = setTimeout(Bind(this, this.Show), trigger.ShowDelay); 
} else { this.Show(); }; 
}, 
//显示 
Show: function() { 
clearTimeout(this._timer); 
this._trigger.onShow();//放在前面方便修改属性 
//根据预设定位和自定义定位计算left和top 
var trigger = this._trigger, 
pos = GetRelative(trigger.Elem, this.Tip, trigger.Fixed), 
iLeft = pos.Left, iTop = pos.Top; 
//设置位置并显示 
this._cssTip.left = iLeft - this._offsetleft + "px"; 
this._cssTip.top = iTop - this._offsettop + "px"; 
this._cssTip.visibility = "visible"; 
//ie6处理select 
if (isIE6) { 
var css = this._cssiframe; 
css.width = this.Tip.offsetWidth + "px"; 
css.height = this.Tip.offsetHeight + "px"; 
css.left = iLeft + "px"; css.top = iTop + "px"; css.display = ""; 
}; 
//触发方式隐藏 
this.IsTouch(trigger.HideType) && addEvent(this.Tip, "mouseout", this._fTH); 
}, 
//准备隐藏 
ReadyHide: function(delay) { 
clearTimeout(this._timer); 
if (delay) { 
this._timer = setTimeout(Bind(this, this.Hide), this._trigger.HideDelay); 
} else { this.Hide(); }; 
}, 
//隐藏 
Hide: function() { 
clearTimeout(this._timer); 
//设置隐藏 
this._cssTip.visibility = "hidden"; 
this._cssTip.left = this._cssTip.top = "-9999px"; 
//ie6处理select 
if (isIE6) { this._cssiframe.display = "none"; }; 
//处理触发对象 
if (!!this._trigger) { 
this._trigger.onHide(); 
removeEvent(this._trigger.Elem, "mouseout", this._fTH); 
} 
this._trigger = null; 
//移除事件 
removeEvent(this.Tip, "mouseout", this._fTH); 
removeEvent(document, "click", this._fCH); 
}, 
//添加触发对象 
Add: function(elem, options) { 
//创建一个触发对象 
var elem = $$(elem), trigger = Extend( Extend( { Elem: elem }, this.options ), options || {} ); 
//点击方式显示 
addEvent(elem, "click", BindAsEventListener(this, function(e){ 
if ( this.IsClick(trigger.ShowType) ) { 
if ( this.CheckShow(trigger) ) { 
this.ReadyShow(this.IsClick(trigger.ShowDelayType)); 
} else { 
clearTimeout(this._timer); 
}; 
}; 
})); 
//触发方式显示 
addEvent(elem, "mouseover", BindAsEventListener(this, function(e){ 
if ( this.IsTouch(trigger.ShowType) ) { 
if (this.CheckShow(trigger)) { 
this.ReadyShow(this.IsTouch(trigger.ShowDelayType)); 
} else if (this.Check(e.relatedTarget)) { 
clearTimeout(this._timer); 
}; 
}; 
})); 
//返回触发对象 
return trigger; 
}, 
//显示检查 
CheckShow: function(trigger) { 
if ( trigger !== this._trigger ) { 
//不是同一个触发对象就先执行Hide防止冲突 
this.Hide(); this._trigger = trigger; return true; 
} else { return false; }; 
}, 
//隐藏检查 
CheckHide: function() { 
if ( this._cssTip.visibility === "hidden" ) { 
//本来就是隐藏状态,不需要再执行Hide 
clearTimeout(this._timer); 
removeEvent(this._trigger.Elem, "mouseout", this._fTH); 
this._trigger = null; 
removeEvent(document, "click", this._fCH); 
return false; 
} else { return true; }; 
}, 
//是否点击方式 
IsClick: function(type) { 
type = type.toLowerCase(); 
return type === "both" || type === "click"; 
}, 
//是否触发方式 
IsTouch: function(type) { 
type = type.toLowerCase(); 
return type === "both" || type === "touch"; 
} 
};
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.