javascript-请js大神帮忙修改成为面向对象写法(应用prototype)

问题描述

请js大神帮忙修改成为面向对象写法(应用prototype)

HTML结构如下:

 <body>
    <ul class="rolinList" id="rolin">
        <li>
            <h2>下拉标题 1</h2>
            <div class="content">
                <p>下拉展开后显示内容<br />
                <br />
                <a href="###" target="_blank">下拉显示内容</a></p>
            </div>
        </li>
        <li>
            <h2>下拉标题 2</h2>
            <div class="content">
                <p>下拉展开后显示内容<br />
                <br />
                <a href="###" target="_blank">下拉显示内容</a></p>
            </div>
        </li>
        <li>
            <h2>下拉标题 3</h2>
            <div class="content">
                <p>下拉展开后显示内容<br />
                <br />
                <a href="###" target="_blank">下拉显示内容</a></p>
            </div>
        </li>
        <li>
            <h2>下拉标题 4</h2>
            <div class="content">
                <p>下拉展开后显示内容<br />
                <br />
                <a href="###" target="_blank">下拉显示内容</a></p>
            </div>
        </li>
        <li>
            <h2>下拉标题 5</h2>
            <div class="content">
                <p>下拉展开后显示内容<br />
                <br />
                <a href="###" target="_blank">下拉显示内容</a></p>
            </div>
        </li>
        <li>
            <h2>下拉标题 6</h2>
            <div class="content">
                <p>下拉展开后显示内容<br />
                <br />
                <a href="###" target="_blank">下拉显示内容</a></p>
            </div>
        </li>
    </ul>
</body>

JS代码如下:

 // JavaScript Document

//<![CDATA[
 window.onload = function()
                 {
                  rolinTab("rolin")
                 }
 function rolinTab(obj)
 {
    var list = $(obj).getElementsByTagName("LI");
    var state = {
                  show: false,
                  hidden: false,
                  showObj: false
                };

    for (var i = 0; i < list.length; i++)
        {
         var tmp = new rolinItem(list[i], state);
         if (i == 0)
             tmp.pShow();
        }
 }

 // 构造函数
 function rolinItem(obj, state)
 {
    //alert(obj.parentNode.children.length)  // test

    var speed = 0.0666;
    var range = 1;
    var interval;
    var tarH;
    var head = getFirstChild(obj);
    var content = getNextChild(head);
    var isOpen = false;

    var tar = this;
    this.pHidden = function()
                    {
                      if (isOpen)
                          hidden();
                    }
    this.pShow = show;

    var baseH = content.offsetHeight;
    content.style.display = "none";  // 初始化,所有的 li 下的content 都隐藏
    var isOpen = false;

    head.onmouseover = function()
                       {
                        this.style.background = "#EFEFEF";
                       }

    head.onmouseout = mouseout;

    head.onclick = function()
                   {
                     this.style.background = "#EFEFEF";
                     if (!state.show && !state.hidden)
                        {
                          if (!isOpen)
                             {
                                head.onmouseout = null;
                                show();
                            }
                          else {
                                 hidden();
                                }

                        }
                   }

    function mouseout()
    {
     this.style.background = "#FFF"
    }

    function show()
    {
        head.style.borderBottom = "1px solid #DADADA";

        if (state.openObj && state.openObj != tar) // 备注:未被点击的 li 为  的隐藏掉
           {
             state.openObj.pHidden();
           }
        content.style.height = "0px";
        content.style.display = "block";
        content.style.overflow = "hidden";
        state.openObj = tar;

        state.show = true;
        tarH = baseH;
        interval = setInterval(move, 10);
    }

    function showS()
    {
     isOpen = true;
     state.show = false;
    }

    function hidden()
    {
     state.hidden = true;
     tarH = 0;
     interval = setInterval(move, 10);
    }

    function hiddenS()
    {
     head.style.borderBottom = "none";
     /*  备注:以下两句貌似可以省略
     head.onmouseout = mouseout;
     head.onmouseout();
     */
     content.style.display = "none";
     isOpen = false;
     state.hidden = false;
    }

    function move()
    {
      var dist = (tarH - content.style.height.pxToNum()) * speed;
      if (Math.abs(dist) < 1)
          dist = dist > 0 ? 1 : -1;

      content.style.height = (content.style.height.pxToNum() + dist) + "px";

      if (Math.abs(content.style.height.pxToNum() - tarH) <= range)
         {
          clearInterval(interval);
          content.style.height = tarH + "px";
          if (tarH != 0)
             {
              showS()
             }
          else {
                 hiddenS();
               }
         }
    }
 }

  // Tools
  var $ = function($)
          {
           return document.getElementById($)
           };
  String.prototype.pxToNum = function()
                            {
                             return Number(this.replace("px", ""))
                             }
  function getFirstChild(obj)
  {
    var result = obj.firstChild;
    while (!result.tagName)
          {
           result = result.nextSibling;
          }
    return result;
  }

  function getNextChild(obj)
  {
    var result = obj.nextSibling;
    while (!result.tagName)
          {
           result = result.nextSibling;
          }
    return result;
  }

