سؤال

المشكلة التي أحصل عليها هي عندما تسمى الوظيفة عدة مرات عناصر مختلفة. أعتقد أنني بحاجة إلى توطين جميع المتغيرات بحيث يمكن استخدام هذه الوظيفة مقابل عناصر متعددة. في حالة تدعو أيضا في 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;
      ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top