【问题标题】:local copy of document.getElementsByTagNamedocument.getElementsByTagName 的本地副本
【发布时间】:2010-12-23 20:35:46
【问题描述】:

为什么下面的代码不起作用?

var f = document.getElementsByTagName;
var x = f('div');

Chrome 中出现“TypeError:非法调用”,Safari 中出现“TypeError:类型错误”。我在 Firefox 中没有收到错误,但它不起作用。我还没有费心在 IE 或 Opera 中进行测试。

【问题讨论】:

  • 一个后续问题应该是,为什么document.getElementsByTagName.call(document, 'div') 不能在 IE 中工作?
  • 哪个 IE?它在 IE8 中运行良好。
  • @Peter Hansen:IEtypeof document.getElementById 返回"object"

标签: javascript getelementsbyname


【解决方案1】:

原因是需要在对象上调用 getElementsByTagName。你可以说在函数定义中,它使用this 来确定要在哪个元素中查找标签。当你复制函数然后调用它时,它将被赋予一个新的范围,这意味着this没有指向不同的对象。要在文档上调用函数,试试这个:

var f = document.getElementsByTagName;
var x = f.call(document, "pre");
alert(x[0]);

【讨论】:

    【解决方案2】:

    因为在 javascript 中,方法从调用它们的对象中获取 this,并且调用存储在单独变量中的方法使 this 成为全局上下文(或 window,在浏览器中) .这应该工作:

    var f function ()
    {
        return document.getElementsByTagName.apply(
            document
          , arguments
        );
    }
    var x = f('div');
    

    【讨论】:

    • 您可以在没有apply 的情况下执行此操作,原因有两个:1. getElementsByTagName 仅接收 一个参数,2. 由于您在 document 上调用该函数对象的上下文将被隐式设置,没有理由用apply再次设置它。
    【解决方案3】:

    在 Javascript 中没有“绑定方法”之类的东西(借用 Python 中的术语,我希望你已经知道,或者解释可能需要更长的时间)。当您获取对“document.getElementsByTagName”的引用时,您只是获得了对函数的引用,而不是与文档对象关联的方法。当你调用它时,“this”被设置为窗口,而不是文档,所以它不起作用。

    从技术上讲,这样做会得到你想要的,但你可能会看到它毫无意义:

    var x = f.call(document, 'div')
    

    (这是没有意义的,因为它的可读性较差,并且不如调用 document.getElementsByTagName() 快。使用闭包同样没有意义。)

    【讨论】:

    • 非常有意义。谢谢。
    【解决方案4】:

    试试这个:

    function f(divName){
      return document.getElementById(divName);
    }
    
    var x = f('div');   
    

    您正在尝试通过使用括号来调用函数。问题是你的代码中的'f'是一个变量,而不是一个函数。

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多