مساعدة جافا سكريبت
-
06-09-2019 - |
سؤال
المشكلة التي أحصل عليها هي عندما تسمى الوظيفة عدة مرات عناصر مختلفة. أعتقد أنني بحاجة إلى توطين جميع المتغيرات بحيث يمكن استخدام هذه الوظيفة مقابل عناصر متعددة. في حالة تدعو أيضا في JQuery 1.3.
إذا كنت أتصل فقط بالصفحات مرة واحدة، فكل شيء على ما يرام، ولكن بمجرد أن أسميها عدة مرات، فإنه يحصل مؤلمة. لا أخطاء، فقط سلوك غير منتظم.
تم تحديث الرمز
var slideMenu=function(){
var speed, startWidth, time, menuId, liID, menuLen, menuWidth, globalWidth, openWidth;
return{
speed : 0, startWidth : 0, time : 0, menuId : 0, liID : 0, menuLen : 0, menuWidth : 0, globalWidth : 0, openWidth : 0,
build:function(ulID,passStartWidth,passTime,s,passSlideLen,passHeight){
speed=s;
startWidth=passStartWidth;
time=passTime;
menuId=document.getElementById(ulID);
liID=menuId.getElementsByTagName('li');
menuLen=liID.length;
menuWidth=menuId.offsetWidth;
globalWidth=menuWidth/menuLen;
openWidth=Math.floor((menuWidth-startWidth)/(menuLen-1));
var i=0;
for(i;i<menuLen;i++){
s=liID[i];
s.style.width=globalWidth+'px';
this.timer(s)
}
if(passSlideLen!=null){
menuId.timer=setInterval(function(){
slideMenu.slide(liID[passSlideLen-1])
},time)
}
},
timer:function(s){
s.onmouseover=function(){
clearInterval(menuId.htimer);
clearInterval(menuId.timer);
menuId.timer=setInterval(function(){
slideMenu.slide(s)
},
time)
}
s.onmouseout=function(){
clearInterval(menuId.timer);
clearInterval(menuId.htimer);
menuId.htimer=setInterval(function(){
slideMenu.slide(s,true)
},
time)
}
},
slide:function(s,passChange){
var changeWidth=parseInt(s.style.width);
if((changeWidth<startWidth && !passChange) || (changeWidth>globalWidth && passChange)){
var overallWidth=0;
var i=0;
for(i;i<menuLen;i++){
if(liID[i]!=s){
var slideObj,openWidth; var opening=0; slideObj=liID[i]; openWidth=parseInt(slideObj.style.width);
if(openWidth<globalWidth && passChange){
opening=Math.floor((globalWidth-openWidth)/speed);
opening=(opening>0)?opening:1;
slideObj.style.width=(openWidth+opening)+'px';
}else if(openWidth>openWidth && !passChange){
opening=Math.floor((openWidth-openWidth)/speed);
opening=(opening>0)?opening:1;
slideObj.style.width=(openWidth-opening)+'px'
}
if(passChange){
overallWidth=overallWidth+(openWidth+opening)}else{overallWidth=overallWidth+(openWidth-opening)
}
}
}
s.style.width=(menuWidth-overallWidth)+'px';
}else{
clearInterval(menuId.timer);
clearInterval(menuId.htimer)
}
}
};
}();
الرمز أعلاه لا يحدث خطأ ولكنه فشل في العمل. عندما أستخدم هذه الكلمة الأساسية، لا تحصل على أي أفضل.
سؤالي هو أن المتغيرات يجب أن تكون "هذا". لقد جربت مجموعات مختلفة اعتقدت أنها تعمل، لكنني أفتقد شيئا ما.
المحلول
أعتقد أنك أسيء الفهم من المفهوم الشامل لنمط الوحدة النمطية، عندما تحتاج إلى وجود متغير ثابت عالمي مشترك بين جميع مثيلاتك، يمكنك إعلان أو تهيئة المتغير الخاص بك مع الكلمة الرئيسية "var" قبل عبارة الإرجاع مباشرة.
افترض أنه كلما قمت بتغيير هذه المتغيرات، سيتم تأثر جميع مثيلاتك بالتغيير.
var slideMenu=function(){
// Declare or initialize your private static variables here
var speed, startWidth, time;
return {
// Public part of your object
slide:function(s,passChange){
//To access your variable
speed = 20;
...
من ناحية أخرى، إذا كنت ترغب في الحفاظ على متغير آمن من النطاق العالمي، فعليك وضع المتغير الخاص بك في الكائن الذي تم إرجاعه بواسطة وظيفتك، فهذه طريقة موثوقة لتوفيرها فريدة من نوعها لكل خصائص.
var slideMenu=function(){
// Declare or initialize your private static variables here
var speed, startWidth, time;
return {
// Public part of your object
// Declare internal or public properties here
menuId : 0,
liID : 0,
menuLen : 0,
...
slide:function(s,passChange){
//To access your private static variable inside functions
speed = 20;
// To access your public/internal properties
this.menuId = s; // for example ;)
}
ليستنتج
في بعض الأحيان للمساعدة في التمييز بين الخصائص الداخلية / العامة، يكتب بعض الأشخاص عن التدقيق الرائد في خصائصهم الداخلية (لاحظ أن العقارات ستظل متاحة من الخارج).
نأمل أن يساعد، ونتمنى لك التوفيق!
نصائح أخرى
تحصل على هذا السلوك لأنك تستخدم نمط الوحدة النمطية والذي يسمح بإجراء متغيرات ثابتة خاصة في جسمك. المشكلة هي أن هذه المتغيرات مشتركة بين جميع الحالات.
var sp=0;
var st=0;
var t=0;
var m='';
var sa='';
var l=0;
var w=0;
var gw=0;
var ot=0;
يجب عليك نقل هذه المتغيرات إلى مثيلك العام و AKA في جزء العودة من البرنامج النصي الخاص بك أو في المنشئ (ولكن في هذه الحالة، سيتعين عليك توفير Getter لكل متغير).
return{
// Place your variables here
sp : 0,
st : 0,
...
build:function(sm,sw,mt,s,sl,h){
// And then use the this keyword to access the variable
this.sp=s;
this.st=sw;
t=mt;
m=document.getElementById(sm);
sa=m.getElementsByTagName('li');
l=sa.length;
w=m.offsetWidth;
gw=w/l;
...