none
attachEvent如何带两个参数? RRS feed

  • 问题

  •  给表格的行添加onclick事件
    row.attachEvent("onclick",newopen(tables.Rows[i].tfbh,this));
    this当前这个对象无法传递给
    var newopen = function(level,a)
    {
      return function()
      {
        View_SelectInfo(level,a);//该函数为外部定义的一个执行函数;
      }
    }
    function View_SelectInfo(info,a)
    {
          alert(a)//这里显示a是一个对象;

          var parent =a.parentNode;

          alert(parent);//在这里显示为undefined

          for(var i=0;i<parent.childNodes.length;i++)
          {
             parent.childNodes[i].bgColor = "#FFFFFF";
          }
          obj.bgColor = "#99c3e9";
          var pre = obj.previousSibling;
          while(pre!=null)
          {  
               pre.bgColor = "#FFFFFF";
               pre = pre.previousSibling;
          }
    }

    我在页面的tr上也直接有引用<tr onclick="View_SelectInfo('<%# Eval("tfbh") %>',this)">这个方法,
    这样是没错的,但是当我动态的去给tr添加row.attachEvent("onclick",newopen(tables.Rows[i].tfbh,this));
    这个事件后在View_SelectInfo方法里的这里alert(parent);就显示为undefined,
    在没有动态给tr添加onclick这个方法以前是没错的。

    为什么第一次直接调用View_SelectInfo方法的时候这个a.parentNode都不会出错,动态添加以后就会出错

    不好意思刚才没有表达清楚
    • 已编辑 Aragn 2009年12月9日 7:58
    • 已移动 Sheng Jiang 蒋晟 2009年12月9日 19:35 客户端开发问题 (发件人:ASP.NET 与 AJAX)
    2009年12月9日 7:29

答案

  •     var tables = typhoon.Ajax_Band_DataList(years).value;//获得服务器端返回的DataTable
        var TFDataList = document.getElementById("table_list");//获得页面上的table
            for(var i=0;i<tables.Rows.length;i++)
            {
                var row = TFDataList.insertRow();//动态填充页面表格数据
                row.attachEvent("onclick",newopen(tables.Rows[i].tfbh,tables.Rows[i]));
        }

    row.attachEvent("onclick",newopen(tables.Rows[i].tfbh,row));
    • 已标记为答案 Aragn 2009年12月9日 9:56
    2009年12月9日 9:53

