2012-01-23 2 views
1

У меня есть функция JavaScript «print_something», которая реализована примерно в 300 страницах справки jsp. Я выяснил, что эта функция «print_something» должна быть исправлена. Итак, я ищу решение не менять 300 файлов.Javascript CallBack

У меня есть одна страница, на которой я открыть пользовательскую страницу справки:

window.open('SomeHelpPage101.htm', 'Help', 'location=no,status=no,height=500,width=600,resizable,scrollbars'); 

I судимое переопределить функцию следующим образом:

var jsObject = window.open('SomeHelpPage101.htm', 'Help', 'location=no,status=no,height=500,width=600,resizable,scrollbars'); 
jsObject.print_something() = function(){//corrected function} 

Это все хорошо работает в Firebug, если я делаю шаг за шагом. Но если я запустил код, то произойдет, что window.open (...) еще не закончен, потому что он асинхронный, поэтому мое переопределение не работает.

Как я могу заставить window.open (...) закончить сначала, а потом переопределить print_something() было бы успешно.

спасибо, что заранее.

+0

'jsObject.print_something() =' похоже, не прав. [Согласно MDN] (https://developer.mozilla.org/en/DOM/window.open), 'window.open' всегда будет * возвращать ссылку на новое окно, если все будет работать хорошо. –

+2

Вместо того, чтобы помещать одну и ту же функцию js в 300 файлов, вы должны переместить ее в автономный файл '.js', а затем просто включить этот файл на 300 страниц. –

+0

Я не знаю, можете ли вы это сделать, но если это возможно, это будет 'jsObject.print_something = function() {}'. У 'jsObject.print_something()' у вас есть вызов метода. – JMM

ответ

0

Я думаю, что это уже пройдена, так вот ссылка на него:

Set a callback function to a new window in javascript

+0

Я пробовал вот так: var RunCallbackFunction = function() {}; // только держатель ссылок \t \t \t \t функция custom_print() { alert ('parent function!'); self.focus(); self.print(); } \t \t \t \t \t вар helpPopup = window.open (CustomPage101.htm '); helpPopup.onload = function() {helpPopup.RunCallbackFunction = custom_print; }; Но когда я пытаюсь напечатать родительскую функцию, все еще не задано. Я что-то не так? – MerkoSMS

+0

Кажется, что вам не хватает 'в \t var helpPopup = window.open (CustomPage101.htm') сделать что-то вроде like (window.onload! = Null), чтобы вы не перезаписывали его. Я никогда не пробовал этого, но, возможно, сначала сохранил ссылку в переменной, а затем использовал функцию-оболочку, содержащую старую onload и вашу функцию обратного вызова. – user227353

+0

Я также попытался: var helpPopup = window.open (CustomPage101.htm '); helpPopup.onload = function() { helpPopup.custom_print = function() { alert ('parent function!'); helpPopup.focus(); helpPopup.print(); }; \t Но все еще не удалось ... – MerkoSMS

0

Спасибо вам, ребята, очень много за помощь и советы. :)

Решение было с функцией setInterval, где мы ждем и проверяем, инициализирован ли объект.

function Help() 
{ 
    // asynchronous object initialisation with "window.open" 
    var jsOBJ = window.open('HelpPage' + pageID + '.htm', 'Help', 'location=no,status=no,height=500,width=600,resizable,scrollbars'); 
    // check every 100 ms if "window.open" has finished and "jsOBJ.custom_print" has initialised 
    var helpTimer = setInterval(function() { 

     if(jsOBJ.custom_print) { 
      clearInterval(helpTimer); 
      // override function which is declared in child pages which we open with "window.open" 
      jsOBJ.custom_print = function() { 
       alert('Test call from redefined parent function.'); 
       jsOBJ.print(); 
      }; 
     } 
    }, 100); 
}