Solo per ampliare la ragione per cui si riscontrano problemi qui, si consiglia di leggere un po 'di javascript Scope (Very Helpful Blog). In sostanza, si consideri il seguente codice:
<script>
var thisOne=true;
function thatOne() {
alert("whizbang");
}
var theOther={foo:"bar"};
//More code here...
</script>
Una volta raggiunto il commento, sai che puoi accedere a tali variabili e la funzione direttamente, come if (thisOne) {...}
, element.onclick=thatOne;
o console.log(theOther.foo)
. Tuttavia, è anche possibile accedervi come figli dell'oggetto root che, in un browser Web, è chiamato window
. Così si può fare:
console.log(window["thisOne"]);
window.thatOne.call(obj, params);
console.log(window.foo.bar);
così definendo open() come una funzione che non è all'interno di un altro elemento (vale a dire, è all'interno dell'elemento root), si sovrascrive la funzione window.open(). Quando si tenta di chiamare la funzione in seguito, si verificano problemi perché la funzione di apertura chiama window.open, che chiama window.open, che chiama window.open ...
Ci sono alcuni modi per aggirare questo -
definire la linea gestore onclick
a tale scopo, sbarazzarsi di tutta la <script>..</script>
elemento quindi, utilizzando a seconda di quale elemento si sceglie (che supporta) aggiungere l'attributo onclick:
onclick="window.open('hello.jsp','window','status=1,height=700, width=800');"
Questo è un metodo bello e veloce, e mantiene tutta la logica proprio lì con il suo elemento di attivazione, ma non è facilmente estendibile e potresti trovarti derisa da qualcuno.("Oh, si utilizza linea javascript? Come caratteristico")
cambio il nome del metodo
Questo avrà il minimo sforzo da voi in termini di ottenere la tua pagina di lavoro ora da quello che hai (è anche essenzialmente ciò che tutti gli altri hanno suggerito). Basta cambiare il nome del metodo aperto in qualcosa come openANewWindow() o gotoJSP() o qualsiasi cosa che non esiste già nell'oggetto root, assicurandosi di ottenere entrambi dove lo si definisce (nell'elemento script) e dove si usa (negli attributi onclick).
Utilizzare una chiusura
Questo è quasi sicuramente non ciò che si desidera in questo caso, la sua maggiore complessità del necessario per una singola funzione. Semplicemente includendo questo come esempio di come uscire dall'oggetto radice, vedere come essere in esso sembra essere il cuore del tuo problema.
Probabilmente hai già visto in javascript come definire un oggetto, ma potresti non sapere che definendo un oggetto, tutto ciò che stai facendo è aggiungere una proprietà dell'oggetto all'oggetto root. Puoi usare questo comportamento a tuo vantaggio, per dare una struttura gerarchica alle tue funzioni.
Ad esempio:
<script>
var MyFunctions = (function() {
function open(){
var x=window.open("hello.jsp","window","status=1,height=700, width=800");
x.focus();
}
return {open:open};
})();
</script>
questo modo si crea una funzione anonima che viene eseguito immediatamente. All'interno dello scopo di questa funzione, viene definita un'altra funzione, open(), tuttavia è definita nell'ambito di tale funzione anonima, non dell'oggetto root (finestra). Dopo che è stato definito open(), un riferimento ad esso viene restituito come valore della proprietà dell'oggetto: open.
Il risultato di tutto questo è che la proprietà open dell'oggetto MyFunctions è la funzione necessaria. Puoi quindi chiamarlo con MyFunctions.open() o anche window.MyFunctions.open().
Potrebbe voler rinominare la funzione open() come nello stesso scope di window.open() – Neps