//]]>

解决方案

就你的代码,直接定义一个对象,把方法装进去就可以了。面向对象不是用对象,要看你的场景,也就是你要做什么。

时间: 2024-12-22 09:00:36

javascript-请js大神帮忙修改成为面向对象写法(应用prototype)的相关文章

appium 测试无法打开 app,请各位大神帮忙

问题描述 appium 测试无法打开 app,请各位大神帮忙 初学appium,使用python写测试脚本,现在可以安装上app,之后无法自动启动app.这是我的脚本:#coding=utf-8from appium import webdriverfrom lib2to3.pgen2.driver import Driverfrom lib2to3.tests.support import driverimport osimport time PATH=lambda p:os.path.abs

c#窗体-c#两个窗口之间传值,虽然简单,但我仍不会,请各位大神帮忙

问题描述 c#两个窗口之间传值,虽然简单,但我仍不会,请各位大神帮忙 在一个窗口的button按钮中点击,另一个窗口的checkbox被选中,该咋写 解决方案 http://bbs.csdn.net/topics/360140208 解决方案二: 另一个窗体添加一个属性 public bool IsSelected { get { return checkBox1.Checked; } set { checkBox1.Checked = value; } } 主窗体 (Application.O

c++-C++ 求大神帮忙修改段代码,信息管理系统,把原有的类拆成四个派生类

问题描述 C++ 求大神帮忙修改段代码,信息管理系统,把原有的类拆成四个派生类 http://pan.baidu.com/s/1o69SUWq 这里面是头文件和源文件和说明 求大神帮帮忙 解决方案 链接不存在了 提供一个思路吧,也就把工作细分化.把功能具体化.举一个简单例子 假如有一个图书管理类. 你可以拆分为:借书类.还书类.查书类等,

沙盒-ios没有存储文件“保存目录”的权限,请各位大神帮忙!!!急急急!!!

问题描述 ios没有存储文件"保存目录"的权限,请各位大神帮忙!!!急急急!!! 报错内容: recorder error Error Domain=NSCocoaErrorDomain Code=513 "您没有存储文件"保存目录"的权限." UserInfo={NSFilePath=保存目录, NSUnderlyingError=0x137b61b10 {Error Domain=NSPOSIXErrorDomain Code=1 "

编程c语言-c中的null到底怎么理解?直接理解为0,可以吗,请各位大神帮忙解释

问题描述 c中的null到底怎么理解?直接理解为0,可以吗,请各位大神帮忙解释 小弟自学c语言以来,遇到各类问题,这个事比较难搞得,请各位帮忙 解决方案 首先请注意,需要大写NULL 其次,在绝大多数的系统上都可以理解为0(这货本来就是个宏定义嘛#define NULL ((void*)0)) 在绝大多数系统上,不存在变量的地址为0,因而0可以被安全地认为是一个不存在变量的地方,指向0的指针一定是个空指针 解决方案二: 不一定哦,你看 String str=null; 代表的是空值, Syste

adb-[求救向] 请各位大神帮忙解决下吧,有关于安卓开发运行写好的项目的时候出现问题

问题描述 [求救向] 请各位大神帮忙解决下吧,有关于安卓开发运行写好的项目的时候出现问题 错误输出[2015-05-27 17:20:55 - Bluetooth] ------------------------------[2015-05-27 17:20:55 - Bluetooth] Android Launch![2015-05-27 17:20:55 - Bluetooth] The connection to adb is down and a severe error has o

java-小白求助,求大神帮忙修改下代码

问题描述 小白求助,求大神帮忙修改下代码 我的条件是condition=1|2|3|4|5.... if (source.getProperty(""condition"" + NUM).equals(""1"")) { return p.panduan1(readrow source); } else if (source.getProperty(""condition"" + NUM

数据版本管理,请各位大神帮忙看一下

问题描述 数据版本管理,请各位大神帮忙看一下 数据版本标签,创建新的文件型数据源,并将指定的数据集导入到该数据源中,同时,该数据源通过版本管理的XML文件,记录该数据源的版本,数据源版本时间,数据源版本描述.

c#-数据版本管理,请各位大神帮忙看一下

问题描述 数据版本管理,请各位大神帮忙看一下 数据版本标签,创建新的文件型数据源,并将指定的数据集导入到该数据源中,同时,该数据源通过版本管理的XML文件,记录该数据源的版本,数据源版本时间,数据源版本描述.