为了感谢大家多时对我的提问诲人不倦的解答,
现在终于想出了个 编历器 ,愿大家与分享,如谁能想出更好方法,谢谢提点
[color=#0000FF]-----我首先声明,IE不兼容,在firefox里OK。

[/color]。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test1.aspx.cs" Inherits="holdContent.test1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <script src="Js/jquery-1.4.2.js" type="text/javascript"></script>
    <script src="Js/jquery-1.4.2-vsdoc.js" type="text/javascript"></script>
     <script type="text/javascript">
         $(function() {
                 $("#btnTest").click(function(){
                    var obj = $("#txtObject").val();
                    var strOut = "对象" + obj + "<hr/>" + strOut;
                    try{
                    eval('for (var v in ' + obj + ') {if (' + obj + '[v] == null) {}else if (' + obj + '[v].constructor == window.Function) {strOut += "函数名:" + "<br/>"+ ' + obj + '[v] + "<br/>";}} $("#divShow").html(strOut);');
                    }
                    catch(ex)
                    {
                    
                     $("#divShow").html("你输入的对象不存在OR 此对象没有可调的方法:<br/>"+ex);
                    } 
                 });      
         });
 </script>    
</head>
<body>
<form id="form1" runat="server">
<div>
<p>
<font color="#a0a0a0">js 对象编历器:在下面输入JS对象,如 window,window.document,document.body,window.top等,只要对象存在就会编历出,</font>
</p>
请输入JS对象
<br />
<input id="txtObject" type="text" />
<input id="btnTest" type="button" value="取得所有方法" />
<div id="divShow">
</div>
</div>
</form>
</body>
</html>如果能此方法加以应用,定可以写出很多好东西。

解决方案 »

  1.   

    这代码写的
    var obj ; 
    eval('obj=document.getElementById("txtObject").value');
    var strOut = "对象" + obj.toString() + "<hr/>" + strOut;
    try{
        for (var v in obj) {
            if (obj[v] != null&& obj[v].constructor == window.Function) {
                 strOut += "函数名:" + "<br />"+ obj[v].toString() + "<br />";
            }
        } 
    document.getElementById("divShow").innerHTML=strOut;
    }
      

  2.   

    2 楼 啊,
    我也不想这样写的,这样写实在太不好阅读了,但是我也没法子啊,如果改成你那样写的话,对象的方法就编历不出来啊。
    如果你有好的方法一定要提提哦。本来是这样编历的:
     var obj = window.document.body; //要编历的对象 <---在上例要变成用户输入的字符串了
    var strOut = null;
    for (var vin obj ) {
    if (obj [v] == null) {
    }
    else if (obj [v].constructor == window.Function){
    strOut += "函数名:" + "<br />"+ obj[v].toString() + "<br />";
    }
    else {
    }
    }
    $("#txtOut").val(strOut);这要求用户在<input id="txtObject" type="text" />输入的 字符串
    :比如“window” 要变成对象 window 
    即然我不会把字符串变成对象
    为了达成目标,我只好把相关的代码变成 字符串 
    用eval() 方法来重新解释 字符串 并执行了。
    你能理解吗?
      

  3.   

    下面是用2 楼的方法写的。
    不知我写的是不是合2数意思。
    编历时 不把用户输入的当作对象,而当作String ,所以就无法编历出来。
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test1.aspx.cs" Inherits="holdContent.test1" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title></title>
        <script src="Js/jquery-1.4.2.js" type="text/javascript"></script>
        <script src="Js/jquery-1.4.2-vsdoc.js" type="text/javascript"></script>
         <script type="text/javascript">
             $(function() {
                     $("#btnTest").click(function(){                 var obj;
                     eval('obj=document.getElementById("txtObject").value');
                     var strOut = "对象" + obj.toString() + "<hr/>";
                     try {
                      for (var v in obj) {
                      if (obj[v] != null && obj[v].constructor == window.Function) 
                      {
                      strOut += "函数名:" + "<br />" + obj[v].toString() + "<br />";
                      }
                      }
                      document.getElementById("divShow").innerHTML = strOut;
                     }
                     catch (ex) {
                      $("#divShow").html("你输入的对象不存在OR 此对象没有可调的方法:<br/>" + ex);
                     }
                    });      
             });
     </script>    
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <p>
    <font color="#a0a0a0">js 对象编历器:在下面输入JS对象,如 window,window.document,document.body,window.top等,只要对象存在就会编历出,</font>
    </p>
    请输入JS对象
    <br />
    <input id="txtObject" type="text" />
    <input id="btnTest" type="button" value="取得所有方法" />
    <div id="divShow">
    </div>
    </div>
    </form>
    </body>
    </html>
      

  4.   

    不明你要表达的意思,上面的例子我是有一大点不会写,所以才写成如此‘乱的’。
    那大点就是:
    如下例子吧,
    var b1 = ("window" == window)  // 可见b1==true;
    var b2 = ("window" === window)  // 可见b2==false;
    因为用户 输入的string--->< input id="txtObject"> 的value 中,
    我用var obj=document.getElementById("txtObject").value; //则obj 是string类型。
    如用户输入的是'window ' var obj=document.getElementById("txtObject").value;
    则相当于
    var obj='window ';
    而不是
    var obj=window ;你明白吗?
      

  5.   

    eval('obj=document.getElementById("txtObject").value');
    =>
    eval('obj='+document.getElementById("txtObject").value);
      

  6.   

    不知我的方法是否与楼主的想法一致?$("#btnTest").click(function(){                 var obj = window,                                   
                       arr = document.getElementById("txtObject").value.split('.'),
                       strOut = "对象" + arr.join() + "<hr/>";
                     for (var i = 0, j = arr.length; i < j; i++){
                      obj = obj[arr[i]];
                     }
                     
                     try {
                         for (var v in obj) {
                           try {
                            if (obj[v]  && obj[v].constructor == window.Function) {
                                  strOut += "函数名:" + "<br />" + obj[v].toString() + "<br />";
                              }
                           } catch(_e){
                            continue;
                           }                         
                         }
                         document.getElementById("divShow").innerHTML = strOut;
                     }
                     catch (ex) {
                         $("#divShow").html("你输入的对象不存在OR 此对象没有可调的方法:<br/>" + ex);
                     }
                    }); 
      

  7.   

    liangws 的方法非常,用的相当的妙啊。----同我上面的功能一样,但避免了eval();,可以肯定地说,没有精通JS,DOM 是写不出来的。
    这种方法以dom 的根对象开始 
    根对象就是window
    核心,如下所示。
    var doc = 'document'        //doc是string类型
    var doc = window[doc]      //此时doc是object类型liangws 非常值得称赞!!!
      

  8.   


    var obj = eval("("+document.getElementById("text").value+")");
    var str = "";
    for(var i in obj){
      if(obj[i] instanceof Function) str += "函数名:"+i + "\r\n";
    }
    document.getElementById("panel").innerHTML = "<pre>"+str+"</pre>";
      

  9.   

    -------------引用 16 楼 zyb134506 的回复-------------------
    var obj = eval("("+document.getElementById("text").value+")");
    var str = "";
    for(var i in obj){
      if(obj[i] instanceof Function) str += "函数名:"+i + "\r\n";
    }
    //
    //果然利害,写法够专业。
    //看来这贴学到了不少东西啊。
      

  10.   

    还有此法的跨浏览器 不好,只能用在 firefox 。
      

  11.   

    JS是弱类型 函数的参数就是arguments对象
    function a(){
       alert(arguments[0]);
       alert(arguments[1]);
       alert(arguments[2]);}
    a("123");
    a("123",123);
    a(true,"123",window);
      

  12.   

    你的意思是不是想:
    要我找出我要调用的函数。
    在函数体内用正则表达试来找 = arguments[*]
    然后想法子把 x 和 * 搞出来?
    之后作为用户输入时参数   参考。此法几大难点啊,
    其一: 我不知怎样找到一个函数体 定义的代码
    其二:正则表达式那块的过滤  我不太懂。----正则 是找 参数个数与及它对应的类型了。路过高手,不要跳过,帮帮忙。
      

  13.   

    使用for in 遍历有时会出问题的。特别是在键名命名不规范的情况下。
      

  14.   

    问一个疑点:我们编历函数时,
    得到:
    function hasChildNodes() {
        [native code]
    }
    为什么只能看到 [native code]
    而看不到他里面的代码?
      

  15.   

    $("#btnTest").click(function(){                 var obj = window,                                      
                          arr = document.getElementById("txtObject").value.split('.'),
                          strOut = "对象" + arr.join() + "<hr/>";
                     for (var i = 0, j = arr.length; i < j; i++){
                         obj = obj[arr[i]];
                     }
                     
                     try {
                         for (var v in obj) {
                              try {
                                  if (obj[v]  && obj[v].constructor == window.Function) {
                                     strOut += "函数名:" + "<br />" + obj[v].toString() + "<br />";
                                 }
                              } catch(_e){
                                  continue;
                              }                         
                         }
                         document.getElementById("divShow").innerHTML = strOut;
                     }
                     catch (ex) {
                         $("#divShow").html("你输入的对象不存在OR 此对象没有可调的方法:<br/>" + ex);
                     }
                    }); 
    这里如果输入window.document这样的,结果只是遍历出document的方法...
    for (var i = 0, j = arr.length; i < j; i++){
                         obj = obj[arr[i]];
                     }这里的花括号应该挪到下面的for循环后面
    不过我也学习了,哈哈
      

  16.   

    1、从头到尾讨论的对象都是dom对象
    2、native code是原生代码,基本上浏览器不会暴露
    3、ecmascript的一个特点就是函数的参数不是固定的,你遍历?咋遍历?
    4、楼主应该是玩C#和asp.net的。所以可能会对反射有兴趣,但是每个语言有每个语言的特点。何必强求呢最后嘛,http://www.baidu.com/s?wd=javascript+%B1%E9%C0%FA%BA%AF%CA%FD+site%3Atopic.csdn.net&rsv_bp=0&rsv_spt=3&inputT=22870
      

  17.   

    难道想策底搞明白JScript 的原理 就要这么难吗?
      

  18.   

    支招,支招!!
    如何快捷 学会JScript   and DOM 
     并且 可以 随心所意的玩转它?
    请求高手指个方向。   
      

  19.   

    ---------------------- 39 楼 liang200801 的回复:----------------------------
    实用不?
    -------------------------------------------------------------------------------
    现在,当然不是很实用,
    但 你是知道的。
    这些功能是代码写的,
    非常好移接。
    当然 可以直接 加到项目中。 你说能不实用吗?
      

  20.   

    ---------------引用 41 楼 cfantwt 的回复:]------------------------------
    纯粹为了接分
    ---------------------------------------------------------------------------

    sorry
     贴子已结了,没法给分了。
      

  21.   

    有兴趣者看看这里吧。Standard ECMA-262
    ECMAScript Language Specification
    汉化版嘛,自己搜索
      

  22.   

    楼主可以去看看 mootools ,会得到更多的启发。