全部回复

  • var newopen = function(level, a) {
            return function() {
                View_SelectInfo(level, a); //该函数为外部定义的一个执行函数;
            }
        }
        function View_SelectInfo(info, a) {
            alert(a); //a在这里显示为undefined
        }

        window.onload = function() {

            var n = newopen(1, 2);
            n();

     

        }

    2009年12月9日 7:39
  • 谢谢你的回答,你的这个意思我明白。
    但是不好意思刚才我问题没有表达清楚!
    2009年12月9日 7:56
  • <script>   
    var newopen = function(level, a) {
            return function() {
                View_SelectInfo(level, a); //该函数为外部定义的一个执行函数;
            }
        }
       function View_SelectInfo(info, a) {

            var parent = a.parentNode;

            alert(parent);

        }

        window.onload = function() {

            var table1 = document.getElementById("table1");
            for (var i = 0; i < table1.rows.length; i++) {

              table1.rows[i].attachEvent("onclick", newopen(table1.rows[i].tfbh, table1.rows[i]));

        
            }

      
         
        }

    </script>
    </head>
    <body>
        <form id="form1" runat="server">
    <div>

    <table id="table1">
    <tr>
    <td>1</td>
    </tr>
    <tr>
    <td>2</td>
    </tr>
    </table></div>
        </form>
    </body>
    </html>

    2009年12月9日 8:08
  • 你的代码我试过了,可以去到行的对象,我是这样写的
    function a()
    {
    //下面这两行代码写法在后面的方法中都取不到这个对象
    row.attachEvent("onclick",newopen(tables.Rows[i].tfbh,tables.Rows[i]));
    row.attachEvent("onclick",newopen(tables.Rows[i].tfbh,this));
    }
    var newopen = function(level,a)
    {
      return function()
      {
        View_SelectInfo(level,a);//该函数为外部定义的一个执行函数;
      }
    }
    function View_SelectInfo(info,a)
    {
        alert(a);//显示[object Object]
        ChangeTrStyle(a);
    }
    function ChangeTrStyle(obj)//改变选中行的样式
     {
    alert(obj);//显示[object Object]
     alert(obj.innerTHML);//这里就显示undefined,错也就是在这里,取不到选中的行的对象
      var parent =obj.parentNode;
    //  alert(parent);
    //    alert(parent.innerHTML);
    //    alert(parent.childNodes[0].innerHTML);
      for(var i=0;i<parent.childNodes.length;i++)//这里显示childNodes为空或不是对象
      {
         parent.childNodes[i].bgColor = "#FFFFFF";
      }
      obj.bgColor = "#99c3e9";
      var pre = obj.previousSibling;
      while(pre!=null)
      {  
           pre.bgColor = "#FFFFFF";
           pre = pre.previousSibling;
      }
     }
    2009年12月9日 8:36
  • 你注意我的代码大小写
    <script>
        var newopen = function(level, a) {
            return function() {
                View_SelectInfo(level, a); //该函数为外部定义的一个执行函数;
            }

            function View_SelectInfo(info, a) {
                alert(a); //显示[object Object]
                ChangeTrStyle(a);
            }
            function ChangeTrStyle(obj)//改变选中行的样式
            {
                alert(obj); //显示[object Object]
                alert(obj.innerHTML); //你打错了THML 正确是innerHTML
              
                var parent = obj.parentNode;
                //  alert(parent);
                //    alert(parent.innerHTML);
                //    alert(parent.childNodes[0].innerHTML);
                for (var i = 0; i < parent.childNodes.length; i++) {
                    parent.childNodes[i].bgColor = "#FFFFFF";
                }
                obj.bgColor = "#99c3e9";
                var pre = obj.previousSibling;
                while (pre != null) {
                    pre.bgColor = "#FFFFFF";
                    pre = pre.previousSibling;
                }

            }
        }
        window.onload = function() {

            var table1 = document.getElementById("table1");
            for (var i = 0; i < table1.rows.length; i++) {

              table1.rows[i].attachEvent("onclick", newopen(table1.rows[i].tfbh, table1.rows[i]));

        
            }

      
         
        }

    </script>
    </head>
    <body>
        <form id="form1" runat="server">
    <div>

    <table id="table1">
    <tr>
    <td>1</td>
    </tr>
    <tr>
    <td>2</td>
    </tr>
    </table></div>
        </form>
    </body>

    2009年12月9日 8:45
  • 你说的大小写是tables.Rows[i].tfbh这个里面的Rows吗这个用小写,会出错。
    我是在cs类中返回DataTable然后再js中解析的,如果是小写的rows会出错。
    innerHTML这个是我打错了,问题就是出在ChangeTrStyle()这个方法的for (var i = 0; i < parent.childNodes.length; i++) 这句中的childNodes为空或不是对象。
    我就很郁闷了,你发我的代码都是没问题的。
    2009年12月9日 8:59
  • 你说的大小写是tables.Rows[i].tfbh这个里面的Rows吗这个用小写,会出错。
    我是在cs类中返回DataTable然后再js中解析的,如果是小写的rows会出错。
    innerHTML这个是我打错了,问题就是出在ChangeTrStyle()这个方法的for (var i = 0; i < parent.childNodes.length; i++) 这句中的childNodes为空或不是对象。
    我就很郁闷了,你发我的代码都是没问题的。

    你说服务端的datatable当js用吗?
    2009年12月9日 9:04
  • 动态添加行属性row.attachEvent("onclick",newopen(tables.Rows[i].tfbh,tables.Rows[i]));这个是我在下拉框改变的时候触发,然后根据下拉框选择的在后台cs类中筛选,返回DataTable,返回的DataTable在js中解析以后再动态添加到表格当中的。页面第一次加载过来的时候我是没有去动态填充的,直接在表格的tr中调用View_SelectInfo()这个方法是不会有错的,就像你发我的代码一样,都是可以执行的。就是当触发动态填充表格的事件后,就会出错。
    2009年12月9日 9:06
  • 我是想做成无刷新的,用js去调用后台(cs)文件中的方法,然后返回DataTable,返回会来以后在客户端用js解析服务端返回的DataTable
    2009年12月9日 9:11
  •     var tables = typhoon.Ajax_Band_DataList(years).value;//获得服务器端返回的DataTable
        var TFDataList = document.getElementById("table_list");//获得页面上的table
            for(var i=0;i<tables.Rows.length;i++)
            {
                var row = TFDataList.insertRow();//动态填充页面表格数据
                row.attachEvent("onclick",newopen(tables.Rows[i].tfbh,tables.Rows[i]));
        }
    2009年12月9日 9:13
  • 我是想做成无刷新的,用js去调用后台(cs)文件中的方法,然后返回DataTable,返回会来以后在客户端用js解析服务端返回的DataTable

    晕了 你这个要用ajax啊 我不知道怎么说了 你必须控制html布局表格的字符串 在datatable处理完后把字符串发送客户端用innerHTML属性显示 
    2009年12月9日 9:15
  • - -!
    你是说在服务端将字符串拼凑好以直接返回到客户端吗?
    那我这样应该也可以吧?
    只是稍微麻烦了点,
    2009年12月9日 9:23
  • - -!
    你是说在服务端将字符串拼凑好以直接返回到客户端吗?
    那我这样应该也可以吧?
    只是稍微麻烦了点,

    对! 你这样不可能的! datatable是ado.net技术 属于服务端的  和C#一样 不在客户端执行
    2009年12月9日 9:26
  • 还是要谢谢你的回复。
    2009年12月9日 9:26
  • 服务端返回的DataTable我已经解析了,就是在ChangeTrStyle()这个方法的for (var i = 0; i < parent.childNodes.length; i++) 这句中的childNodes为空或不是对象,所以会出错
    2009年12月9日 9:29
  • 服务端返回的DataTable我已经解析了,就是在ChangeTrStyle()这个方法的for (var i = 0; i < parent.childNodes.length; i++) 这句中的childNodes为空或不是对象,所以会出错

    你有一个方面 误解了 datatable不等于html 表格对象  datatable对象在js中成了普通数据表对象 不是html对象
    2009年12月9日 9:33
  • 那我那个问题就是这个原因吗?

    2009年12月9日 9:36
  •     var tables = typhoon.Ajax_Band_DataList(years).value;//获得服务器端返回的DataTable
        var TFDataList = document.getElementById("table_list");//获得页面上的table
            for(var i=0;i<tables.Rows.length;i++)
            {
                var row = TFDataList.insertRow();//动态填充页面表格数据
                row.attachEvent("onclick",newopen(tables.Rows[i].tfbh,tables.Rows[i]));
        }

    row.attachEvent("onclick",newopen(tables.Rows[i].tfbh,row));
    • 已标记为答案 Aragn 2009年12月9日 9:56
    2009年12月9日 9:53
  • 可以了,原来是对象错了,真是非常感谢你啊,呵呵

    2009年12月9日 9:56