JavaScript Позвоните и подайте заявку в Internet Explorer 8 (и 7) для window.print - PullRequest
4 голосов
/ 29 июля 2011

ОК, я много искал в Интернете, но не могу найти ответ.

Я могу ожидать различия между браузерами в 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

Мне нужно использовать call или applyтак как мне нужно передать контекст.Я пытаюсь создать класс, которому я могу передавать функции, и он может вызывать его с возможностью передачи контекста или аргументов.Не говорите мне использовать f() , который не является ответом , так как это не решает мою проблему. Вопрос на call и apply.

Ответы [ 3 ]

10 голосов
/ 29 июля 2011

Кажется, window.* функции являются отдельными типами, чем созданные пользователем функции в IE <9. Таким образом, они не получают ничего из <code>Function.prototype.*. Вы увидите, что

typeof alert === 'object'

function a(){}

typeof a === 'function'

Это произойдет для любой из функций window.*. Только для IE <9. WTG Miscrosoft. </p>

Однако вы можете попробовать

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

Посмотрите, работает ли это для вас.

2 голосов
/ 29 июля 2011
    function callIt(f) {
        if (f) f();
    }

    callIt(window.print);

Готово, нет?


Обновление

на просьбу автора ответить на вопрос, а не рекомендовать решение, которое работает, вот она:

Если вы посмотрите typeof (window.print) в IE, вы увидите, что он сообщает о себе как объект типа. Тип объекта не имеет применения или вызова метода. На мой взгляд, ваш дизайн не подходит для этой задачи. ОДНАКО, если вам нужна кроличья нора, вот вершина:

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

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

callIt(window.print);

Я понятия не имею, что произойдет в любом другом браузере или сколько процедурных исключений вы должны будете сделать, чтобы учесть это везде, где вам нужно.

1 голос
/ 29 июля 2011

Вы почти наверняка не должны использовать .call() здесь.f() вызовет метод, а f.call() вызовет его с неустановленным this.В es3 (но не в строгом es5) неопределенное значение для this будет приведено к window.Я подозреваю, что IE9 правильно обрабатывает это, в то время как IE8 этого не делает, но это только предположение, основанное на поведении.

Если print заботится о значении this, вы должны назвать его как window.print() впорядок для this будет установлен правильно.В этом случае вам может понадобиться обернуть его в анонимную функцию, чтобы print не «вырезалось» из окна.callIt(function() { window.print();});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...