【问题标题】:JavaScript Call and Apply in internet explorer 8 (and 7) for window.print在 Internet Explorer 8(和 7)中为 window.print 调用和应用 JavaScript
【发布时间】:2011-10-15 23:27:57
【问题描述】:

好的,我在网上找了很多,但找不到答案。

我可以预见浏览器之间的 CSS 差异,但 JavaScript 也存在差异?

那么为什么这在 IE8 中有效:

window.print(); // works

但是当我将window.print 传递给一个函数并调用它时,它在 IE8 中不起作用(在 IE9 中起作用):

function callIt(f){
    f.call();
};



callIt(window.print);

这是一个已知问题吗?


编辑

好的,它不起作用意味着它会简单地忽略它,没有javascript错误或任何东西。

对不起,它给出了这个错误:

   Object doesn't support this property or method

编辑 2

我需要使用callapply,因为我需要传递上下文。我正在尝试创建一个可以传递函数的类,并且可以通过传递上下文或参数来调用它。不要告诉我使用f() 这不是答案,因为它不能解决我的问题。 问题在于callapply

【问题讨论】:

  • 你看到了什么行为?错误控制台有错误吗?
  • 也许我误解了你,但是是的,javascript 有很多跨浏览器的差异。检查此线程:stackoverflow.com/questions/565641/… 或谷歌了解更多信息。这就是为什么像 jQuery 这样的 JS 框架如此受欢迎)
  • 它在 IE8 中给我一个 javascript 错误“对象不支持此属性或方法”
  • 没错!在我的实际代码中,它给了我,但使用它,它不是。
  • @Aliostad @XzKto 这不是 JavaScript 的区别。 ECMAScript 规范不涵盖宿主对象的行为(windowprint 是)。浏览器可以任意定义其宿主对象的行为——JavaScript(语言)与此无关。这是 IE 的对象模型的问题,不是 JavaScript 的问题。

标签: javascript printing window call apply


【解决方案1】:
    function callIt(f) {
        if (f) f();
    }

    callIt(window.print);

完成了,不是吗?


更新

根据发帖者的要求,我回答了这个问题,而不是推荐可行的解决方案,她说:

如果您在 IE 中查看 typeof(window.print),您会看到它报告自己为类型对象。类型对象没有应用或调用方法。在我看来,你的设计不适合这项任务。但是,如果您想要的是一个兔子洞,那么这里是顶部:

var p = window.print;
window.print = function() { p(); }

function callIt(f){
     f.call();
}

callIt(window.print);

我不知道在任何其他浏览器中会发生什么,也不知道您必须做出多少程序例外来解决您需要的任何地方。

【讨论】:

  • 没有。我需要使用.call 才能指定this
  • @Aliostad - 我想问题是,为什么必须使用 .call 调用打印方法?您可以将 window.print 包装在一个方法中,正如 Sean 在下面的帖子中所建议的那样 - callIt(function() { window.print(); });
  • 我已经更新了这个问题。如果可以请回答问题,问题很清楚:callapply 上的错误。
  • @Aliostad - 更新并回答,但我敦促您重新考虑您的方法。
  • 我试过了。在这种情况下,它什么也不做。没有错误。
【解决方案2】:

似乎window.* 函数与 IE Function.prototype.*。你会看到的

typeof alert === 'object'

function a(){}

typeof a === 'function'

任何window.* 函数都会发生这种情况。仅适用于 IE

你可以试试

Function.prototype.call.call(window.print)

看看这是否适合你。

【讨论】:

  • 你是绝对正确的。我在检查它们的类型时也注意到了这一点,typeof 正在打印对象并且没有构造函数。 这违反了 ECMAScript 标准。
  • window 其属性为“宿主对象”,允许宿主对象破坏规则。 (我不喜欢它,但现在就是这样。)
【解决方案3】:

您几乎可以肯定不应该在这里使用.call()f() 将调用该方法,而 f.call() 将在未设置 this 的情况下调用它。在 es3(但不是 es5 strict)下,this 的未定义值将被强制转换为 window。我怀疑 IE9 可以正确处理这个问题,而 IE8 没有,但这只是基于行为的猜测。

如果print 关心this 的值,则应将其称为window.print(),以便正确设置this。在这种情况下,您可能必须将其包装在一个匿名函数中,以便print 不会被“切掉”窗口。 callIt(function() { window.print();});

【讨论】:

  • You almost certainly should not be using .call() here. 为什么??
  • 我需要能够将上下文传递给它,尽管我没有这样做。
  • 如果你没有设置上下文,f.call() 不会做任何f() 不会做的事情。我被你的示例代码没有理由使用.call()这一事实所愚弄。
猜你喜欢
  • 2012-06-07
  • 1970-01-01
  • 2014-02-18
  • 2010-10-09
  • 2013-12-17
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多